Ручное восстановление жесткого диска после форматирования
Нашей целью будет ручное восстановление всего отформатированного раздела без использования дополнительных носителей информации и дорогостоящих утилит от сторонних производителей. Все что для этого потребуется — это любой редактор диска (предпочтительнее всего, конечно же, NT Explorer от Runtime Software, но на крайний случай сойдут и бесплатные Disk Probe и Sector Inspector от Microsoft) в комбинации со встроенной утилитой chkdsk.
В процессе форматирования происходит необратимое разрушение большого количества ключевых структур данных, восстанавливать которые вручную было бы слишком затруднительно. К счастью, для извлечения особо ценных файлов этого и не требуется! Идея состоит в том, чтобы вернуть разделу потерянные файловые записи, а все остальные восстановительные операции поручить утилите chkdsk.
Дизассемблирование показывает, что единственной структурой данных, без которой не может работать chkdsk, является атрибут $DATA
файла $MFT
. А раз так, все, что требуется сделать, сводится к воссозданию прежнего файла $MFT:$DATA
и его размещению поверх старых файловых записей. В простейшем случае, если файл $MFT:$DATA
не фрагментирован, это достигается так называемым спекулятивным увеличением его длины. Как это сделать?
Запускаем NT Explorer, переходим в начало MFT (Goto|Mft), выделяем файл $MFT
, находим атрибут $DATA
(80h
) и увеличиваем поля Allocated size
, Real Size
и Compressed Size
на требуемую величину, параллельно с этим корректируя список отрезков (рис. 7.10). Поле Last VCN
трогать не нужно, так как оно будет исправлено утилитой chkdsk. Как определить длину нефрагментированного файла MFT? Она равна разнице номеров первого и последнего секторов, в начале которых присутствует сигнатура FILE
, умноженной на 512 байт (исключая сектора, принадлежащие $MFTMirr
). Известные мне дисковые редакторы не поддерживают поиска последнего вхождения, поэтому соответствующую утилиту приходится писать самостоятельно. К счастью, точную длину MFT определять совершенно необязательно, и вполне допустимо взять ее с запасом, так как лишнее все равно отсеет chkdsk. Действуйте по принципу — лучше перебрать, чем недобрать.
Рис. 7.10. Ручное восстановление MFT. Подчеркнуты поля, подлежащие изменению
Утилита NT Explorer не позволяет редактировать поля в естественном режиме отображения, заставляя нас переключаться в HEX-mode и искать смещения всех значений самостоятельно. Найти заголовок атрибута $DATA
очень просто — в его начале расположена последовательность 80 00 00 00 xx 00 00 00 01
. В NTFS версии 3.0 она находится по смещению F8h
от начала сектора. Поле Real size
во всех версиях NTFS располагается по смещению 30h
относительно заголовка, а поля Allocated Size
и Initialized Size
, соответственно, по смещениям 28h
и 38h
байт, причем значение Allocated Size
должно быть кратно размеру кластера. Убедитесь, что при переформатировании диска размер кластера не изменился, в противном случае у вас ничего не получится. Как восстановить исходный размер кластера? Да очень просто — набраться мужества и переформатировать восстанавливаемый диск с ключом /A:x
, где x
— размер кластера. А как его определить? Возьмем любой файл с известным содержимым и проанализируем его список отрезков. Запускаем контекстный поиск по всему диску, находим файл, запоминаем (записываем на бумажке) его стартовый сектор, после чего открываем закрепленную за ним файловую запись, декодируем список отрезков и вычисляем номер первого кластера. Делим номер сектора на номер кластера и получаем искомую величину.
Теперь необходимо сгенерировать новый список отрезков. В общем виде он будет выглядеть так: 13 XX XX XX YY 00
, где XX XX XX
— трехбайтное значение размера $MFT
в кластерах, a YY
— стартовый кластер. Стартовый кластер обязательно должен указывать на первый кластер MFT, в противном случае chkdsk не сможет работать. Если новый список отрезков длиннее нынешнего (скорее всего, именно так и будет), то необходимо скорректировать длину атрибутного заголовка (она расположена по смещению 04h
от его начала). Проделав эту нехитрую операцию, запустим chkdsk с ключом /F
и блаженно откинемся на спинку кресла, созерцая, как возрождаются наши милые папки и файлы. Единственное, что не восстанавливается — так это дескрипторы безопасности. Всем файлам и папкам будут назначены права доступа по умолчанию. Во всех остальных отношениях с отремонтированным таким образом диском вполне можно будет работать, не опасаясь, что он рухнет окончательно. Файлы, ссылающиеся на несуществующие каталоги, складываются в папку Found.xxx. Это — "долгожители", пережившие несколько циклов переформатирования, в буквальном смысле вытащенные из небытия.