Крису Касперски за его труды на эту тему и подробное описание теории и практики в книге «Восстановление данных. Практическое руководство», а заодно поблагодарить Валентина Холмогорова и Ксению Кирилову за обновление и переиздание книги в 2021 году.
Сегодня создано предостаточно программных решений для восстановления удаленных файлов с различных файловых систем. Однако, если перефразировать известное изречение, практика без теории мертва: чтобы максимально эффективно использовать инструменты, нужно понимать, как они работают. Если перед специалистом стоит задача не просто вернуть утраченные файлы, а разобраться в причинах инцидента, знания об устройстве файловых систем просто необходимы.
Теория
Подробно рассматривать структуру NTFS я не вижу смысла, описание можно найти в книге Криса «Восстановление данных. Практическое руководство» и статье «Файловая система NTFS извне и изнутри» (в двух частях). Однако, чтобы наши действия при восстановлении файлов были осмысленными, нам все же придется освежить в памяти некоторые ключевые особенности файловой системы NTFS 3.1, а заодно вспомнить, как хранятся и удаляются файлы.
warning
Не храни важные файлы на одном томе с операционной системой (обычно это диск С): на этом томе в NTFS чаще всего происходят изменения даже без прямого участия пользователя, что может повлиять на восстановление утраченной информации. Данные после удаления на этом дисковом разделе могут быть перезаписаны системными файлами.
В файловой системе NTFS работает принцип «все есть файл». Файл же имеет определенный набор атрибутов. Мы не будем разбирать все атрибуты файлов, затронем только самые важные: $STANDARD_INFO , $FILE_NAME , $DATA .
В атрибутах $STANDARD_INFO и $FILE_NAME записаны метки времени, подробнее о них мы поговорим позже, а в атрибуте $DATA хранится содержимое резидентного файла. В случае с нерезидентными файлами там располагаются «ссылки» на разбросанное по секторам содержимое файла, называемое data runs или отрезками. Отрезки представляют собой последовательность кластеров, которые хранят содержимое нерезидентного файла, а в качестве упомянутых «ссылок» в атрибуте $DATA используется номер начального кластера и количество идущих следом кластеров. Как видишь, математика простая: если файл нерезидентный (больше 720 байт), нам нужно найти кластер, с которого он начинается, и собрать все кластеры воедино в верном порядке, а после записать содержимое кластеров в новый файл.
Все файловые атрибуты хранятся в файловой записи (File Record) таблицы Master File Table ($mft ). Это наиважнейший служебный файл (оттого он имеет резервную копию $mftmirr ), так как содержит в себе информацию обо всех файлах и директориях на томе. Имея на руках только файл $mft , можно выстроить хронологию связанных с файлами событий, а в некоторых случаях — восстановить файлы.
Еще один важный служебный файл — карта свободного пространства $BitMap . С ее помощью отслеживаются все используемые и неиспользуемые кластеры, что, конечно же, напрямую связано с созданием и удалением файлов или директорий. Кластер же в NTFS — минимальная единица дискового пространства, доступного для размещения файлов и директорий в файловой системе NTFS. По умолчанию размер кластера равен 4096 Kбайт, но при создании тома можно задать иной размер.
Процесс удаления файла подробно описан в книге Криса, также информацию можно найти в статье «Разгребаем руины. Как восстановить удаленные файлы на разделах NTFS». Резидентные и нерезидентные файлы атрибуты
Некоторые материалы, посвященные файловой системе NTFS v3.1, упоминают о резидентных и нерезидентных файлах. Резидентными файлами считаются те, размер которых меньше или равен 720 байт (это количество байтов было получено исключительно опытным путем в NTFS v3.1 в Windows 10, хотя в других источниках читатель может найти иную информацию о максимальном размере резидентного файла: он варьируется от 700 байт до 1 Кбайт). Такие файлы хранят все содержимое в $mft (Master File Table), и в этом случае флаг нерезидентности (Non-resident flag) у них равен 00h . Для нерезидентных файлов (строго больше 720 байт) флаг Non-resident flag равен 01h .
На самом деле флаг резидентности присущ каждому атрибуту файла в отдельности (в том числе $FN , $SI и другим атрибутам), а не самому файлу как таковому. Несмотря на наличие такого флага у каждого атрибута, существуют исключительно резидентные атрибуты, которые хранят свои данные только в файле $mft (например, $FILE_NAME , $STANDARD_INFO , $VOLUME_NAME ). Есть атрибуты, которые могут быть как резидентными, так и нерезидентными (это справедливо по отношению к атрибутам $DATA , $EA и другим). Наконец, существуют файловые атрибуты, которые хранят свои данные исключительно за пределами $mft , то есть являются строго нерезидентными ($BITMAP , $REPARSE_POINT , $SECURITY_DESCRIPTOR и прочие). Время и атрибуты $STANDARD_INFO и $FILE_NAME
При создании файла на томе, перемещении между томами и практически любых манипуляциях с файлами (переименование, локальное перемещение, доступ внутри одного тома, изменение) у файла изменяются атрибуты $STANDARD_INFO (далее — $SI ) и $FILE_NAME (далее — $FN ). В них указано время, когда произошло действие с файлом.
В следующих таблицах показано, какие атрибуты файлов $SI и $FN меняются и при каких действиях с файлом. Изменение атрибута $FILE_NAMEИзменение атрибута $STANDARD_INFOЗдесь:
- Modification (изменение атрибутов
$Data и $INDEX );
- Accessed (обращение к содержимому файла);
- Change MFT (запись в таблицу MFT — не отображается в Windows);
- BornTime (или birthday of file — создание файла).
Важно, что при удалении через del или erase атрибуты $FILE_NAME и $STANDARD_INFO не изменяются.
Зная метки времени определенных файлов и правила изменения атрибутов, специалист по расследованию инцидентов способен выстроить верную хронологию событий. Время, в которое произошли те или иные действия с файлами, при проведении криминалистического расследования может стать одним из важнейших артефактов. Восстановление файлов, удаленных с использованием del или erase
Настало время приступить к практической части, чтобы закрепить теорию и поупражняться в восстановлении удаленных файлов. Но для начала следует выделить два способа удаления файлов в Windows:
- удаление c использованием системных утилит del (Shift-Del) или erase;
- удаление через корзину.
Такое разделение связано с разницей в механизме удаления и некотором отличии при восстановлении файлов.
warning
Никогда не восстанавливай удаленные файлы на тот же том, с которого они были удалены. Лучше всего использовать отдельный носитель.
В первую очередь разберемся с восстановлением нерезидентных файлов, а дальше посмотрим, как восстанавливать резидентные. Итак, практиковаться мы будем с использованием PowerShell-модуля PowerForensics авторства Джареда Эткинсона. Этот модуль прост в установке и содержит полезные командлеты для работы с файловыми системами NTFS и FAT. Он позволяет работать с системными файлами Windows и парсить атрибуты файлов NTFS, конвертировать метки времени из байтового представления в человеко‑читаемое (что необходимо в форензике). Подробнее узнать о возможностях модуля можно из его описания.
Для начала установим этот модуль (нужно запускать PowerShell от имени администратора, поскольку при чтении служебных файлов требуются привилегии локального администратора):
Import-Module PowerForensics
Проверим, что все прошло успешно, для этого выполним командлет
Get-Command - Module PowerForensics
Установка модуля PowerForensicsУстановка модуля завершена, теперь давай найдем все удаленные файлы на томе. В главной файловой таблице они имеют флаг удаления 00h по смещению 16 байт от начала файловой записи.
Как уже было сказано в теоретической части, в Windows постоянно происходят изменения, какие‑то файлы удаляются, а какие‑то, наоборот, создаются (например, начиная с Windows 8 количество файлов Prefetch ограничено 1024, поэтому старые удаляются системой, а новые создаются при запуске исполняемых файлов).
Для чистоты эксперимента создадим том F (запускаем diskmgmt.msc , затем сжимаем имеющийся том и отдаем для нового 5 Гбайт с дефолтным размером кластера 4096 Кбайт). Поместим туда файл (в роли подопытного будет выступать калькулятор, но читатель может использовать любой другой файл) calc.exe и удалим его через erase (то же самое будет при удалении через del или Shift-Del).
Теперь для поиска удаленного файла на томе F воспользуемся командлетом Get-ForensicsFileRecord и отфильтруем вывод по флагу True для атрибута Deleted : Получение удаленных файлов на томе F
Перейти обратно к новости
|