Содержание статьи
- Пакет FILE_DISPOSITION_INFORMATION
- Автоматическое восстановление удаленных файлов
- Ручное восстановление ошибочно удаленных файлов
- Восстанавливаем руины
- Восстановление разделов NTFS после форматирования
- Действия, выполняемые при форматировании
- Автоматическое восстановление диска после форматирования
- Ручное восстановление жесткого диска после форматирования
О книге
В 2006 году вышла в свет книга Криса Касперски «Восстановление данных. Практическое руководство», которая быстро стала бестселлером. В апреле 2021 года издательство «БХВ» выпустило второе, переработанное и дополненное издание этой книги, отрывком из которой и является эта статья.
В течение первых 30 дней продаж эту книгу можно купить со скидкой 30% в интернет‑магазине издательства по промокоду first30. Промокод нужно вводить на этапе оформления заказа.
Пакет FILE_DISPOSITION_INFORMATION
IRP_MJ_SET_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-tree).
Ни в том, ни в другом случае физического удаления файла не происходит, и он может быть легко восстановлен. Легкое и быстрое восстановление возможно до тех пор, пока не будет затерта файловая запись (FILE Record), принадлежащая этому файлу и хранящая его резидентное тело или список отрезков (run-list) нерезидентного содержимого. Утрата файловой записи крайне неприятна, поскольку в этом случае файл придется собирать по кластерам. При этом стоит заметить, что чем сильнее был фрагментирован удаленный файл, тем сложнее будет эта задача. К счастью, в отличие от FAT, NTFS не затирает первого символа имени файла, что значительно упрощает восстановление.
Автоматическое восстановление удаленных файлов
Утилиты, восстанавливающие удаленные файлы, не входят в стандартный комплект поставки Windows. Разумеется, это явный недостаток — вспомни, ведь в MS-DOS такая утилита была! Следовательно, эти средства приходится приобретать отдельно. Одна из автоматических утилит для восстановления удаленных файлов — GetDataBack. Опасаясь разрушить файловую систему окончательно, большинство таких утилит избегает прямой записи на диск. Вместо этого пользователю предлагается считать удаленный файл и переписать его в другое место, но только не на сам восстанавливаемый раздел. Не слишком‑то удачное решение. А если на остальных дисках свободного места нет, или если восстанавливаемый диск имеет всего лишь один логический раздел?
Предположим, нам необходимо восстановить базу данных объемом в несколько гигабайт. Можно, конечно, подключить второй винчестер, скопировать ее туда, а затем обратно. Однако подумай, сколько же это займет времени, не говоря уже о том, что сервер лучше не выключать, а "горячую" замену поддерживают далеко не все жесткие диски!
Другой недостаток подобных утилит — слишком медленная работа. Вместо того чтобы найти один‑единственный файл, имя которого нам известно, они проводят полномасштабные "маневры", сканируя весь раздел целиком. При работе с большими дисками на это уходит от одного до нескольких часов, причем это время фактически тратится впустую.
С другой стороны, утилиты, вносящие изменения непосредственно в структуру NTFS, рискуют серьезно повредить дисковый том, после чего ему не помогут даже профессионалы. Настоящие хакеры не доверяют никакому коду, кроме созданного лично ими, особенно, если исходные тексты недоступны, а документация туманна и двусмысленна. Различные версии NTFS отличаются друг от друга. Последние радикальные изменения произошли в Windows XP (NTFS версии 3.1) — массив последовательностей обновления (Update Sequence Number-n-Array) переместился на шесть байтов вперед, а его место было отдано под выравнивание и поле номера текущей файловой записи (Number of this MFT Record). С тех пор формат файловой системы не претерпел каких‑либо существенных архитектурных изменений.
Наконец, возможна и такая ситуация, когда утилит восстановления просто не окажется под рукой в тот момент, когда вам срочно потребуется восстановить какой‑нибудь ценный файл. Законов Мэрфи еще никто не отменял! В этом случае вам придется рассчитывать только на свои силы.
Ручное восстановление ошибочно удаленных файлов
Начнем с простейшего. Файл только что удален, и принадлежащая ему файловая запись еще не затерта. Как найти его на диске? Существует два способа — "теоретический" и "практический". Теоретический метод исключительно надежен, но требует дополнительных операций, выполнения которых можно избежать, приняв ряд практических допущений.
Теоретически грамотный и правильный подход состоит в следующем. Извлекаем из загрузочного сектора указатель на MFT, извлекаем из нее первую запись (она описывает $MFT
), находим атрибут $DATA
(80h
), декодируем список отрезков (data
) и последовательно читаем все записи в MFT, анализируя содержимое атрибута $FILE_NAME
(30h
) — имя файла. Обрати внимание, что таких атрибутов у файла может быть несколько. Этот же атрибут хранит ссылку на родительский каталог. Поэтому, если несколько одноименных файлов были удалены из различных каталогов, то необходимо выяснить, какой именно из них должен быть восстановлен.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»