Как извлечь размер любого файла, читая запись файла $MFT?
Мне нужно получить размер файла, прочитав MFT-запись этого конкретного файла. Пожалуйста, скажите мне смещение, где я могу найти размер файла и местоположение файла на диске.
2 ответа
Не существует фиксированного смещения, и файл в MFT может иметь несколько потоков данных (1 безымянный и несколько именованных). Вам нужно анализировать атрибуты после заголовка записи файла, пока вы не прочитаете атрибут DATA (тип атрибута 0x80).
Поток данных по умолчанию для файла, то есть содержимое, которое вы видите при открытии файла, происходит из безымянного потока данных. Другие приложения могут использовать именованные потоки данных, содержащиеся в файле.
Размер содержимого атрибута данных - это фактический размер файла. Имейте в виду, что атрибут данных может быть резидентным или нерезидентным. Это означает, что если содержимое файла составляет всего несколько байтов и вписывается в запись файла, оно будет резидентным, а содержимое будет сразу после заголовка атрибута. В противном случае, если содержимое не помещается в записи файла, соответствующее количество кластеров, которые могут содержать файл, атрибуты данных станут нерезидентными, и набор записей прогона данных будет описывать, где на диске находится содержимое файл есть.
Выделенный размер файла (все кластеры, необходимые для хранения всего файла) можно найти по смещению 0x x28 длиной 8 байт от начала атрибута данных (x80 x00 x00 x00) в записи $MFT для файл. Фактический размер файла расположен по смещению 0x x30 на длину 8 байт от начала атрибута данных в записи $MFT для файла.