Содержание статьи
info
Хочу отдать должное Крису Касперски за его труды на эту тему и подробное описание теории и практики в книге «Восстановление данных. Практическое руководство», а заодно поблагодарить Валентина Холмогорова и Ксению Кирилову за обновление и переиздание книги в 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
меняются и при каких действиях с файлом.
Здесь
- 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
Установка модуля завершена, теперь давай найдем все удаленные файлы на томе. В главной файловой таблице они имеют флаг удаления 00h
по смещению 16 байт от начала файловой записи.
Как уже было сказано в теоретической части, в Windows постоянно происходят изменения, какие‑то файлы удаляются, а какие‑то, наоборот, создаются (например, начиная с Windows 8 количество файлов Prefetch ограничено 1024, поэтому старые удаляются системой, а новые создаются при запуске исполняемых файлов).
Для чистоты эксперимента создадим том F (запускаем diskmgmt.
, затем сжимаем имеющийся том и отдаем для нового 5 Гбайт с дефолтным размером кластера 4096 Кбайт). Поместим туда файл (в роли подопытного будет выступать калькулятор, но читатель может использовать любой другой файл) calc.
и удалим его через erase (то же самое будет при удалении через del или Shift-Del).
Теперь для поиска удаленного файла на томе F
воспользуемся командлетом Get-ForensicsFileRecord
и отфильтруем вывод по флагу True
для атрибута Deleted
:
Get-ForensicFileRecord -VolumeName F: | Where-Object {$_.Deleted}
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»