Восстановление данных. Практическое руководство
Действия, выполняемые при форматировании
Форматирование диска — это сложная многоступенчатая операция, намного более сложная и намного более многоступенчатая, чем это может показаться на первый взгляд. Наверняка это мнение поддержит каждый программист, который писал в свое время нестандартные утилиты для форматирования дискет. Надо отметить, что в конце восьмидесятых — начале девяностых годов прошлого века такие утилиты писали практически все. Свои исследования мы начнем с изучения тома NTFS, непредумышленно переформатированного под NTFS. Техника восстановления томов NTFS, переформатированных под FAT16/32, будет рассмотрена отдельно.
При выполнении команды
в файловой системе дискаformat X: /U /FS:NTFS
происходят следующие изменения (форматирование диска утилитой GUI, вызываемой из контекстного меню "проводника", осуществляется по аналогичной схеме):X:
1. Формируется загрузочный сектор NTFS.
2. Генерируется новый серийный номер тома, который затем записывается в загрузочный сектор по смещению
байт от его начала.48h
3. Рассчитывается новая контрольная сумма загрузочного сектора, которая затем записывается по смещению
от его начала (более подробная информация была приведена в гл. 5).50h
4. Создается новый файл
, содержащий сведения обо всех файлах на диске. Как правило, он записывается поверх старого файла$MFT
. Исключения из этого правила бывают, но они крайне редки. Обычно они происходят, если прежний файл$MFT
был заблаговременно перемещен дефрагментатором, или если при переформатировании был назначен новый размер кластера. Во всех остальных случаях первые 24 файловых записи (FILE Record) погибают безвозвратно. Эти записи содержат непосредственно сам файл$MFT
,$MFT
, корневой каталог,$MFTMirr
— файл транзакций,/$LogFile
— карту свободного пространства,/$BITMAP
— дескрипторы безопасности, а также ряд других служебных файлов./$Secure
5. Инициализируется файл
— назначаются новая длина файла (инициализируются$MFT:$DATA
,$MFT:$30.AllocatedSize
,$MFT:$30.RealSize
,$MFT:$80.AllocatedSize
,$MFT:$80.RealSize
,$MFT:$80.CompressionSize
и$MFT:$80.InitializedSize
), дата и время создания и последней модификации (инициализируются$MFT:$80.LastVCN
,$MFT:$10.FileCreationTime
,$MFT:$10.FileAlertedTime
,$MFT:$10.FileReadTime
,$MFT:$30.FileCreationTime
,$MFT:$30.FileAlertedTime
и$MFT:$30.MFTChangeTime
) и, самое главное, создается новый список отрезков (data-runs), необратимо затирающий старый. Это значит, что собирать фрагментированный файл$MFT:$30.FileReadTime
нам придется по частям.$MFT
6. Создается новый файл
, отвечающий за занятость файловых записей в MFT. При этом все старые записи помечаются как свободные, однако их фактического удаления не происходит (поле/$MFT:$BITMAP
остается нетронутым), благодаря чему процедура восстановления заметно упрощается. Чаще всегоFileRecord.flags
располагается на том же самом месте, что и старый (т.е. между загрузочным сектором и MFT), забивая прежнее содержимое нулями, однако с помощью утилиты chkdsk его можно восстановить.$MFT:$BITMAP
7. Создается новый файл
, отвечающий за распределение дискового пространства (свободные и занятые кластеры). Этот файл также записывается поверх прежнего файла/$BITMAP
, который, тем не менее, может быть восстановлен с помощью chkdsk./$BITMAP
8. Создается новый файл журнала транзакций —
, структура которого подробно описана в документации LINUX-NTFS Project./$LogFile
9. В заголовок файловой записи
заносится новый LSN (LogFile Sequence Number).$MFT
10.
назначается новый номер последовательности обновления (Update Sequence Number).$MFT
11. Создается новое зеркало $MFTMirr, необратимо затирающее старое (в текущих версиях файловых систем оно расположено в середине раздела NTFS).
12. Создаются новые
,/$Volume
и другие служебные файлы, играющие сугубо вспомогательную роль и легко восстанавливаемые утилитой chkdsk. Следует отметить, что хотя/$AttrDef
и присутствует в зеркальной копии MFT, его ценность явно преувеличена./$Volume
13. Осуществляется проверка целостности поверхности диска, и все обнаруженные плохие кластеры заносятся в файл
./$BadClus
14. Формируется новый корневой каталог.
15. Если до форматирования тома на нем присутствовал файл
, то он обновляется, в противном случае новый файл/System Volume Information
создается только после перезагрузки./System Volume Information
На самом деле процесс форматирования протекает намного сложнее. Тем не менее, для восстановления данных с непреднамеренно переформатированных разделов приведенной здесь информации вполне достаточно. Углубленное обсуждение этих технических деталей требуется только программисту, разрабатывающему собственную нестандартную утилиту форматирования. Заинтересованные читатели могут самостоятельно дизассемблировать утилиту format.com (рекомендуется делать это с помощью IDA Pro).
СоветУтилита format.com содержит лишь высокоуровневую надстройку, опирающуюся на библиотеки ifsutil.dll, untfs.dll, и непосредственно на сам драйвер файловой системы. Так что дизассемблировать придется много. Чтобы упросить себе работу, можно пронаблюдать за процессом форматирования с помощью шпионских средств (рис. 7.6), например, утилит Марка Руссиновича Filemon.exe, Diskmon.exe, бесплатные копии которых можно скачать с сайта http://www.sysinternals.com. Кроме того, не забывайте о точках останова на основные функции native API, такие как
,NtFsControlFile
и т.д.NtDeviceIoControlFile
Рис. 7.6. Исследование процесса форматирования с помощью шпионских средств
Автоматическое восстановление диска после форматирования
Форматирование не уничтожает файловые записи пользовательских файлов, и они могут быть полностью восстановлены. Существует множество утилит для восстановления данных, например, R-Studio, EasyRecovery, GetDataBack, и т.д. Тем не менее, прямых наследников утилиты unformat среди них не наблюдается. Утилита unformat.exe восстанавливала весь том целиком, а все перечисленные выше современные средства всего лишь извлекают отдельные уцелевшие файлы и каталоги, переписывая их на новый носитель. Вот здесь мы сталкиваемся с рядом проблем. Во-первых, это выбор носителя, на который будут извлекаться восстанавливаемые данные. Запись на оптические накопители отпадает сразу же. так как количество носителей, потребное для сохранения содержимого жесткого диска объемом 80–120 Гбайт, неприемлемо велико. Кроме того, непосредственная запись CD-R/RW не всегда возможна, ведь при крахе системы восстанавливающие утилиты приходится загружать с CD-ROM, а в большинстве компьютеров установлен только один оптический привод. Наконец, ни одна из известных мне утилит автоматического восстановления данных не позволяет "разрезать" большие файлы на несколько маленьких. Если в вашем распоряжении есть локальная сеть, можно перегнать данные по ней. Еще один вариант — установка дополнительного жесткого диска (при условии наличия свободных каналов контроллера). Выбирая этот подход, следует иметь в виду, что, если корпус компьютера опечатан, то его вскрытие автоматически лишает вас гарантии. То есть вам в любом случае не обойтись без определенных финансовых затрат. Тем не менее, для извлечения пары сотен особо ценных файлов такая методика вполне подходит.