Ручное восстановление файла по FILERecord
Начнем с простейшего. Файл только что удален и принадлежащая ему FILE Record еще не затерта. Как найти его на диске? Существует два способа – "теоретический" и "практический". Теоретический исключительно надежен, но требует дополнительных телодвижений, которых можно избежать, приняв ряд практических допущений.
Теоретически: извлекаем из boot-сектора указатель на MFT, извлекаем из нее первую запись (она описывает $MFT), находим атрибут $DATA (80h), декодируем список отрезков (data runs) и последовательно читаем все записи в MFT, анализируя содержимое атрибута $FILE_NAME (30h) – имя файла (кстати, таких атрибутов у файла может быть несколько). Этот же атрибут хранит ссылку на материнскую директорию – если несколько одноименных файлов удалены из различных директорий, мы должны разобраться какой из них наш.
Практически: в девяти из десяти случаев $MFT файл не фрагментирован и располагается практически в самом начале диска. Имена файлов хранятся по смещению EAh от начала сектора, в начале которого расположена сигнатура "FILE*" ("FILE0" – в NTFS 3.1). Поэтому, мы просто запускаем любой дисковый редактор (например, Disk Probe из комплекта Support Tools от Microsoft), вводим имя восстанавливаемого файла в уникоде и говорим искать его по смещению EAh (в NTFS 3.1 – F0h) от начала сектора.
Когда же искомое вхождение будет найдено, смотрим: находится ли в начале сектора сигнатура "FILE*"/"FILE0" и если нет – продолжаем поиск. Двухбайтовое поле по смещению 16h от начала сектора содержит флаги записи: 00h – запись не используется или была удалена, 01h – запись используется и описывает каталог, 02h – запись используется и описывает директорию. Встречаются и другие значения (04h, 08h… что они обозначают – неизвестно. может быть, вы, читатель, сможете пролить свет на этот вопрос?).