То что NTFS — это надежно, известно каждому. Но это одна сторона вопроса. А файлы которые были удалены по ошибке — это совсем другое. Файловая система, даже такая мощная, как NTFS, бессильна защитить пользователя от самого себя. Замечательно, если удаленный файл сохраняется в корзине, но что делать, если его там нет? Что, если вы случайно удалили нужный файл и теперь в отчаянии кусаете себе локти? Главное не паниковать, но сейчас я расскажу, как с этим бороться и про Восстановление файлов в разделах NTFS.
FILE_DISPOSITION_INFORMATION
IRP_MJ_SET_INFORMATION / FILE_DISPOSITION_INFORMATION — это пакеты, которые отправляются драйверу при удалении файла (обратите внимание на это при дизассемблировании). Чтобы восстановить удаленные файлы, вам необходимо точно знать, что происходит, когда вы удаляете файл из раздела NTFS. Вот порядок действий, которые нужно выполнить.
- Корректируется файл
/
, каждый бит которого определяет «занятость» соответствующей файловой записи (FILE Record) в MFT (значение 0 говорит о том, что запись не используется).$MFT: $BITMAP - Корректируется файл
/
, каждый бит которого определяет «занятость» соответствующего кластера (значение 0 говорит о том, что кластер не используется).$BITMAP - Файловые записи, соответствующие файлу, помечаются как удаленные (поле
FLAG
, находящееся по смещению16h
от начала файловой записи, сбрасывается в нуль). - Ссылка на файл удаляется из двоичного дерева индексов. Технические подробности этого процесса здесь не рассматриваются, поскольку восстановить таблицу индексов вручную сможет только «гуру». Кроме того, в таком восстановлении нет необходимости. Ведь в NTFS индексы играют вспомогательную роль, и гораздо проще переиндексировать каталог заново, чем восстанавливать сбалансированное двоичное дерево (B-tree).
- Обновляется атрибут
$STANDART_INFORMATION
каталога, в котором хранится удаляемый файл (время последнего доступа и т. д.). - В файле
/
обновляется поле$LogFile Sequence
(изменения, происходящие в журнале транзакций, здесь не рассматриваются).Number - Поля
Update
следующих файловых записей увеличиваются на единицу: сам удаляемый файл, текущий каталог,Sequence Number $MFT
,/
,$MFT: $BITMAP /
,$BITMAP /
,$BOOT /
.$TRACKING. LOG
Каталоги удаляются аналогично файлам. Это неудивительно, поскольку с точки зрения файловой системы каталог также представляет собой файл особого типа, который содержит в себе двоичное индексное дерево (B-дерево).
При этом он не будет безвозвратно удален, а может быть легко восстановлен. Легкое и быстрое извлечение возможно в том случае, если запись файла (запись FILЕ), принадлежащая этому файлу и содержащая его резидентное тело или перечень выполнения, не перезаписывается. Потеря файловой записи очень неприятна, так как в этом варианте файл придется собирать в кластеры. Чем более фрагментирован удаленный файл, тем труднее задача. Но это еще не все – в отличие от FAT, NTS не перезаписывает первый символ имени файла, что существенно упрощает восстановление.
Автоматическое восстановление
Утилиты для восстановления удаленных файлов не входят в стандартный дистрибутив Windows. Конечно, это явный недостаток — помните, такая утилита была в MS-DOS! Поэтому эти средства нужно покупать отдельно. Одна из автоматических утилит для восстановления удаленных файлов — GetDataBack. Из-за боязни безвозвратного разрушения файловой системы большинство таких утилит избегают записи непосредственно на диск. Вместо этого пользователю предлагается считать удаленный файл и перезаписать его в другом месте, но не в самом разделе. Это не самое лучшее решение. Как быть в том случае, если на имеющихся дисках нет свободного места или на восстановленном диске только один логический раздел?
Допустим, нам нужно восстановить базу данных в несколько гигабайт. Вы, конечно, можете подключить второй жесткий диск, скопировать его и затем сделать резервную копию. Однако подумайте, сколько времени это займет, не говоря уже о том, что сервер лучше не выключать, так как не все жесткие диски поддерживают горячую замену!
Еще один недостаток этих утилит — они слишком медленные. Вместо того, чтобы найти один файл, имя которого мы знаем, они выполняют масштабные «маневры», сканируя весь раздел. С большими дисками это может занять от часа до нескольких часов, и на самом деле это время тратится впустую.
Утилита GetDataBack за восстановлением удаленных файлов
В то же время утилиты, которые вносят изменения непосредственно в структуру NTFS, могут серьезно повредить дисковый том, что может привести к серьезным последствиям. Настоящие хакеры не доверяют никакому другому коду, кроме своего собственного, особенно если исходный код недоступен, а документация расплывчата и неоднозначна. Различные версии NTFS отличаются друг от друга. Последнее кардинальное изменение произошло в Windows XP (NTFS версии 3.1): массив порядковых номеров обновлений-n-Array был перемещен вперед на шесть байтов, и его место заняло поле выравнивания и номера записи текущего файла (номер этого Запись MFT). С тех пор формат файловой системы не претерпел значительных архитектурных изменений.
Не исключено и то,что в случае необходимости восстановить какой-то важный файл, утилиты восстановления не будут доступны. В этом случае вам придется рассчитывать только на свои силы.
Ручное восстановление
Начнем с самого простого. Файл был только что удален, и его файловая запись еще не заменена. Как мне найти его на диске? Есть два пути — «теоретический» и «практический». Теоретический метод чрезвычайно надежен, но требует дополнительных операций, которых можно избежать, сделав ряд практических предположений.
Теоретически грамотный и правильный подход заключается в следующем. Мы извлекаем указатель на MFT из загрузочного сектора, извлекаем первую запись (описывает $ MFT), находим атрибут $ DATA (80h), декодируем список сегментов (запуск данных) и последовательно считываем все записи в MFT. , разбирая содержимое файла $ FILE_NAME (30h) — Имя файла. Обратите внимание, что у файла может быть несколько таких атрибутов. Этот атрибут также хранит ссылку на родительский каталог. Поэтому, если из разных директорий было удалено несколько файлов с одинаковым именем, нужно выяснить, какие из них нужно восстановить.
Здесь, как правило применяется практический подход к решению проблемы. В девяти из десяти случаев файл $ MFT не фрагментирован и располагается в самом начале диска. Имена файлов хранятся по смещению EAh от начала сектора, в начале которого находится подпись FILE0. Таким образом, вы можете просто запустить любой редактор диск, ввести восстановленное имя файла в коде UNICODE и указать редактировать его по смещению F0h с начала сектора.
Если строка поиска найдена, то необходимо убедиться, что подпись FILЕ0 находится в начале сектора. Для продолжения поисков необходимо продолжать искать подпись в начале сектора и в конце его. В двухбайтовом поле со смещением 16h от конца сектора содержится флаги записи: 00h — в данном случае запись не используется или была удалена; 01h — в данном случае запись используется, 02h — запись присутствует и описывает каталог. Кроме того, есть и другие значения — например 04h, 08h. Данные значения не зафиксированы.
Исправляем 00h на 01h, записываем изменения и … ничего не выходит ?! А что вы хотели! Наконец, необходимо предпринять еще несколько действий. Во-первых, вам нужно сообщить файлу / $ MFT: $ BITMAP, что эта запись MFT будет повторно использована. Во-вторых, вам нужно исключить номера кластеров, связанных с восстановленным файлом, из файла / $ BITMAP. Наконец, вам нужно будет перестроить двоичное индексное дерево, в котором будет храниться содержимое каталога.
Первые два пункта не представляют серьезной проблемы, но последнюю задачу придется исправить. Хотя это можно значительно упростить, просто запустив chkdsk с параметром / F. Утилита chkdsk самостоятельно найдет «потерянный» файл и внесет все необходимые изменения в файловую систему. Все, что вам нужно сделать, это установить флаг со смещением от 16h до единицы, а chkdsk сделает все остальное. После этих несложных манипуляций восстановленный файл окажется в своем домашнем каталоге.
В операционной системе Windows 10 утилиту chkdsk можно запустить с помощью командной строки (cmd-exe), либо из консоли PowerShell. Для запуска chkdsk требуется системные привилегии, поэтому консольная система должна запускаться от имени администратора. Если вы попытаетесь проверить системный раздел, в котором находится текущая версия операционной системы, программа не сможет проверить жесткий диск, поскольку том заблокирован. В этом случае вам будет предложено проверить это при следующем запуске Windows.
Более сложный случай
Теперь рассмотрим более сложный вариант – это ситуация с восстановлением записи файла, которая уже была перезаписана. Если удаленный файл был резидентным (он хранил свое тело в MFT), восстанавливать нечего. Даже если нерезидентный файл создается в месте, ранее занимаемом им (и набор файлов нерезидентного файла заканчивается там, где начинается резидентное тело), операционная система тщательно заполняет оставшийся «хвост» нулями и восстанавливает исходное содержимое, вы должны прибегнуть к дорогостоящему оборудованию, которое считывает поверхность жесткого диска на физическом уровне.
Не столь плачевна ситуация с нерезидентными файлами, хранящими свое тело вне MFT, хотя и здесь проблем хватает. Порядок, в котором файл помещается на диск, сохраняется в списке выполнения в записи файла в MFT. В этом случае, поскольку запись файла уже была перезаписана, возможен только контекстный поиск по содержимому. Запускаем редактор диска, вводим последовательность, которая явно содержится в удаленном файле, но не встречается во всех остальных, и даем редактору команду начать поиск. Чтобы ускорить поиск, вы можете искать только на свободном дисковом пространстве (за это отвечает файл / $ BITMAP).
Восстановление нефрагментированных файлов осуществляется элементарно.
Ни в коем случае не записывай файлы на сам восстанавливаемый том!
Единственная проблема — определение исходной длины. Некоторые типы файлов позволяют мусору оставаться в очереди. В этом случае вы можете следовать правилу, согласно которому перерегулирование лучше, чем недостижение. Однако это верно не для всех файлов! Если конец файла невозможно определить визуально (например, PDF-файлы заканчиваются подписью %% EOF), проанализируйте заголовок файла. Как правило, наряду с другой полезной информацией присутствует и размер файла. В этом случае все зависит от структуры конкретного файла и дать универсальные рекомендации невозможно.
В случае фрагментации файла, восстановление его будет затруднено. На самом деле эта задача почти безнадежная, поскольку для того, чтобы собрать разбросанные по файлу цепочки кластеров, необходимо хорошо знать его содержимое. В этом смысле NTFS восстанавливается намного хуже, чем FAT. Последовательность фрагментов файлов, хранящихся в FAT в виде одностороннего списка, очень цепкая. Если список не поврежден, все, что вам нужно сделать, это найти его первый элемент (и это легко сделать, поскольку он будет указывать на заголовок файла с довольно предсказуемым содержимым). Даже если список «разрезать» на несколько частей, они продолжат жить своей жизнью, и остается только найти комбинацию, в которой они должны быть склеены. Список умирает только при полной перезаписи FAT, что, честно говоря, случается нечасто.
Порядок фрагментов файлов в NTFS сохраняется маленькими списками секторов (крошечными фрагментами), и их смерть – обычное дело, после чего мы сталкивались с миллионом случайно разбросанных кластеров. Вы все еще можете работать с текстами, но что будет, если это электронный документ, график или архив? Невозможно восстановить такой файл без знания стратегии распределения места. Порядок, в котором драйвер файловой системы находит подходящие свободные фрагменты, заранее не определен. В этом случае многое зависит от множества факторов, но некоторые закономерности все же есть.
Изучив список сильно фрагментированных дисков, мне удалось установить следующие закономерности. Самые большие «дыры» заполняются от конца MFT до конца диска. Затем драйвер файловой системы возвращается и продолжает заполнять более мелкие дыры. А дальше процесс идет до тех пор, пока весь файл полностью не будет на диске. В последнюю очередь заполняются однокластерные «дыры».
Если мы посмотрим на отображение диска, представленное файлом / $ BITMAP, мы сможем восстановить точный порядок фрагментов удаленного файла, быстро собрав их вместе. Во всяком случае, теоретически такая возможность есть. Однако на практике на этом пути нас ждут коварные препятствия. Дело в том, что распределение свободного места могло радикально измениться с момента создания восстанавливаемого файла. Каждый процесс удаления файла обнаруживает одну или несколько «дыр», которые хаотично смешиваются с «дырами» восстановленного файла. Как можно устоять? Мы сканируем MFT на предмет записей, которые были помечены как удаленные, но еще не перезаписаны. Расшифровываем списки сегментов и удаляем соответствующие фрагменты из списка кандидатов на восстановление. Это значительно ограничивает диапазон поиска, хотя количество комбинаций, в которые можно собрать фрагментированный файл, все еще велико. Но это не самое главное.
Самое «интересное» начинается, если на диск одновременно записываются несколько файлов, или когда размер этого файла постепенно увеличивается (это происходит с записями Word во время набора текста), а остальные файлы сохраняются на диске в то же время. Когда маленький фрагмент данных добавляется к существующему тексту, файловая система находит самое маленькое место, затем следующее самое маленькое место, и так далее, пока самые маленькие отверстия не исчезнут. Когда это происходит, появляются большие «дыры». В результате файл сильно фрагментирован. Но кроме этого, в файле есть еще одна особенность – стратегия размещения изменяется на противоположную. В результате, маленькие фрагменты из одного файла смешиваются с маленькими фрагментами из других файлов.
Для восстановления документов, созданных в Microsoft Office, необходимо приложить больше усилий. Приложение создаёт большое количество резервированных копий редактируемого файла как в текущем каталоге, так и в каталоге %TEmp%. Не всегда можно понять какой фрагмент какому файлу принадлежит.
Из всех восстанавливаемых файлов проще всего восстанавливаются ZIP-архивы. Для этого вам даже не нужно запускать редактор диска. Откройте временный файл на запись, посмотрите количество свободного места на диске, закройте файл. Теперь обработайте его с помощью инструмента pkzipfix.exe (или воспользуйтесь инструментом восстановления ZIP). Все уцелевшие ZIP-архивы волшебным образом появятся в «отремонтированном» файле! Внутренняя структура ZIP-архива такова, что pkzipfix может легко распознавать даже переупорядоченные блоки, поэтому высокая степень фрагментации не является препятствием.
Восстановление после форматирования
Представьте себе худшее: вы потеряли весь раздел NTFS. Возможно, вы случайно отформатировали его или столкнулись с серьезным отказом диска. Где-то там миллиарды байтов ценных данных больше не доступны операционной системе. Как вернуть информацию к жизни? До сих пор мы имели дело только с небольшими сбоями дисков и незначительными повреждениями данных, такими как случайно удаленные файлы. Пришло время подумать о восстановлении после серьезного повреждения, когда предыдущее содержимое тома становится недоступным для операционной системы. Это может быть вызвано, например, непреднамеренным форматированием или повреждением основной файловой таблицы. Но не расстраивайтесь! NTFS выходит из-под любых изменений с минимальными потерями, и во всех таких случаях возможно полное восстановление данных, если вы правильно подойдете к делу.
Для начала, нужно просто сделать Форматирование. Для эксперимента нам потребуется утилита format.com, входящая в стандартный комплект поставки Windows, и дисковый раздел, не содержащий никакой ценной информации.
При всем при этом лучше всего проводить эксперименты с виртуальной машиной – VirtualBox или VmWare, эмулирующей жесткий диск и ускоряющей процесс формотирования в сотни раз.
Команда форматирования в Windows 10 работает с одной интересной функцией, которую вполне можно назвать ошибкой: она не позволяет форматировать том, если пользователь не указал его метку, что дает ошибку: «указана неверная метка диска». Чтобы исправить эту ошибку, сделайте следующее. Перейдите в командную строку на диске, который вы хотите отформатировать, и введите vol. В окне командной строки отображается информация об имени метки и серийном номере тома. Затем, набрав команду форматирования с именем диска, по запросу программы format.exe введите метку тома, полученную на предыдущем шаге. Если том в настоящее время используется, примите предложение операционной системы отключить его.
Лучше не трогатй «живой» винчестер, если ты не умеешь его восстанавливать.
Действия, выполняемые при форматировании
Форматирование диска — это сложная многоэтапная операция, гораздо более сложная и многоэтапная, чем может показаться на первый взгляд. Мы начнем наше исследование с изучения случайно переформатированного тома NTFS.
После выполнения команды format X:/U /FS://NTFS
в файловой системе диска X: происходит следующее изменение (форматирование диска утилитой GUI, вызываемой из контексного меню «проводника», осуществляется по аналогичной схеме):
- Формируется загрузочный сектор NTFS.
- Генерируется новый серийный номер тома, который затем записывается в загрузочный сектор по смещению 48h байтов от его начала.
- Рассчитывается новая контрольная сумма загрузочного сектора, которая затем записывается по смещению
50h
от его начала. Создается новый файл$MFT
, содержащий сведения обо всех файлах на диске. Как правило, он записывается поверх старого файла$MFT
. Исключения из этого правила бывают, но они крайне редки. Обычно они происходят, если прежний файл$MFT
был заблаговременно перемещен дефрагментатором, или если при переформатировании был назначен новый размер кластера. Во всех остальных случаях первые 24 файловых записи (FILE Record) погибают безвозвратно. Эти записи содержат непосредственно сам файл$MFT
,$MFTMirr
, корневой каталог,/
— файл транзакций,$LogFile /
— карту свободного пространства,$BITMAP /
— дескрипторы безопасности, а также ряд других служебных файлов.$Secure - Инициализируется файл
$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 $MFT:
) и, самое главное, создается новый список отрезков (data-runs), необратимо затирающий старый. Это значит, что собирать фрагментированный файл$30. FileReadTime $MFT
нам придется по частям. - Создается новый файл
/
, отвечающий за занятость файловых записей в MFT. При этом все старые записи помечаются как свободные, однако их фактического удаления не происходит (поле$MFT: $BITMAP FileRecord.
остается нетронутым), благодаря чему процедура восстановления заметно упрощается. Чаще всегоflags $MFT:
располагается на том же самом месте, что и старый (т. е. между загрузочным сектором и MFT), забивая прежнее содержимое нулями, однако с помощью утилиты$BITMAP chkdsk
его можно восстановить. - Создается новый файл
/
, отвечающий за распределение дискового пространства (свободные и занятые кластеры). Этот файл также записывается поверх прежнего файла$BITMAP /
, который, тем не менее, может быть восстановлен с помощью$BITMAP chkdsk
. - Создается новый файл журнала транзакций —
/
.$LogFile - B заголовок файловой записи
$MFT
заносится новый LSN (LogFile Sequence Number). $MFT
назначается новый номер последовательности обновления (Update Sequence Number).- Создается новое зеркало
$MFTMirr
, необратимо затирающее старое (в текущих версиях файловых систем оно расположено в середине раздела NTFS). - Создаются новые
/
,$Volume /
и другие служебные файлы, играющие сугубо вспомогательную роль и легко восстанавливаемые утилитой$AttrDef chkdsk
. Следует отметить, что хотя/
и присутствует в зеркальной копии MFT, его ценность явно преувеличена.$Volume - Осуществляется проверка целостности поверхности диска, и все обнаруженные «плохие» кластеры заносятся в файл
/
.$BadClus - Формируется новый корневой каталог.
- Если до форматирования тома на нем присутствовал файл
/
, то он обновляется, в противном случае новый файлSystem Volume Information /
создается только после перезагрузки.System Volume Information
В действительности процесс форматирования гораздо сложнее. Тем не менее представленной здесь информации достаточно для восстановления данных с случайно переформатированных разделов. Подробное обсуждение этих технических деталей требуется только программисту, разрабатывающему собственную утилиту для форматирования. Заинтересованные читатели могут самостоятельно разобрать утилиту format.com (рекомендуется делать это с помощью IDA Pro).
Утилита format.com содержит только надстройку высокого уровня, основанную на библиотеках fsutil.dll, untfs.dll и непосредственно на самом драйвере файловой системы. Так что разбирать придется много. Чтобы упростить себе работу, вы можете наблюдать за процессом форматирования с помощью «шпионских» инструментов, например, утилит Mark Russinovich Process Monitor (procmon.exe), Diskmon.exe, бесплатные копии которых можно скачать с https: / /docs.microsoft. com / en-us / sysinternals /. Кроме того, не забывайте о точках останова в основных собственных функциях API, таких как NtFsControlFile, NtDeviceIoControlFile и т. д.
Автоматическое восстановление диска
Форматирование не удаляет файловые записи пользовательских файлов и полностью восстанавливается. Существует множество утилит для восстановления данных, таких как R-Studio, EasyRecovery, GetDataBack и др. Однако прямых потомков утилиты unformat среди них нет. Утилита unformat.exe восстановила весь том, и все современные инструменты, упомянутые выше, извлекают только отдельные уцелевшие файлы и каталоги и перезаписывают их на новый носитель. Здесь мы столкнулись с рядом проблем.
И в первую очередь -это подбор носителей для восстановления данных. В момент записи на оптические приводы запись прекращается, поскольку количество носителей, необходимых для сохранения содержимого терабайтного жесткогого диска, слишком велико, а сама технология оптических дисков записи практически ушла в прошлое. Наконец, ни одна из известных мне утилит автоматического восстановления данных не позволяет «разрезать» большие файлы на несколько маленьких. Если в вашем распоряжении локальная сеть, вы можете получить в ней данные. Однако самый простой вариант — подключить внешний жесткий диск, карту памяти или флешку. Этот прием вполне подходит для извлечения пары сотен особо ценных файлов.
На примере утилиты R-Studios от R-Tools Technology мы покажем, как можно восстановить данные с поврежденных носителей. Это мощный, но простой в использовании инструмент, которому можно доверять. После запуска утилиты на экране появится окно панели «Диск», в котором перечислены все физические устройства и логические разделы. Найдите среди них то, что вы хотите восстановить, и, щелкнув правой кнопкой мыши, выберите опцию Проверить.
Программа предложит указать начальный сектор для исследования, который по умолчанию равен нулю. Этот показатель останется без изменений. Размер сканируемой области (поле Объем) по умолчанию увеличивается на весь раздел в целом. Этот факт гарантирует, что сканер найдет все файлы, которые сохранились в архиве, хотя сам поиск займет длительное время. Как ускорить этот процесс? А теперь возьмем ручку и посчитаем. И допустим на данный момент, что восстанавливаемый раздел содержит стотысяч файлов и имеет размер. Файловая запись в формате MFT имеет размер 1 КБ. Если же файл $ MFT не фрагментарен, достаточно просканировать только примерно 100 МБ от начала раздела. Если это значение (размер пространства, зарезервированного для MFT) не превышает 10% от общей емкости тома, а диск никогда не был заполнен более чем на 90%, то, скорее всего, так и есть.
В противном случае файл $ MFT будет фрагментирован и разбросан по всему диску. Но если ошибка будет допущена, то мы ничем не рискуем. Задаем значение N КБ, где N — это примерное количество файлов (каталоги также считаются файлами), и сканируем. При отсутствии одного или нескольких файлов, обратитесь к настройкам по умолчанию и повторитесь попытку сканирования еще раз (если количество имеющихся файлов заранее не известно, необходимо указать число, равное 10% емкости тома) Для того чтобы выбрать файловую систему NTFS, нужно в поле Файловая система выбрать файловую систему NTFTS (можно оставить настройки по умолчанию. Затем нажмите “Анализировать”, и начнется анализ.
R-Studio осуществляет поиск уцелевших файловых записей
Во время проведения сканирования будут найдены все оставшиеся файлы. При этом будет восстановлена структура каталога и корневой каталог. Подождите минуту! Почему? Но, как вы помните, при форматирвании корневой каталог был уничтожен и преобразовался! Ничего удивительного в этом нет. Файловая система NTFS в очередном раз показала свою живучесть: ее, скореевсего, можно уничтожить только динамитом. Отличие от FAT в том, что каталоги NTFS – это просто вспомогательная структура данных, которая индексируется для ускорения их отображения. Каждый файл, независимо от его источника, содержит ссылку на родительский каталоги, которые являются номерами записей в MFT. При этом запись в корневом каталоге всегда располагается по одному и тому же адресу!
Восстановленная структура каталогов
Удаленные наборы файлов могут относиться к каталогам, которые уже были уничтожены. R-Studio собирает их в папке $$$ FolderXXX, где XXX — порядковый номер каталога. Поэтому в большинстве случаев иерархия подкаталогов будет успешно восстановлена.
При помощи кнопки F5 или команды контекстного меню можно посмотреть виртуальное дерево найденных файлов. Выберите файл (или весь каталог с большим количеством вложенных подкаталогов), нажмите клавишу F2. По желанию вы можете просмотреть или отредактировать диск, выбрав его в контекстном меню и нажав на кнопку «Просмотр». Данный инструмент позволяет просматривать содержимое восстановленного файла со всеми его атрибтами, списками сегментов и другими данными. Вы можете восстановить все файлы за одну операцию, либо же выбрать восстановление по маске.
Ручное восстановление жесткого диска
Наша цель – вручную восстановить весь отформатированный диск без использования дополнительных носителей и платных сторонних утилит. Нужно только выбрать любой редактор диска (например, DiscExplorer от Runtimesoftware) и встроенную утилиту chkdsk.
Дизассемблирование показывает, что единственной структурой данных, без которой не может работать chkdsk
, является атрибут $DATA
файла $MFT
. А раз так, все, что требуется сделать, сводится к воссозданию прежнего файла $MFT:
и его размещению поверх старых файловых записей. В простейшем случае, если файл $MFT:
не фрагментирован, это достигается так называемым спекулятивным увеличением его длины. Как это сделать?
Запустите DiskExplorer, перейдите к началу MFT (Перейти к | Mft), выберите файл $ MFT, найдите атрибут $ DATA (80h) и увеличьте поля «Выделенный размер», «Фактический размер» и «Сжатый размер» на требуемую величину, одновременно регулируя список параллельных отрезков. Поле Last VCN трогать не нужно, оно будет исправлено утилитой chkdsk. Как определить длину нефрагментированного файла MFT? Он равен разнице между номерами первого и последнего секторов, в начале которых присутствует сигнатура ФАЙЛА, умноженной на 512 байтов (без учета секторов, принадлежащих $ MFTMirr). Известные мне редакторы дисков не поддерживают поиск по последнему вхождению, поэтому вам придется написать соответствующую утилиту самостоятельно. К счастью, совсем не обязательно определять точную длину MFT, и вполне допустимо брать ее с запасом, так как избыток всегда будет отфильтровывать chkdsk. Действуйте по принципу — лучше превзойти, чем терпеть.
Утилита DiskExplorer не позволяет изменять поля в режиме естественного отображения, вынуждая нас переключаться в режим HEX и самостоятельно искать смещения всех значений. Заголовок атрибута $ DATA найти очень легко — в начале идет последовательность 80 00 00 00 xx 00 00 00 01. Поле «Фактический размер» во всех версиях NTFS расположено по смещению 30h от заголовка, а поле «Выделено» Поля size и Initialized size со смещением 28h и 38h байтов соответственно, а Allocated size должны быть кратны размеру кластера. Убедитесь, что размер кластера не изменился при переформатировании диска, иначе произойдет сбой.
Каким образом можно восстановить изначальный объем ккластера? Просто возьмите и измените диск с ключом /A:x, в котором x — размер кластера. По каким признакам можно понять? Для того чтобы сделать это необходимо взять любой файл с известным содержанием и проанализировать его список сегментов. Запускаем контекстный поиск по всему диску, находим файл, запоминаем (отмечаем на листе бумаги) его начальный сектор, затем открываем запись присвоенного ему файла, декодируем список сегментов и вычисляем номер первого кластер. Для того, чтобы получить желаемое значение, необходимо разделить номер сектора на номер кластера .
Ручное восстановление MFT. Указаны поля ( подчеркнуты ) для изменения.
Теперь нам нужно создать новый список строк. В большинстве случаев это выглядит так: 13 XX XX XX YY 00, где XX XX XX — трехбайтовое значение размера $ MFT в кластерах, и YY — начальный кластер. Стартовый кластер должен указывать на первый кластер MFT, иначе chkdsk не сможет работать. А если новый список сегмента больше предыдущего (возможно, так и будет), то длину названия атрибута необходимо увеличить (он находится со смещением 04ht от его начала). После выполнения этой несложной операции нажмите клавишу / F, для запуска chkdsk. После этого можно наблюдать как восстнавливаются файлы и папки.
Дескрипторы безопасности не восстанавливаются. Для всех файлов и папок будет установлено разрешение по умолчанию. С отремонтированным таким образом диском можно будет продолжать работать, не боясь его полного разрушения. В папку Found.xxx добавляются файлы, содержащие ссылки на несуществующие каталоги. Это — «долгожители», которые прошли через несколько циклов переформатирования и вышли из небытия.
При восстановлении тома с сильно фрагментированной MFТ требуется больше усилий и времени. Последнее изменение списка отрезков при форматировании было уничтожено, а также повреждена зеркальная копия. Осталось только собрать все фрагменты своими руками. К счастью, на практике это оказывается совсем не сложно. По сравнению с другими файлами на диске, файл $ MFT содержит очень хорошую подпись FILE в конце каждой записи файла. Итак, для того чтобы получить желаемый результат, мы должны выполнить следующие операции. Выбирая фрагмент, который относится к MFT (от 1-го кластера до последнего), запишите начало и конец каждого из них. Затем из этой цепочки необходимо исключить файл $MFTMirr
. Его легко узнать, так как он расположен в середине раздела и содержит копии файловых записей $MFT
, $MFTMirr
, $LogFile
и $Volume
, причем $MFTMirr
ссылается на себя. В рассматриваемом примере наш список выглядит так: 08h
, 669h
, 1013
. В грубом приближении ему будет соответствовать следующий список отрезков: 2
Вывод
Какие последствия могут быть у нарушения порядка сборки файла MFT? В MFT все записи файлов ссылаются друг на друга по их порядковым номерам, которые являются индексами массива. Здесь они нужны чтобы восстановить структуру каталога и организовать жесткие ссылки (hard links) и некоторые другие структуры служб. Все ссылки на родительский каталог, которые были удалены из индекса, можно восстановить с помощью ссылок на родительский каталог. Все жесткие ссылки безвозвратно утеряны (если вы хотите восстановить их, то вам придется заново создать файл $ MFT). Они почти нигде не используются и совсем не используются; поэтому их потеря не так уж и значительна.
1 comments On Восстановление файлов в разделах NTFS
А что записывать в Raw data