В этой статье я хотел бы рассказать об алгоритмах работы с файловой системой NTFS, которые мы использовали при создании программы для восстановления данных Hetman Partition Recovery. Статья написана как продолжение предыдущего поста про FAT.
Под катом я опишу алгоритм поиска и восстановления удаленных файлов с NTFS раздела, который мы применили при разработке нашей программы. Лучше всего этот алгоритм описан в книге “Криминалистический анализ файловых систем” автора Брайана Кэрриэ.
Файловая система NTFS (New Technology File System) была разработанная компанией Microsoft для Windows NT. Главными целями, стоящими перед разработчиками NTFS, были надежность, безопасность и поддержка носителей информации большой емкости.
Пожалуй, одна из главных особенностей данной файловой системы – хранение всех служебных данных в файлах. Файлы с административными данными могут находиться в любом месте тома, как обычные файлы. Таким образом, в отличие от других файловых систем, NTFS не обладает жестко заданной структурой. Вся файловая система считается областью данных, и любой сектор может быть выделен файлу. При этом должно сохраняться условие, что первые секторы тома содержат загрузочный сектор и загрузочный код.
NTFS хранит всю информацию о файлах в главной файловой таблице MFT (Master File Table). Файлы небольшого размера могут храниться непосредственно в записи MFT. В противном случае для файлов выделяются кластеры, а запись MFT содержит список этих кластеров. Записи сами по себе очень просты. Их размер составляет 1 Кбайт, но только первые 42 байта имеют определенное предназначение. В остальных байтах хранятся атрибуты — небольшие структуры данных, выполняющие строго специализированную функцию. Например, один атрибут используется для хранения имени файла, а другой — для хранения его содержимого.
рис. 1. Основная структура записи MFT с заголовком и тремя атрибутами
Запись MFT содержит небольшой заголовок, а остальные байты предназначены для хранения различных атрибутов. Запись, показанная на рисунке, содержит три атрибута.
Следует отметить, что таблица MFT имеет резервную копию, которая может быть очень полезной при восстановлении данных.
Содержимое записи MFT
Размер каждой записи MFT определяется в загрузочном секторе, но во всех версиях Microsoft используются 1024-байтовые записи. Первые 42 байта содержат 12 полей, а остальные 982 байта не имеют фиксированной структуры и заполняются атрибутами. Говоря простым языком, запись MFT можно сравнить с большим сундуком для хранения вещей. Снаружи на сундуке написаны основные сведения о владельце — имя и адрес (аналог фиксированных полей записей MFT). В сундук можно положить любой предмет, размер которого меньше размера сундука. Записи MFT тоже не имеют фиксированной структуры и содержат атрибуты, в которых хранится конкретная информация.
В MFT используется последовательная 48-разрядная адресация записей, при этом первой записи присваивается адрес 0. Максимальный адрес MFT изменяется по мере расширения MFT и определяется делением размера $MFT на размер одной записи.
Каждая запись MFT также содержит 16-разрядный порядковый номер, автоматически увеличиваемый при создании записи. Давайте рассмотрим запись MFT 313 с порядковым номером 1. Файл, которому была выделена запись 313, удаляется, а запись повторно выделяется новому файлу. При этом записи присваивается новый порядковый номер 2. Адрес MFT объединяется с порядковым номером (занимающим старшие 16 бит) и формирует 64-разрядный базовый адрес файла.
рис. 2. Базовый адрес файла образуется в результате объединения адреса записи MFT и порядкового номера
NTFS использует базовый адрес для обращения к записям MFT, потому что порядковый номер упрощает выявление повреждений файловой системы. Например, если в процессе выделения структур данных для файла в системе произойдет сбой, нам на помощь придет порядковый номер. Благодаря ему можно будет определить, остался ли адрес записи MFT от предыдущего файла, или он является частью нового файла. Кроме того, порядковый номер можно использовать при восстановлении удаленного содержимого.
Как вы уже заметили, структура записей MFT минимальна, а большая их часть используется для хранения атрибутов — объектов, содержащих данные определенного типа. Количество разных атрибутов велико, и каждый из них обладает собственной внутренней структурой. Например, существуют атрибуты для имени файла, даты и времени, и даже содержимого файла. В этом NTFS снова отличилась. Как правило, файловые системы читают и записывают содержимое файлов, а NTFS читает и записывает атрибуты, одна из разновидностей которых инкапсулирует содержимое файлов.
Вернемся к нашей аналогии, в которой запись MFT сравнивалась с сундуком, а атрибуты — с маленькими коробками, которые кладут в сундук. Коробки могут иметь любую форму, которая лучше всего подходит для хранения объекта. Например, диски удобнее хранить в круглых коробках, а плакаты — в длинных тубусах.
рис. 3. Пример записи MFT с заголовками и областями содержимого
Хотя разнотипные атрибуты рассчитаны на разные типы данных, все атрибуты имеют две общие части: заголовок и содержимое. Заголовок универсален и стандартен для всех атрибутов. Содержимое зависит от типа атрибута и может иметь произвольный размер.
Восстановление файлов
Восстановить удаленный файл в NTFS проще, чем в большинстве файловых систем. Но у NTFS есть одна неприятная особенность. При удалении файла, его имя исключается из индекса родительского каталога, а его запись MFT и занимаемые им кластеры освобождаются. При исключении имени файла из индекса родительского каталога, индекс сортируется заново, и информация об имени может быть потеряна. В этом случае имя удаленного файла пропадает из исходного каталога.
Но не стоит опускать руки, т.к. этот недостаток отчасти компенсируется тем, что все записи MFT хранятся в одной таблице. Это существенно упрощает поиск всех свободных записей. Кроме того, каждая запись содержит атрибут с базовым адресом родительского каталога. А это означает, что при нахождении свободной записи, обычно, удается определить ее полный путь.
Чтобы восстановить все удаленные файлы в NTFS, необходимо провести в MFT поиск свободных записей. Обнаружив свободную запись, мы можем определить имя по атрибуту имени файла и адресу родительского каталога. Указатели на кластеры все еще продолжают существовать, и если данные еще не были перезаписаны, их удастся восстановить. Восстановление возможно даже при сильной фрагментации файла. Если значение атрибута было резидентным (т.е. для его хранения достаточно одной записи MFT), данные не будут перезаписаны вплоть до повторного выделения записи MFT. Если для хранения атрибутов файла требуется более одной записи MFT, то для полного восстановления нам могут потребоваться другие записи.
При восстановлении файлов или просмотре удаленного содержимого могут пригодиться данные журнала файловой системы или журнала изменений.
Журнал файловой системы позволяет операционной системе быстрее восстановить корректное состояние файловой системы. Повреждения файловых систем, обычно, происходят при системных сбоях во время записи данных в файловую систему. В журнале хранится информация обо всех предстоящих обновлениях метаданных, а также создаются записи об их успешном обновлении. В случае возникновения какой-либо ошибки, выполняемая операция может быть отменена, а система возвращена в предыдущее состояние. Следует отметить, что журнал не содержит нерезидентных данных, хранящихся во внешних кластерах, поэтому он не может использоваться для восстановления файлов. В нем хранится содержимое резидентных атрибутов для отмены недавних изменений.
Журнал изменений — это файл, в котором регистрируются все изменения в файлах и каталогах. Он может быть полезен для определения файлов, изменившихся за некоторый промежуток времени. Для выявления изменений, нам потребуется перебрать все файлы и каталоги в файловой системе и сравнить их временные штампы с пороговым значением. Эта процедура может занимать довольно много времени, но журналы изменений значительно упрощают ее.
В заключение подчеркну, что NTFS – очень сложная и мощная файловая система. Это объясняется тем, что она проектировалась не только с учетом актуальных потребностей, но и с заделом на будущее. Тем не менее, несмотря на всю ее сложность, восстановление данных в NTFS осуществляется проще, чем в большинстве других файловых систем.
Автор: cigulev