Глава 7. Файловая система NTFS
Содержание
- Глава 7. Файловая система NTFS
- Структуры на диске
- $Boot
- Индекс
- Массивы адресных привязок
- Время в NTFS
- Главная файловая таблица (MFT)
- Структура записи MFT
- Заголовок записи MFT
- Атрибуты просмотра
- $STANDARD_INFORMATION (0x10)
- $ATTRIBUTE_LIST (0x20)
- $FILENAME (0x30)
- $OBJECT_ID (0x40)
- $SECURITY_DESCRIPTOR (0x50)
- $VOLUME_NAME (0x60)
- $VOLUME_INFORMATION (0x70)
- $DATA (0x80)
- $INDEX_ROOT (0x90)
- $INDEX_ALLOCATION (0xA0)
- $BITMAP (0xB0)
- $REPARSE_POINT (0xC0)
- $EA_INFORMATION (0xD0) и $EA (0xE0)
- Анализ NTFS
- Расширенный анализ NTFS
- Выводы
- Упражнения
- Библиография
New Technology File System (NTFS) традиционно одна из наиболее "интересных" файловых систем с точки зрения расследования. Самая основная причина интереса к NTFS обусловлена тем, что она применяется в качестве файловой системы первичного устройства (то есть C:) во всех версиях Windows, начиная с Windows NT. Эта файловая система впервые была предложена в Windows NT 3.1 в 1993 и до наших дней всё ещё файловая система Windows по умолчанию.
Файловая система NTFS была ответвлением HPFS (High-Performance File System), файловой системы, которую Microsoft и IBM разрабатывали в партнёрстве. Следовательно, она разделяет большое число функциональных возможностей HPFS, включая значение идентификатора раздела MBR (0x07, в настоящее время также разделяемого с exFAT). Вплоть до предложения NTFS по умолчанию Windows имело место семейство файловых систем FAT. По мере роста в размерах дисков, семейство FAT предоставляло очевидные ограничения. Адресация кластеров имела лишь четыре байта (в действительности даже менее того). В NTFS адреса кластеров могут составлять до восьми байт, делая возможной адресацию большего числа кластеров, тем самым поддерживая диски большего объёма. Кроме того, NTFS была разработана чтобы гарантировать очень эффективными базовые операции (чтение/ запись файлов), что опять- таки способствует масштабировать файловые системы для систем большего размера.
Для своих дней NTFS была очень современной файловой системой. NTFS предоставляла поддержку таких функциональных возможностей (многие из которых всё ещё встречаются в файловых системах и в наши дни):
-
Каталоги на основе B- деревьев: Хранилище каталогов в NTFS, как и в большинстве современных файловых систем, основывается на B- деревьях. Эти структуры поддерживают сортировку данных, которая очень быстрая при поиске, однако к тому же допускает эффективные вставки и удаления.
-
Альтернативные потоки данных: Alternate data streams (ADS) это название, предоставляемое в NTFS ветвлениям. Ветвления допускают связывание с названием файла более одного потока данных. Обычно ADS не перечисляются Проводником Windows при просмотре содержимого каталога. Виден лишь первичный поток данных. Инструменты расследования предоставят альтернативный поток данных дополнительно к такому первичному потоку.
Функциональные возможности ADS изначально создавались для совместимости и ветвлением ресурсов Macintosh. Наиболее частое применение этого служит для выгружаемых файлов. Internet Explorer начал создавать Zone.Identifier ADS для всякого выгружаемого из интернета файла. Это предоставляло значение URL, с которого было выгружено данное содержимое. Что подразумевало, что прочее программное обеспечение уведомлялось о том, что данный файл получен через интернет и, возможно, ему нельзя доверять. С тех пор этому примеру последовали и другие браузеры. С точки зрения расследования, ADS может применяться для сокрытия сведений.
-
Журналирование: NTFS файловая система с ведением журнала. Этот журнал доступен через специальный системный файл ($LogFile). Журналы NTFS записывают изменения метаданных для всоей файловой системы. Применение ведения журналов превратило NTFS в более устойчивую файловую систему по сравнению с предыдущими.
-
Разряжённые файлы: Разряженный файл содержит множество пустых кластеров в своём файле. Большинство файловых систем будут хранить такие нулевые кластеры как часть общего содержимого файлов. NTFS, с другой стороны, в действительности не хранит на диске такие пустые области. Они записываются в структурах метаданных, а пространство может применяться для иных целей.
-
Сжатие: Сжатие в NTFS реализовано на уровне самой файловой системы. Папки (или файлы) могут помечаться как сжатые. Всякий перемещаемый в сжатую папку файл будет автоматически сжиматься. Сжатие достигалось при помощи алгоритма, основанного на алгоритме сжатия LZ77.
-
Шифрование: Определённые версии серверов Windows допускают шифрование файлов. Файлы шифруются при помощи ключа шифрования файлов, применяемого для симметричного шифрования. Такой симметричный ключ шифруется при помощи асимметричного шифрования с применением общедоступного ключа, хранимого в качестве альтернативного потока данных и частного ключа, доступного из подробностей пользователя зарегистрированного пользователя.
-
Списки контроля доступа: NTFS применяет дескрипторы безопасности для определения соответствующего владельца. Всякий дескриптор безопасности содержит два ACL (access control lists). Список разграничительного контроля доступа (DACL, discretionary access control list) определяет действия (чтения, запись и т.п.), которые допускаются/ запрещаются для каждого пользователя/ группы. Системный список контроля доступа (SACL, system access control list) определяет те виды деятельности, которые подлежат регистрации.
Остаток данной главы в первую очередь изучает структуры на диске NTFS (Раздел 7.1), прежде чем продолжить введением в методы базового анализа, применяемыми для файловой системы NTFS (Раздел 7.2). Этот раздел также показывает читателю как инструменты цифрового расследования восстанавливают файлы из файловых систем NTFS. Наконец, читатель будет ознакомлен с некоторыми расширенными понятиями при анализе NTFS (Раздел 7.3) такими как удаление файла, фрагментированные файлы, альтернативные потоки данных и большие записи MFT.
Файловая система NTFS состоит из ряда системных файлов, которые сведены воедино в Таблице 7.1. За единственным исключением местоположение этих файлов не определено. Они могут встречаться где угодно в своей файловой системе. Их местоположение задаётся главной файловой таблицей (MFT, Master File Table), которая отслеживает запись всех сведений о местоположении метаданных, содержимого. Единственным исключением выступает файл $Boot, который всегда находится в Секторе 0.
| MFT # | Название | Описание |
|---|---|---|
|
|
Это сама Главная файловая таблица (MFT, Master File Table), которая содержит запись для всех файлов из файловой системы NTFS. Это наиболее важная структура с точки зрения анализа расследования NTFS. |
|
|
MFT Mirror зеркалирует самый первый кластер самой MFT. |
|
|
Содержит журнал, который регистрирует изменения метаданных. В отношении предыдущих состояний данной файловой системы сведения могут быть восстановлены из $Logfile |
|
|
Содержит сведения тома, такие как его метку, идентификатор и версию. |
|
|
Содержит информацию об используемых в MFT атрибутах, таких как имена, идентификаторы и размеры. |
|
|
Содержит корневой каталог данной файловой системы. |
|
|
Данная струткура содержит значения состояний выделения (используется или нет) каждого кластера в этой файловой системе. |
|
|
Содержит сам загрузочный сектор и код запуска, часто носящий название Записи тома загрузки (VBR, Volume Boot Record). Это единственный файл с гарантированным положением, всегда находящимся в Секторе 0. $Boot применяется для определения местоположения самого первого кластера $MFT. |
|
|
Содержит перечень кластеров, содержащих сбойные секторы. |
|
|
Содержит сведения относительно безопасности и контроля доступа для файлов. |
|
|
Содержит версию Верхнего регистра для всех символов unicode |
|
|
Каталог, который содержит расширения файловой системы, которые не обладают зарезервированными номерами записей MFT. |
Файл метаданных $Boot это единственный файл файловой системы NTFS, для которого известно значение местоположения. Этот файл всегда занимает Сектор 0 на своём диске. Файл $Boot служит цели, идентичной для записи запуска тома в FAT/ exFAT, и в самом деле, файл $Boot часто именуют записью запуска тома (VBR, volume boot record) NTFS.
$Boot имеет в размере 512d байт (один сектор). Он содержит код самораскрутки и сведения относительно структуры своего тома. Таблица 7.2 предоставляет общую структуру $Boot. Файл $Boot это самый первый шаг для анализа всей файловой системы NTFS. С точки зрения цифрового расследования, наиболее важной стороной данной структуры является то, что она делает возможной определять местоположение $MFT. Из $MFT можно восстановить все файлы его файловой системы. $MFT к тому же предоставляет прочие жизненно важные для дальнейшего анализа сведения, например, значение размера кластера (комбинацию размера сектора и секторов в кластере), а также величину размера записи $MFT. Остаток самого первого сектора в файловой системе составлен самим кодом самостоятельного запуска.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Безусловный переход |
Инструкция Jump для доступа к коду самостоятельного запуска. |
|
|
OEM название |
Название первоначального производителя. Всегда "NTFS" |
|
|
Размер сектора |
Размер сектора в байтах. Обычно это 0x200 (512d) байт. |
|
|
Секторов/ Кластер |
Значение числа секторов в кластере. Это всегда степень двух. |
|
|
Зарезервировано |
Зарезервированные сектора. Должно быть нулём. |
|
|
Зарезервировано |
Нули. |
|
|
Не используется |
Не используется. |
|
|
Дескриптор носителя |
Тип носителя, на котором постоянно пребывает эта файловая система. Для стандартного жёсткого диска обычно это 0XF8. |
|
|
Зарезервировано |
Нули. |
|
|
Секторов/ Дорожка |
Значение числа секторов на физической дорожке. Это значение относится к старому формату адресации CHS. |
|
|
# Дорожек |
Значение числа дорожек на диске. Это значение относится к старому формату адресации CHS. |
|
|
Секторов/ Дорожка |
|
|
|
Скрытые секторы |
Неопределённое значение. |
|
|
Не используется |
Не используется. |
|
|
Не используется |
Не используется. |
|
|
# Секторов |
Общее число секторов устройства. |
|
|
Местоположение MFT |
Номер логического кластера для самого первого кластера в файле $MFT |
|
|
Местоположение MFTMirr |
Номер логического кластера для самого первого кластера в файле $MFTMirr |
|
|
Размер записи MFT |
Представленное в дополнительном коде число. Положительное число представляет размер записи MFT в байтах. В случае отрицательного числа, x, размер записи MFT определяется как 2|x| байт. |
|
|
Не используется |
Не используется. |
|
|
Секторов/ Индекс |
Число секторов в буфере индекса. |
|
|
Не используется |
Не используется. |
|
|
Серийный номер |
Серийный номер данного тома. |
|
|
Не используется |
Не используется. |
Индексы применяются для хранения групп атрибутов в упорядоченном виде. Одними из наиболее распространённых структур в NTFS являются каталоги. В этом случае в индексе хранится ряд атрибутов $FILENAME (Раздел 7.1.6). Для хранения индексов NTFS пользуется структурой B- дерева. B- дерево это древовидная структура с самостоятельной балансировкой и она часто встречается в современных файловых системах. B- деревья составляются из узлов, которые связываются иерархическим образом. Всякое B- дерево обладает верхним уровнем, головным узлом, который обладает двумя или более потомками (B-дерево с двумя потомками для каждого из узлов носит название двоичного дерева). Внутренние узлы обладают родителем и двумя или более потомками, в то время как узлы листьев имеют одного родителя и ноль потомков.
Структуры индексов (то есть B- деревья) предоставляют большое преимущество в производительности над линейными структурами хранения (такими как записи каталога FAT), ибо они намного быстрее при поиска. B- деревья делают возможными поиск, вставку и удаление за логарифмические порядки времени. Рассмотрим показанное на Рисунке 7.1 (это двоичное дерево, поскольку каждый сил обладает двумя потомками) и выполним поиск значения 7d.
Головной узел содержит значение 6d. Что меньше требуемого значения. Это означает, что, если оно присутствует в данном дереве, искомое значение 7d должно пребывать в потомке справа от головного узла. Рассмотрение этого узла отображает его значение 8d, что больше искомого. В результате это приводит к поиску в левом потомке. Этот узел и содержит требуемое значение. Сопоставим это с линейной структурой, такой как:
[6, 3, 8, 1, 4, 7, 10]
Для определения местоположения значения 7d это потребует шесть проверок в противоположность трём проверкам по B- дереву.
В противоположность показанному на Рисунке 7.1 дереве, в общем случае B- деревья могут содержать более одного единственного значения для каждого из узлов. Рисунок 7.2 предоставляет более точную интерпретацию B- дерева, применяемого для хранения имён файлов, в котором каждый узел обладает возможность хранения максимально до трёх значений.
Рисунок 7.2

Простая структура B- дерева с именами файлов в качестве значений. Подобное можно наблюдать во множестве файловых систем.
Хотя поиск и является чрезвычайно эффективной операцией, вставка и удаление порой требует структурной перестройки применяемой древовидной структуры. Такая перестройка иногда потребует перезаписи старых данных (то есть, например, удаления имён файлов).
Индексы хранятся в атрибутах $INDEX_ROOT и $INDEX_ALLOCATION (см. Раздел 7.1.6). В случае небольших индексов они будут применять постоянно присутствующий в памяти атрибут $INDEX_ROOT, в то время как большие индексы используют $INDEX_ALLOCATION, подкачиваемый атрибут. Каждый индекс состоит из заголовка и атрибута (например, для каталогов, $FILENAME). Обработка этих атрибутов (и всех индексов) отображается в этой главе позднее (Раздел 7.2.3).
Для увеличения надёжности NTFS применяет понятие массивов адресных привязок (fixup arrays, также носящих название массивов последовательностей обновлений, Update Sequence Array). Последние два байта в каждом секторе структуры метаданных (например, записи MFT) заменяются подписью. При доступе к этой структуре данная подпись может быть проверена для гарантии того, что все секторы составляют одну и ту же структуры метаданных. Рисунок 7.3 отображает некую структуру метаданных NTFS до и после применения значений адресных привязок.
На Рисунке 7.3, перед применением необходимых значений адресных привязок, мы видим, что заключительные два байта самого первого сектора равны 0x1234, а последние два байта второго сектора равны 0xCDEF. Позиции массива адресных привязок обнулены. Для применения необходимых значений адресных привязок должно произойти следующее:
-
Значение подписи увеличивается (оно превращается в 0x0001)
-
Самые последние два байта нашего первого сектора сохраняются в первой позиции массива адресных привязок
-
В самые последние два байта первого сектора записывается подпись (0x0001)
-
Для каждого из секторов в данной структуре повторяются шаги 2 и 3.
Рисунок 7.3

Первоначальная структура метаданных NTFS (вверху) и та же самая структура метаданных после применения значений адресной привязки (внизу).
Для интерпретации этих массивов адресных привязок необходимо сначала обработать сам массив адресных привязок. Отметим, что в данном случае запись MFT используется в качестве примера. Значение смещения массива определяется двумя байтами в 0x04 из заголовка $MFT, а длина массива адресной привязки задаётся в следующих двух байтах. Собственно Массив адресной привязки начинается с номера последовательности обновления (на Рисунке 7.3 это подпись, signature), а за ним следуют собственно реальные значения адресной привязки. Листинг 7.1 отображает выдержку из Записи MFT (обращаем внимание, что часть содержимого была удалена для целей более ясного представления).
Листинг 7.1. Запись MFT, демонстрирующая применение её массива адресных привязок.
010400: 4649 4c45 3000 000300 0000 0000 0000 0000 FILE0...........
010410: 0200 0100 3800 0100 b801 0000 0004 0000 ....8...........
010420: 0000 0000 0000 0000 0400 0000 4100 0000 ............A...
010430: 1d00 0000 0000 0000 1000 0000 4800 0000 ............H...
...[snip]...
0105f0: 0000 0000 0000 0000 0000 0000 0000 1d00 ................
010600: 0000 0000 0000 0000 0000 0000 0000 0000 ................
...[snip]...
0107f0: 0000 0000 0000 0000 0000 0000 0000 1d00 ................
0030020: 8100 0000 0000 0000 0000 0000 0000 0000 ................
0030030: 0000 0000 0200 0000 0008 0000 0000 0000 ................
В Листинге 7.1 мы наблюдаем, что наш Массив адресных привязок расположен по смещению 0x30 и содержит 0x03 элементов. Каждый элемент обладает размером в два байта. Сам по себе массив адресных привязок выделен. Первый элемент в этом массиве это подпись (0x1D00), в то время как остальные элементы это первоначальные значения, которые были заменены этой подписью. В самом конце каждого из секторов Записи MFT последние два байта были заменены значением этой подписи. Эти значения подписи указывают на то, что данные секторы из запроса связаны!
Поддерживающие NTFS инструменты расследования будут содержать возможность обработки подобных значений, замещая в процессе анализа встречающиеся подписи первоначальными значениями. Такой подход применим во многих файлах метаданных NTFS, а раз так, он важен для понимания. {Прим. пер.: его появление объясняется недостаточными вычислительными мощностями при появлении NTFS, см, например, Файловая система NTFS извне и изнутри Криса Касперски.}
Большая часть величин времени в NTFS хранится в виде 64-битных значений со знаком, исчисляя число 100 нс (10-7) промежутков начиная с 1 января 1601. Все эти величины времени сохраняются во временной зоне UTC+0. При встрече таких величин имеется ряд преобразователей, которыми можно воспользоваться для обработки таких значений. Листинг 7.2 отображает средство воспринимаемого человеком времени для конкретного Времени файла Windows: 0x1D7FED75319AEB1 (132854914796334769d).
Листинг 7.2. Применение date
для преобразования времени файла Windows (0x1D7FED75319AEB1) в воспринимаемый человеком формат.
$ date -ud @$(( (0x1D7FED75319AEB1 / 10000000) - 11644473600))
Sat 01 Jan 2022 06:17:59 UTC
Время эпохи Unix исчисляет число секунд начиная с 1 января 1970. Для преобразования величин времени файлов в воспринимаемый человеком формат
можно применять команду date. Команда
date работает с временными метками Unix, а потому время файла Windows
надлежит преобразовать во время Unix. Это процесс из двух шагов. Прежде всего величину времени Windows необходимо преобразовать из интервалов в
100нс в секунды. Это требует деления на 10 000 000d. Результат этого вычисления это число
секунд, исчисляемых с 1601. Второй шаг заключается в удалении числа секунд между 1601 и 1970, иными словами, сдвиг эпох. Это влечёт собой
вычитание величины 11 644 473 600d из нашего первого результата. Такой процесс
(включая команду date) отображён в листинге 7.2.
Главная файловая таблица (Master File Table, $MFT) это одна из самых важных структур в NTFS. $MFT содержит сведения относительно всех файлов и каталогов в своей файловой системе. Именно эта структура обрабатывается инструментами расследования когда они желают перечислить файлы файловой системы, восстановить метаданные, а также восстановить содержимое файла. Но $MFT содержит не только сведения относительно созданных пользователем файлов, она также всегда хранит записи для всех системных файлов NTFS (включая и саму $MFT!)
$MFT составляется из ряда записей MFT, по крайней мере по одной на файл. Собственно структура каждой записи отображена на Рисунке 7.4. Каждая запись начинается с заголовка записи, за которым следует некоторое число атрибутов. Атрибуты составляются компонентами заголовка и данных. Данные для некого атрибута могут быть резидентными (храниться в самой Записи MFT) или не резидентными (храниться где-то ещё в своей файловой системе). В случае нерезидентных данных их атрибут будет содержать указатель на местоположение оговариваемых нерезидентных данных. Обычно всякая запись MFT состоит из 1024d байт; тем не менее, в этом следует убедиться из $Boot.
С точки зрения расследования, обратите внимание на то, что в самом конце Записи MFT зачастую имеется не используемое пространство (зазор). Это предоставляет некий потенциал для частичного восстановления старых записей MFT. Атрибуты в NTFS включают в свой состав (обратите внимание, что идентификатор типа атрибута представлен в квадратных скобках):
-
$STANDARD_INFORMATION (0x10): Этот атрибут содержит связанные с файлом метаданные. Они включают в себя времена MACB, владельца, сведения безопасности и т.п.. Они жизненно важны для криминалистического восстановления метаданных.
-
$ATTRIBUTE_LIST (0x20): Применяются в том случае, когда файлу требуется несколько Записей MFT. Когда он имеется, он указывает на прочие местоположения в которых можно обнаружить остающиеся атрибуты.
-
$FILE_NAME (0x30): Содержит значение имени файла для файла/ каталога запроса. Обратите внимание, что в случае жёстких ссылок или длинных имён файлов, может иметься множество атрибутов $FILE_NAME. В данном атрибуте также присутствует временная метка.
-
$OBJECT_ID (0x40): Это уникальный идентификатор файла, который всегда отслеживает файл, даже когда имя изменено (или даже когда он перемещается между системами). Он присутствует в поздних версиях NTFS.
-
$SECURITY_DESCRIPTOR (0x50): Свойства безопасности/ списки контроля доступа данного файла.
-
$VOLUME_NAME (0x60): Содержит имя тома файловой системы и обычно находится только в записи 3 MFT ($VOLUME).
-
$VOLUME_INFORMATION (0x70): В данной структуре находятся сведения о версии файловой системы. Этот атрибут также пребывает только в записи 3 MFT ($VOLUME).
-
$DATA (0x80): Это ещё один жизненно важный для цифровой криминалистики атрибут, сообщающий нам как найти собственно содержимое файла! Как мы уже указывали ранее, он может быть как резидентным (для очень маленьких файлов) и в этом случае содержимое файла хранится в самой записи MFT, либо не резидентным, и в такой ситуации $DATA снабдит нас значением местоположения своего содержимого. По целому ряду причин, файлы в NTFS способны обладать множеством атрибутов $DATA. Одна из них состоит в возможности Альтернативных потоков данных (Alternate Data Streams, ADS), обособленной части независимых от реального содержимого файла данных.
-
$INDEX_ROOT (0x90): Именно он является узлом B- дерева, используемым в B- дереве. Он применяется для хранения файлов в каталогах.
-
$INDEX_ALLOCATION (0xA0): В ситуации, при которой для хранения сведений в структуре $INDEX_ROOT недостаточно места, для выделения дополнительных кластеров данной структуре применяется $INDEX_ALLOCATION.
-
$BITMAP (0xB0): Структура битовой маски, которая информирует о состоянии выделения кластера.
-
$REPARSE_POINT (0xC0): Это программные ссылки, указатели на иные файлы в данной MFT.
-
$EA_INFORMATION (0xD0): Применяется для реализации расширенных атрибутов OS2 с целью обратной совместимости (OS2 была созданной Microsoft и IBM в соавторстве операционной системой до 1992 и единолично IBM до 2001). {Прим. пер.: Полноценной заменой версиям OS/2 4.5 может рассматриваться Blue Lion от Arca Noae с названием ArcaOS, заключившей в ноябре 2015г соглашение с IBM на выпуск и продажу нового дистрибутива.}
-
$EA (0xE0): С целью обратной совместимости применяется для реализации расширенных атрибутов OS2.
-
$LOGGED_UTILITY_STREAM (0x100): Содержит ключи и сведения относительно атрибутов шифрования в текущих версиях NTFS.
Приведённые выше атрибуты будут более подробно рассмотрены позднее в данном разделе.
Рисунок 7.4 снабжает нас графическим представлением структуры записи MFT. Она состоит из заголовка записи MFT, за которым следует некое число атрибутов. Атрибуты составляются секциями заголовка и данных. Каждый атрибут может быть резидентным, и в этом случае данные хранятся в самой записи MFT, либо нерезидентным, когда его данные хранятся в ином местоположении этой файловой системы. Резидентные и нерезидентные атрибуты обладают независимыми заголовками.
Заголовок записи MFT
Структура заголовка записи MFT это структура из 42d байт в самом начале каждой записи MFT. Структура этого заголовка записи отображена в Таблице 7.3.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Подпись |
Значение подписи данной записи MFT (FILE). |
|
|
Смещение массива адресных привязок |
Значение смещения массива адресных привязок. |
|
|
Размер массива адресных привязок |
Число записей в массиве адресных привязок. |
|
|
LSN |
Номер последовательности $LOGFILE. |
|
|
Значение последовательности |
Количество применений данной записи MFT. |
|
|
Счётчик ссылок |
Число ссылок на этот файл. |
|
|
Флаги |
Флаги записи: 0x01 - запись используется; 0x02 Каталог. |
|
|
Размер записи (используемый) |
Реальный размер этой записи MFT в байтах. |
|
|
Размер записи (выделенный) |
Выделенный размер этой записи MFT в байтах. Обычно такой же как в структуре $Boot для размера записи MFT. |
|
|
Ссылка файла |
Ссылка файла на базовую запись. |
|
|
Идентификатор следующего атрибута |
Значение идентификатора для следующего атрибута в этой записи. Он на единицу больше чем текущее число атрибутов в этой записи. |
Каждый атрибут начинается с заголовка из 16 байт. Затем следуют сведения о том, где можно найти данные этого атрибута. Существует две возможности: данные либо резидентные, либо нерезидентные. Резидентные данные располагаются в самой реальной записи MFT, в то время как нерезидентные данные пребывают в ином местоположении данной файловой системы. Таблица 7.4. Предоставляет структуру заголовка атрибута.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Тип атрибута |
Значение идентификатора типа атрибута (для полного перечня атрибутов - с идентификаторами - обратитесь к Разделу 7.1.5). |
|
|
Размер атрибута |
Размер атрибута в байтах. |
|
|
Флаг не резидента |
Это флаг 0x01 когда атрибут нерезидентный и 0x00 для резидентных атрибутов. |
|
|
Длина имени |
Длина имени атрибута в байтах. |
|
|
Смещение имени |
Смещение имени атрибута в байтах. |
|
|
Флаги |
Относящиеся к данному атрибуту флаги. Некоторые из флагов это 0x0001 (сжатый); 0x4000 (зашифрован) and 0x8000 (разрежённый). |
|
|
Идентификатор атрибута |
Уникальный номер идентификатора для данного атрибута их этой записи MFT. |
За заголовком атрибута следует вторичный заголовок. Его структура зависит от того является ли данный атрибут резидентным, или нерезидентным.Структура заголовка резидентного атрибута отображена в Таблице 7.5, а заголовок нерезидентного атрибута представлен в Таблице 7.6.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Общий заголовок |
Это общий заголовок (см. Таблицу 7.4). |
|
|
Размер содержимого |
Значение размера содержимого атрибута в байтах. |
|
|
Смещение содержимого |
Значение смещения на начало атрибута в байтах. Данное смещение исчисляется относительно начала самого атрибута. |
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Общий заголовок |
Это общий заголовок (см. Таблицу 7.4). |
|
|
Начальный VCN |
Значение начального номера виртуального кластера (VCN, virtual cluster number) данного списка последовательности (иными словами, местоположение содержимого того файла, которое представляет этот рассматриваемый список). |
|
|
Конечный VCN |
Значение конечного VCN. |
|
|
Смещение списка последовательности |
Значение местоположения этого списка обхода относительно начала самого атрибута. |
|
|
Модуль сжатия |
Применяемый алгоритм сжатия. |
|
|
Не используется |
Не используется. |
|
|
Выделенный размер |
Величина выделенного размера содержимого данного атрибута. |
Заголовки резидентных атрибутов позволяют непосредственно размещать данные резидентного атрибута для их определения предоставляя смещение байт начала данных и размер данных в байтах. Нерезидентные атрибуты слегка сложнее в отношении определения положения реальных данных. Ключевым компонентом местоположения в нерезидентном атрибуте выступает список последовательности (runlist). Структура заголовка нерезидентного атрибута предоставляет значение смещения на этот список последовательности относительно начала данного атрибута (см. Таблицу 7.6). Список последовательности сам по себе это структура переменной длины (завершающаяся null). Как следует из самого названия, список последовательности составлен из одного или более прогонов. Каждый прогон предоставляет значение начального кластера и число кластеров, в которых могут располагаться данные.
Списки последовательности сами по себе состоят из трёх частей. Первая часть (один единственный байт) описывает всю структуру своего списка последовательности. Вторая часть снабжает значением числа кластеров в данном прогоне, а третья часть даёт значение начального кластера этого списка последовательности. Завершающие две части структуры списка последовательности имеют переменную длину. Значение самого первого байта информирует анализ о длине каждой из частей. Рассмотрим список последовательности 0x21112001, как это отображено на Рисунке 7.5.
Рисунок 7.5

Пример списка последовательности. Самый первый байт описывает ту структуру, которая следует за ним числом кластеров и начальным кластером.
Самый первый байт описывает свою структуру. Старший полубайт этого байта содержит количество применяемых в начальном кластере байт, тогда как младший полубайт содержит количество байт, используемых для хранения количества смежных кластеров в последовательности. Далее следует значение числа непрерывных кластеров в последовательности. Величина длины этого значения определяется младшим полубайтом в самом первом байте. А именно, на Рисунке 7.5 это 0x11 (17d). Наконец, найден начальный кластер. Длина этого значения определяется старшим полубайтом самого первого байта. На рисунке 7.5 значением начального кластера является 0x120 (288d).
Атрибуты просмотра
Обычно при операции над записью MFT необходимо обрабатывать все имеющиеся атрибуты. Вот тот метод, коим это осуществляется:
-
Обработать заголовок записи MFT (Таблица 7.3) и определить местоположение смещение для первого атрибута.
-
Обработать общий заголовок атрибута для 1 атрибута и найти длину этого атрибута. Выделите это содержимое (именно это и есть атрибут 1).
-
Повторите шаг 2 ( при помощи длины атрибута для перемещения к началу следующего атрибута). Этот процесс показан в Листинге 7.3 для образца записи MFT.
Листинг 7.3. Некая запись MFT, отображающая значение смещения для первого атрибута (0x38), а также значения типов атрибутов и длин помимо маркера конца записи.
010800: 4649 4c45 3000 0300 0000 0000 0000 0000 FILE0...........
010810: 0100 0100 3800 0100 a801 0000 0004 0000 ....8...........
010820: 0000 0000 0000 0000 0400 0000 4200 0000 ............B...
010830: 8b00 0000 0000 0000 1000 0000 4800 0000 ............H...
010840: 0000 0000 0000 0000 3000 0000 1800 0000 ........0.......
010850: 8ee3 3a81 bc0b da01 8e90 3b81 bc0b da01 ..:.......;.....
010860: 8e90 3b81 bc0b da01 8ee3 3a81 bc0b da01 ..;.......:.....
010870: 2000 0000 0000 0000 0000 0000 0000 0000 ...............
010880: 3000 0000 7000 0000 0000 0000 0000 0300 0...p...........
010890: 5400 0000 1800 0100 4100 0000 0000 0100 T.......A.......
0108a0: 8ee3 3a81 bc0b da01 8ee3 3a81 bc0b da01 ..:.......:.....
0108b0: 8ee3 3a81 bc0b da01 8ee3 3a81 bc0b da01 ..:.......:.....
0108c0: 0040 0400 0000 0000 0000 0000 0000 0000 .@..............
0108d0: 2000 0000 0000 0000 0900 6800 6900 6c00 .........h.i.l.
0108e0: 6c00 7300 2e00 6a00 7000 6700 1800 0000 l.s...j.p.g.....
0108f0: 5000 0000 6800 0000 0000 0000 0000 0100 P...h...........
010900: 5000 0000 1800 0000 0100 0480 1400 0000 P...............
010910: 2400 0000 0000 0000 3400 0000 0102 0000 $.......4.......
010920: 0000 0005 2000 0000 2002 0000 0102 0000 .... ... .......
010930: 0000 0005 2000 0000 2002 0000 0200 1c00 .... ... .......
010940: 0100 0000 0003 1400 ff01 1f00 0101 0000 ................
010950: 0000 0001 0000 0000 8000 0000 4800 0000 ............H...
010960: 0100 4000 0000 0200 0000 0000 0000 0000 ..@.............
010970: 4300 0000 0000 0000 4000 0000 0000 0000 C.......@.......
010980: 0040 0400 0000 0000 3d31 0400 0000 0000 .@......=1......
010990: 3d31 0400 0000 0000 2144 0042 0000 0000 =1......!D.B....
0109a0: ffff ffff 0000 0000 ffff ffff 0000 0000 ................
В Листинге 7.3 значение смещения первого атрибута задаётся как 0x38 байт. По этому смещению начинается заголовок атрибута для самого первого атрибута. Первые четыре байта этого заголовка определяет тип этого атрибута. В данном случае это 0x10 (что определяет атрибут $STANDARD_INFORMATION - см. Раздел 7.1.5). Следующие четыре байта содержат значение длины этого атрибута (0x48 байт). Переместившись далее на 0x48 байт обнаружим начало следующего атрибута. Данный процесс продолжается как это было описано. Результаты этого отображены в Таблице 7.7.
| Тип атрибута | Название атрибута | Длина |
|---|---|---|
|
$STANDARD_INFORMATION |
|
|
$FILENAME |
|
|
$SECURITY_DESCRIPTOR |
|
|
$DATA |
|
$STANDARD_INFORMATION (0x10)
Большинство метаданных NTFS хранится в атрибуте $STANDARD_INFORMATION. Их структура отображена в Таблице 7.8. Этот атрибут всегда резидентный. Раз так, его общий заголовок (Таблицу 7.4) за которым следует структура данного резидентного заголовка (Таблицу 7.5).
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Время создания |
Значение времени в которое был создан данный файл. |
|
|
Время изменения |
Значение времени в которое содержимое файла было изменено. |
|
|
Время изменения MFT |
Значение времени в которое произошло последнее изменение метаданных файла. |
|
|
Время доступа |
Значение времени в которое был осуществлён последний доступ к этому файлу. |
|
|
Флаги |
Здесь представлены сведения относительно файла, на который ссылается данная запись MFT. Значения флагов приведены в Таблице 7.9. |
|
|
Макс. # версий |
Значение максимального номера версий. |
|
|
Номер версии |
Номер текущей версии. |
|
|
Идентификатор класса |
Значение идентификатора класса. |
|
|
Идентификатор владельца |
Значение идентификатора владельца (не всегда присутствует). |
|
|
Идентификатор безопасности |
Значение идентификатора безопасности, соответствующего $SECURE (не SID Windows). |
|
|
Изменённая квота |
Изменение квоты. |
|
|
USN |
Обновление последовательного номера (Update Sequence Number, USN) (присутствует не всегда). |
| Значение | Описание | Значение | Описание |
|---|---|---|---|
|
Read-Only |
|
Sparse File |
|
Hidden |
|
Reparse Point |
|
System |
|
Compressed |
|
Archive |
|
Offline |
|
Device |
|
Content not indexed |
|
Normal |
|
Encrypted |
|
Temporary |
|
|
$STANDARD_INFORMATION содержит значения временных меток файла. NTFS записывает временные метки MACB изменения, доступа, изменения и порождения (создания). Эти значения являются 64 битными временными метками Windows, которые можно преобразовывать как это было показано в Разделе 7.1.4.
$ATTRIBUTE_LIST (0x20)
В ситуации, при которой атрибуты для записи MFT не будут помещаться в одну запись MFT, имеется атрибут $ATTRIBUTE_LIST, который предоставит местоположение прочих атрибутов. $ATTRIBUTE_LIST может быть резидентным или нерезидентным. Содержимое $ATTRIBUTE_LIST это перечень структур по 32d байт, за каждой из которых следует показанная в Таблице 5.10 структура. Раздел 7.1.5 предоставляет образец записи MFT с использованием $ATTRIBUTE_LIST.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Тип атрибута |
Идентификатор типа атрибута для конкретного атрибута. |
|
|
Длина элемента |
Размер этой структуры в байтах. |
|
|
Длина имени |
Размер имени в байтах. |
|
|
Смещение имени |
Значение смещения для имени атрибута. |
|
|
Начальный VCN |
Применяется если этот атрибут требует множества элементов MFT для описания своего содержимого. |
|
|
Макс. # версий |
Ссылка на файл, в котором находится этот атрибут. Самые первые четыре байта представляют номер этой записи MFT. |
|
|
Идентификатор атрибута |
Идентификатор атрибута. |
$FILENAME (0x30)
Как это и подразумевает их название, атрибуты $FILENAME хранят имена файлов для конкретных записей MFT. И файлы и каталоги обладают по крайней мере одним атрибутом $FILENAME. Помимо самого названия файла эти атрибуты также содержат времена MACB. Аналогично $STANDARD_INFORMATION эти временные метки являются объектами времени файла Windows (интервалы в 100 нс, исчисляемые с 1 января 1601 года). Структура $FILENAME представлена в Таблице 7.11.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Родительская MFT |
Ссылка на MFT файла родительского каталога. |
|
|
Время создания |
Время, в которое была создана эта MFT. |
|
|
Время модификации |
Время, в которое это содержимое было изменено. |
|
|
Время изменения |
Время, в которое это была изменена эта запись MFT. |
|
|
Время доступа |
Время последнего доступа к данному содержимому. |
|
|
Размер выделения |
Размер пространства, в байтах, выделенное на диске для хранения этого файла. |
|
|
Реальный размер |
Реальный размер файла в байтах. |
|
|
Флаги |
Флаги (те же самые что и для $STANDARD_INFORMATION - см. Таблицу 7.9). |
|
|
Reparse value |
Значение повторной обработки. |
|
|
Длина имени |
Число символов UTF-16 в названии ( |
|
|
Пространство имени |
Тип пространства имён. Допустимые значения: 0x00: POSIX - чувствительный к регистру unicode; 0x01: Win32 - не чувствительный к регистру unicode; 0x02: DOS - не чувствительный к регистру, без специальных символов, необходим формат 8.3; и 0x03: Win32/ DOS - исходное имя соответствует стандарту DOS и не нет необходимости в двух именах. |
|
|
Имя |
Реальное имя (кодированное в UTF-16). |
Интересный момент относительно атрибута $FILENAME состоит в том, что данный атрибут применяется для хранения размера файла. Для полного восстановления содержимого файла этот атрибут необходимо использовать наряду с атрибутом $DATA. $DATA предоставляет местоположение данных файла, в то время как $FILENAME обеспечивает значение реального размера файла. Кроме того, в отличии от прочих файловых систем NTFS содержит второй набор временных меток в отношении каждого файла в этом атрибуте $FILENAME. Эти временные метки относятся к самому имени файла и обычно обновляются при создании, перемещении, переименовании и т.п., а не тогда когда изменяется содержимое или осуществляется доступ к нему.
$OBJECT_ID (0x40)
Атрибут $OBJECT_ID (OID) применяется службой отслеживания распределённых ссылок в Windows, которая используется для определения
местоположения файла даже после его перемещения или переименования. $OBJECT_ID содержит универсальный уникальный идентификатор (Universally
Unique IDentifier, UUID) для каждого созданного в этой системе файла.Они проиндексированны в специальном системном файле
$Extend\$ObjID, что делает возможным определение местоположения файла
даже после переименования/ перемещения.
Атрибут $OBJECT_ID всегда резидентный с максимумом в размере 64d байт. Структура $OBJECT_ID отображена в Таблице 7.12. Многие современные реализации определяют в этой структуре лишь самое первое поле. Иными словами, теперь общепринято перечислять атрибуты $OBJECT_ID только состоящим из 16d байт OBJECT ID и больше ничем.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
OID UUID |
OBJECT ID для данного элемента в запросе. Это значение обязано быть уникальным для каждого элемента из данной файловой системы. Обратите внимание на то, что такое свойство уникальности должно также охватывать сетевую файловую систему, что подразумевает, что оно обязано покрывать более одного устройства. |
|
|
Birth VID |
UUID того тома, в котором первоначально был создан этот элемент. Он должен не изменяться на протяжении всего времени жизни этого объекта, даже при его перемещении в иную файловую систему. |
|
|
Birth OID |
Первоначальный OID этого элемента. Значение OID может изменяться при перемещении элемента в иную систему, однако данный OID порождения обязан всегда оставаться постоянным. |
|
|
Domain ID |
Значение UUID для того домена, в котором был создан этот элемент. Обычно он не применяется. |
Атрибут $OBJECT_ID создаётся в Windows как часть Службы отслеживания распределённых ссылок (Distributed Link Tracking Service). А раз так, его обычно нельзя обнаружить при созданных/ открытых файлах в прочих операционных системах. Данный атрибут образуется только при создании или открытии файла при помощи Windows. Большинство операций (перемещение или переименование) предохраняют это значение OID, однако копирование этого файла изменит его. Это обусловлено тем, что создание нового элемента из такой копии не может обладать тем же самым OID, что и его первоначальный элемент.
Значения OID вырабатываются следуя определённому шаблону. Рассмотрим показанный в Листинге 7.4 OID. Он составлен тремя компонентами. Первые восемь байт представляют значение времени, когда был создан данный элемент. Следующие два байта это некий счётчик, в то время как последние шесть байт выступают значением MAC адреса того компьютера, в котором был порождён данный элемент. Это можно применять как ссылку на файл в неком конкретном компьютере; тем не менее, данные сведения могут обманывать. Когда отсутствует MAC адрес, вместо этого применяется случайное число.
Листинг 7.4. Обнаруживаемый в атрибуте $OBJECT_ID некой записи MFT OID.
00e5a8: 47f8 44e4 3478 ec11 88c9 0800 2771 5e21
Значение применяемого в $OBJECT_ID времени не то же самое, что используется в остальной NTFS. В данном случае время это значение из 60d бит, которые исчисляют число 100d нс интервалов с 1 января 1582 года. Для преобразования значения 64d с прямым порядком байт из Листинга 7.4, первый шаг состоит в преобразовании к обратному порядку следования байт и отбрасыванию самого значимого полубайта (то есть верхних 4d бит). Согласно листингу 7.4 это будет иметь результатом 0x1EC7834E444F847. Следующий шаг состоит в вычитании числа 100d нс интервалов между 1582 и 1601 годами (началом традиционной NTFS). Это значение равно 0x146BF33E42C000, что в результате приводит к 0x1D80C4196023847. Это значение можно преобразовать при помощи показанного ранее метода. Его преобразование в воспринимаемый человеком формат даёт нам вторник, 18 января 2022 8:01:23 AM.
$SECURITY_DESCRIPTOR (0x50)
Атрибуты $SECURITY_DESCRIPTOR обычно встречаются только в файлах $SECURE вместо записей MFT. Этот атрибут может быть резидентным или нерезидентным. Структурно данные атрибуты состоят из заголовка в 0x14 байт, за которым следуют два ACL: один, SACL (Системный список контроля доступа), для целей аудита, а другой, DACL (Список разграничительного контроля доступа) для разрешений. Каждый ACL состоит из одной или более пар Элемента управления доступом (Access Control Entries, ACE) и SIDэ Данный этого атрибута завершаются двумя Идентификаторами безопасности (security identifiers, SID), представляющими значения владельца и группы. Структура заголовка атрибута $SECURITY_DESCRIPTOR показана в Таблице 7.13.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Revision |
Номер версии. |
|
|
Padding |
Байт заполнения (0x00). |
|
|
Control Flags |
Управляющие флаги. |
|
|
User SID Offset |
Смещение в байтах до User SID. |
|
|
Group SID Offset |
Смещение в байтах до Group SID. |
|
|
SACL Offset |
Смещение в байтах до SACL. |
|
|
DACL Offset |
Смещение в байтах до DACL. |
Все представленные в Таблице 7.13 смещения задаются относительно начала данных этого атрибута. Этот заголовок составлен из сведений о местоположениях Дескрипторов безопасности Пользователя и Группы (User и Group SID), а также значений смещений до Системного и Разграничительного ACL (SACL и DACL).
Значение SID уникально идентифицирует пользователя (или группу) в данной операционной системе Windows и могут применяться NTFS для отображения владельца файла. SID это структура переменной длины, которая показана в Таблице 7.14. Всякая SID представлена, как минимум, двумя компонентами (идентификаторами версии и полномочий), а также любым числом необязательных идентификаторов подчинённой авторизации. SID Windows записываются по определённому шаблону, к примеру, S-1-5-32-544 (это значение SID группы локальных администраторов Windows). Буква S просто обозначает следующее значение как некий SID. Далее следует уровень редакции (1), за которым следует идентификатор полномочий (5 - SECURITY_NT_AUTHORITY, некоторые распространённые ключи и значения полномочий можно найти в https://docs.microsoft.com/en-us/windows/win32/secauthz/well-known-sids), а также два значения подчинённой авторизации (32 и 544).
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Version |
Номер версии это самый первый компонент SID (и, как правило, это 1). Для целей представления данных перед номером версии добавляется S-. |
|
|
Sub-Auth Count (n) |
Число присутствующих в данном SID подчинённых полномочий. |
|
|
Authority ID |
Идентификатор полномочий, то есть, X это S-1-X.. |
|
|
SubAuthority[] |
Каждый элемент из четырёх байт в данном массиве добавляется в конец этого SID в том порядке, в котором они находятся в этих полях. |
Рассмотрим показанный в Листинге 7.5 SID. Чередующиеся поля подчёркнуты.
Листинг 7.5. Пример SID.
0000000: 0102 0000 0000 0005 2000 0000 0800 2771 5e212002 0000 ................
Получаемый в результате SID представляется как S-1-5-32-544. А именно, это версия 1d, состоящая из двух подчинённых полномочий. Основной идентификатор полномочий равен 5d, в то время как подчинённые полномочия это 32d и 544d. В случае нескольких подчинённых полномочий в SID, последней частью является относительный идентификатор (который должен быть уникальным в рассматриваемом домене), в то время как прочие подчинённые полномочия представляют этот домен. Каждый домен обязан обладать уникальным значением подчинённых полномочий.
Следующим компонентом $SECURITY_DESCRIPTOR является Список управления доступом (ACL). Структура ACL отображена в Таблице 7.15. Могут присутствовать два типа ACL, а именно: SACL и DACL. Значение DACL определяет пользователей/ группы и те действия, которые им дозволено осуществлять с данным элементом. С другой стороны, SACL определяет те предпринимаемые действия, которые обязаны регистрироваться в журнале событий Windows.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
ACL Revision |
Связанный с этим ACL номер версии. |
|
|
Padding |
Заполнение. |
|
|
ACL Size |
Размер применяемого ACL в байтах. |
|
|
ACE Count |
Число применяемых в этом ACL ACE. |
|
|
Padding |
Заполнение. |
Всякий ACL составлен из перечня Элементов управления доступом (Access Control Entries, ACE). Каждый ACE определяет те права доступа, которые должны быть разрешены/ запрещены (либо регистрироваться в случае когда ACE это SACL) для конкретного пользователя/ группы. Обратите внимание, что когда нет никакого DACL, система предоставит все права всем пользователям, но если имеется DACL, который не содержит никаких ACE, система запретит все права всем пользователям. Структура ACE показана в Таблице 7.16.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Тип |
Описывает предоставленные данным ACE полномочия. Допустимые значения содержат: 0x00 – Access Allowed - Доступ разрешён; 0x01 – Access Denied - Доступ запрещён; и 0x02 – System Audit - Аудит системы. |
|
|
Флаги |
Флаги ACE. |
|
|
Размер ACE |
Размер применяемого ACE в байтах. |
|
|
Маска доступа |
Маска доступа определяет допустимые типы доступа. |
|
|
SID |
Значение SID, к которому относится данный ACE. |
Маска доступа в ACE применяется для определения в точности допустимых прав доступа. Такая маска доступа это структура битовых полей, как это отображено на Рисунке 7.6. Значения конкретных для этого объекта прав доступа и стандартных прав доступа приведены, соответственно, в Таблицах 7.17 и 7.18.
| Бит | Значение |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Бит | Значение |
|---|---|
|
|
|
|
|
|
|
|
|
|
Побитовое поле маски доступа в сочетании с типом доступа и значением SID отражают какие действия разрешены/ запрещены для выполнения определённым пользователям.
$VOLUME_NAME (0x60)
$VOLUME_NAME обнаруживается только в записи MFT для файла $VOLUME ( запись MFT: 3d. Этот атрибут содержит значение метки тома, которая была назначена данному устройству во время создания. Листинг 7.6 показывает атрибут $VOLUME_NAME. Выделены значения заголовка атрибута, резидентный заголовок и данные.
Листинг 7.6. Образец атрибута $VOLUME_NAME.
000d68: 6000 0000 2800 0000 0000 1800 0000 0400 ‘...(...........
000d78: 0e00 0000 1800 0000 4e00 5400 4600 5300 ........N.T.F.S.
000d88: 2d00 4600 5300 0000 -.F.S...
0000000: 0102 0000 0000 0005 2000 0000 0800 2771 5e212002 0000 ................
Структура данных этого атрибута очень простая, это просто кодированная UTF-16 метка тома. Значения смещения этих данных и размера данных находятся в резидентном заголовке атрибута ($VOLUME_NAME всегда резидентный). В Листинге 7.6 значение смещения данных равно 0x18, а данные имеют размер 0x0E. Значение метки тома это "NTFS-FS".
$VOLUME_INFORMATION (0x70)
Аналогично $VOLUME_NAME, $VOLUME_INFORMATION это другой атрибут, который находится лишь в файле $VOLUME (запись MFT, 3). Листинг 7.7 показывает содержимое представителя атрибута $VOLUME_INFORMATION.
Листинг 7.7. Содержимое образца атрибута $VOLUME_INFORMATION в записи MFT $Volume.
000d90: 7000 0000 2800 0000 0000 1800 0000 0500 p...(...........
000da0: 0c00 0000 1800 0000 0000 0000 0000 0000 ................
000db0: 0301 0000 0000 0000 ........
И опять- таки, этот атрибут всегда резидентный и по размеру состоит из 0x28 байт. Значение резидентного заголовка выдаёт аналитику сведения, что данные начинаются по x18 и в длину имеют 0x0C байт. Данные интерпретируются при помощи Таблицы 7.19.
| Смещение | Размер | Название | Описание | Значение |
|---|---|---|---|---|
|
|
не используется |
Не применяется - обычно нули |
|
|
|
Главная версия FS |
Основной номер версии файловой системы |
|
|
|
Дополнительная версия FS |
Вспомогательный номер версии файловой системы |
|
|
|
Флаги |
Флаги тома (см. Таблицу 7.20) |
|
| Флаг | Описание |
|---|---|
|
Изменён (Dirty) |
|
Изменить размер $Logfile |
|
Обновить Volume в следующий раз |
|
Смонтирован в NT |
|
Удаление журнала изменений |
|
Идентификаторы объекта восстановления |
|
Изменён |
Сочетание основной/ вспомогательной версий $VOLUME_INFORMATION применяется для предоставления значения возраста файловой системы. Значение 1.2 обычно создаётся под Windows NT, 3.0 была создана под Windows 2000, в то время как 3.1 это нечто созданное со времени WindowsXP. Большинство встречающихся версий файловых систем NTFS обладают версией 3.1.
$DATA (0x80)
Атрибут $DATA применяется для обнаружения местоположения содержимого файла. Атрибуты $DATA могут быть как резидентными, так и не резидентными. Они не обладают никакой реальной структурой и целиком зависят собственно от содержимого файла. Этот атрибут в основном используется для определения местоположения содержимого. В случае когда первичный атрибут $DATA резидентный (к примеру, для чрезвычайно маленьких файлов), содержимое такого файла находится непосредственно в самой записи MFT, а следовательно, не занимает на диске никаких кластеров. Местоположение не резидентного $DATA определяется через находящиеся в заголовке не резидентного атрибута данные.
Одна запись MFT может содержать множество атрибутов $DATA. Обычно на них ссылаются как на альтернативные потоки данных и, как правило, они именуются атрибутами (например, упомянутым ранее ADS Zone.Identifier). В Разделе 7.3.4 представлена обработка такого ADS.
$INDEX_ROOT (0x90)
Для хранения записей каталога применяются структуры индекса NTFS и они организованы B- деревьями. Существует два вида атрибутов индекса, $INDEX_ROOT и $INDEX_ALLOCATION. В случае небольших структур индекса (к примеру, каталога лишь с небольшим числом файлов) все имеющиеся элементы перечисляются в резидентной структуре $INDEX_ROOT. В ситуации, когда объём данных слишком велик для резидентной структуры, вместо этого применяется не резидентная структура $INDEX_ALLOCATION.
Листинг 7.8 отображает пример атрибута $INDEX_ROOT. Такой атрибут $INDEX_ROOT всегда является атрибутом с названием , причём это название постоянно $I30. Данные такого атрибута составляются 16d байтами заголовка $INDEX_ROOT, за которым следуют заголовок узла, а далее последовательность записей каталога. Такие записи каталога, помимо всего прочего, содержат атрибут $FILENAME, предоставляющий сведения о каждом из файлов этого каталога.
Листинг 7.8. Атрибут $INDEX_ROOT из записи MFT с номером 65d
в NTFS_V1.E01.
014550: 9000 0000 2001 0000 0004 1800 0000 0200 .... ...........
014560: 0001 0000 2000 0000 2400 4900 3300 3000 .... ...$.I.3.0.
014570: 3000 0000 0100 0000 0010 0000 0100 00003000 0000 0100 0000 0010 0000 0100 0000 0...............
014580: 1000 0000 f000 0000 f000 0000 0000 0000 ................
014590: 4400 0000 0000 0100 6800 5600 0000 0000 D.......h.V.....
0145a0: 4100 0000 0000 0100 5af1 3490 bc0b da01 A.......Z.4.....
0145b0: 9d03 3590 bc0b da01 9d03 3590 bc0b da01 ..5.......5.....
0145c0: 5af1 3490 bc0b da01 4800 0000 0000 0000 Z.4.....H.......
0145d0: 4200 0000 0000 0000 2000 0000 0000 0000 B....... .......
0145e0: 0a00 6400 6500 6c00 6500 7400 6500 2e00 ..d.e.l.e.t.e...
0145f0: 7400 7800 7400 0000 4200 0000 0000 4b00 t.x.t...B.....K.
014600: 6800 5400 0000 0000 4100 0000 0000 0100 h.T.....A.......
014610: 8ee3 3a81 bc0b da01 8e90 3b81 bc0b da01 ..:.......;.....
014620: 8e90 3b81 bc0b da01 8ee3 3a81 bc0b da01 ..;.......:.....
014630: 0040 0400 0000 0000 3d31 0400 0000 0000 .@......=1......
014640: 2000 0000 0000 0000 0900 6800 6900 6c00 .........h.i.l.
014650: 6c00 7300 2e00 6a00 7000 6700 0000 0000 l.s...j.p.g.....
014660: 0000 0000 0000 0000 1000 0000 0200 0000 ................
Таблица 7.21 представляет структуру заголовка $INDEX_ROOT.Все включённые в эту таблицу значения взяты из Листинга 7.8. Одним из наиважнейших пунктов сведений, предоставляемых в данном заголовке, выступает значение типа атрибута в самом индексе. В таблице 7.21 значение типа атрибута равно 0x30, что является атрибутом $FILENAME. Как и ожидалось, атрибут $FILENAME содержит значение имён файла согласно перечисляемого содержимого каталога.
| Смещение | Размер | Название | Описание | Значение |
|---|---|---|---|---|
|
|
Тип |
Значение типа атрибута в индексе |
|
|
|
Правило сортировки |
Надлежащие к применению правило сортировки |
|
|
|
Размер записи |
Размер каждой записи индекса в байтах |
|
|
|
Размер записи |
Размер каждой записи индекса в кластерах |
|
|
|
не используется |
|
|
Заголовок $INDEX_ROOT следует непосредственно за заголовком узла. Эта структура позволяет определять местоположение записей индекса. Структура заголовка узла представлена в Таблице 7.22. Отображаемые в Таблице 7.22 значения взяты из Листинга 7.8.
| Смещение | Размер | Название | Описание | Значение |
|---|---|---|---|---|
|
|
Смещение списка индексов |
Смещение в байтах до начала Списка записей индекса (относительно начала самого заголовка узла) |
|
|
|
Смещение конца индексов |
Смещение в байтах до окончания Списка записей индекса (относительно начала самого заголовка узла) |
|
|
|
Смещение буфера индексов |
Смещение в байтах до конца выделенного буфера Списка записей индекса (относительно начала самого заголовка узла) |
|
|
|
Флаги |
|
|
|
|
не используется |
|
|
Заголовок узла делает возможным определение местоположения самой первой записи в индексе (0x10). Значение смещения в байтах предоставляется
относительно начала самого заголовка узла. Значение типа из заголовка $INDEX_ROOT определяет присутствующий тип записи. В нашем случае это атрибуты
$FILENAME . Беглый взгляд на Листинг 7.8 показывает, что имеются два файла, delete.txt
и hills.jpg.
$INDEX_ALLOCATION (0xA0)
Когда число записей в неком индексе достаточно велико для резидентной структуры $INDEX_ROOT, вместо неё применяется не резидентная структура $INDEX_ALLOCATION. В ситуации, когда помимо атрибута $INDEX_ALLOCATION всё ещё имеется атрибут $INDEX_ROOT, состояние выделения записей индекса организует атрибут $BITMAP.
Всякий атрибут $INDEX_ALLOCATION содержит записи индекса с фиксированной длиной, причём каждая из них содержит единственный узел дерева. Величина размера каждой записи индекса определяется в соответствующей структуре $INDEX_ROOT.
Каждая запись составлена из заголовка записи индекса, за которым следует заголовок узла и далее перечень записей. Заголовок узла в точности соответствует той же структуре, сто и атрибут $INDEX_ROOT (Таблица 7.22). Структура заголовка записи индекса задаётся в Таблице 7.23.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Подпись |
Подпись заголовка записи индекса (INDX). |
|
|
Смещение адресных привязок |
Значение смещения до массива адресных привязок |
|
|
Размер адресных привязок |
Число записей в массиве адресных привязок |
|
|
LSN |
Номер Log File Sequence (последовательность системного журнала) |
|
|
VCN |
Номер виртуального кластера данной записи в этом потоке индексов |
$BITMAP (0xB0)
Маска побитного отображения (или состояние выделения) описывает значение состояния выделения некого элемента в вычислительной системе. Для NTFS эти сведения содержит атрибут $BITMAP (обращаем ваше внимание также на то, что также имеется файл $Bitmap, который содержит значения состояний выделения кластеров для данной файловой системы - запись MFT 6 - важно не путать их). Атрибут $BITMAP всегда находится в самой записи MFT для $MFT. Листинг 7.9 отображает некую выжимку из побитного отображения выделения.
Листинг 7.9. Часть примера структуры побитового отображения представляющей запись состояния выделения MFT.
002000: ffff 0007 0000 0000 0706 0000 0000 0000 ................
В структуре побитового отображения всякий элемент представлен единственным битом. Значение 1 бита означает выделение данного элемента, в то время как 0 подразумевает что он не выделен. Самый первый байт представляет элементы 0 - 7 (нулевой бит представлен самым младшим битом, в то время как элемент 7 представлен старшим битом). Второй байт представляет элементы 8 - 15 и так далее.
Рассмотрим байт со смещением 0x03 из Листинга 7.9. Он обладает значением 0x07, что, в двоичном представлении является 0b00000111. Поскольку это четвёртый байт из побитного представления, он соответствует состоянию выделения элементов 24d) - 31d). Три младших бита отмечены как выделенные, что означает, что элементы 24d), 25d) и 26d) выделены, в то время как остальные представленные этим байтом элементы не выделены (они все имеют значение 0).
$REPARSE_POINT (0xC0)
Точка повторного анализа предоставляет возможность расширения файловой системы NTFS. Точки повторного анализа состоят из тега и данных. Значение тега указывает на приложение/ фильтр, которые надлежит применять к его данным. Различные теги точки повторного анализа могут определяться приложением/ производителем, однако имеются некоторые стандартно применяемые теги. Они содержат символические ссылки, точки соединения каталогов, точки монтирования томов и так далее. Таблица 7.24 предоставляет структуру для атрибута $REPARSE_POINT.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Тип вторичного анализа |
Значение типа используемой точки повторного анализа. |
|
|
Длина (n) |
Значение длины данных атрибута $REPARSE_POINT (n). |
|
|
Заполнение |
Заполнение (нули). |
|
|
Данные |
Собственно данные для этой $REPARSE_POINT. Их структура зависит от встреченного типа $REPARSE_POINT. |
Значение типа повторного анализа подразделяется на три составные части. Последние 16d бит представляют тип точки повторного анализа, представленной значением атрибута $REPARSE_POINT. Следующие 13d бит зарезервированы для последующего применения, в то время как три первых бита обладают особым значением. Будучи установленным, бит 29d информирует аналитика что данная $REPARSE_POINT это псевдоним иного системного объекта. Когда установлен бит 30d, это сигнализирует аналитику, что доступ к первому байту данных будет медленным (например, когда данные находятся на внешнем ленточном накопителе). Такой бит носит название бита большой задержки. Наконец, самый старший бит именуется битом Microsoft. Он устанавливается для заявленных Microsoft тегов. Для определяемых пользователем тегов его значением должен быть 0.
Рассмотрим тип повторного анализа со значением 0xA0000003. Его младшие 16d бит представляют значение 3d, что означает значение типа записи (в данном случае точку соединения/ монтирования). Три самых старших бита это 0b101, что означает, что данный тег Microsoft и он синоним некого иного типа объекта файловой системы.
Сами данные зависят от типа атрибута $REPARSE_POINT. В ситуации точки монтирования/ соединения (тип: 0xA0000003) структура этих данных отображена в Таблице 7.25.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Смещение целевого имени |
Смещение в байтах до начала целевого имени относительно конца данной структуры (0x08 в данных/ 0x10 в структуре атрибута $REPARSE_POINT). |
|
|
Длина целевого имени (n) |
Значение длины целевого имени в байтах. |
|
|
Смещение выводимого на печать имени |
Смещение в байтах до начала выводимого на печать имени относительно конца данной структуры (0x08 в данных/ 0x10 в структуре атрибута $REPARSE_POINT). |
|
|
Длина выводимого на печать имени (p) |
Значение длины выводимого на печать имени в байтах. |
$EA_INFORMATION (0xD0) и $EA (0xE0)
Атрибуты $EA_INFORMATION совместно с $EA используются для реализации Extended Attributes из HPFS OS/2. Эти атрибуты встречаются редко; следовательно, данный раздел в целом лишь задаёт Таблицами 7.26 и 7.27 структуру этих атрибутов. Оба атрибута могут быть как резидентными, так и не резидентными.
Хотя это и не обычное их применение, одним из наиболее частых вариантов выявления расширенных атрибутов выступает их применение в качестве сокрытия вредоносного программного обеспечения. В тех редких ситуациях, когда они имеют место в ходе расследования, они могут представлять интерес!
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Упакованный размер |
Размер упакованного расширенного атрибута. |
|
|
Число EA |
Значение числа расширенных атрибутов, которые обладают установленным флагом NEED_EA. |
|
|
Распакованный размер |
Размер распакованного расширенного атрибута. |
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Смещение следующего EA |
Смещение для следующего EA. |
|
|
Флаги |
Флаги – 0x80: NEED_EA. |
|
|
Длина названия (n) |
Длина названия расширенного атрибута. |
|
|
Длина значения (v) |
Длина значения расширенного атрибута. |
|
|
Название |
Название расширенного атрибута. |
|
|
Значение |
Значение расширенного атрибута. |
В этом разделе рассматривается анализ файловой системы NTFS вручную. Данный раздел сосредотачивается на основных техниках анализа для выполнения простых задач расследования, таких как получения сведений о файловой системе, перечислении файлов, а также восстановлении метаданных и содержимого файла. В нашем следующем разделе будут предложены более совершенные техники анализа NTFS.
Прежде чем приступать к анализу, для него требуется создать некие простые файловые системы NTFS. Обычно NTFS встречается на системных устройствах; однако сложность всего системного устройства может представлять некие вызовы для того чтобы разобраться с анализом вручную. Как и для предыдущих файловых систем, базовая файловая система будет создана для изначального анализа. С целью демонстрации более совершенных методик для NTFS в этой первоначальной файловой системе будут произведены изменения.
Листинг 7.10 показывает применяемую для создания NTFS в Linux команду. В данном примере определяется лишь метка тома.
Листинг 7.10. Создание файловой системы NTFS из терминала Linux.
$ sudo mkfs.ntfs -L "NTFS FS" /dev/sdb1
Cluster size has been automatically set to 4096 bytes.
Initializing device with zeroes: 100% - Done.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.
$
Для целей демонстрации на протяжении этой главы используется ряд образов диска NTFS. Данные образы доступны на вебсайте этой книги. Таблица 7.28 суммирует все доступные образы.
| Образ файла | Описание |
|---|---|
|
Базовая файловая система, содержащая четыре файла и один каталог. Один из этих файлов содержит альтернативный поток данных. |
|
|
|
Этот образ содержит фрагментированные файлы. |
Для успешного анализа файловой системы NTFS имеется ряд шагов, которых надлежит придерживаться. Эти шаги подробно описываются в данной разделе. Вот они:
-
Обработать $Boot: Для определения местоположения структур файловой системы (в особенности $MFT) и для получения сведений обо всей файловой системы как целого необходимо обработать структуру $Boot.
-
Восстановить $MFT: Главная таблица файлов (master file table, $MFT) выступает одним из важнейших применяемых для анализа NTFS файлов. Он содержит сведения относительно всех отдельных файлов в всвоей файловой системе. Когда мы говорим что всё в NTFS это файлы, мы подразумеваем что данная структура содержит информацию обо всех структурах данной файловой системы помимо созданных пользователем файлов и каталогов.
-
Обработать каталоги: При обработке каталогов можно создавать перечень файлов. Это позволяет создавать список всего содержимого в данной файловой системе.
-
Восстановить метаданные: Файл метаданных хранится в $MFT. Следующий шаг состоит в восстановлении метаданных для каждого содержащегося в нашей файловой системе файла.
-
Восстановить содержимое: Заключительным шагом анализа NTFS является восстановление содержимого файла.
Обработка $Boot
Как и для всех задач анализа при расследовании файловой системы, анализ NTFS начинается с восстановления сведений о данной файловой системе в целом. Они включают в себя размеры элементов (секторов/ кластеров) базового хранилища, а также жизненно важных для файловой системы структур, таких как $MFT (и к тому же $MFTMirr в случае разрушений в первичном $MFT). Для автоматического обеспечения этими сведениями Sleuthkit предоставляет команду fsstat. Листинг 7.11 показывает вывод fsstat при её исполнении в дисковом образе NTFS_V1.E01.
Листинг 7.11. Частичный ввод fsstat для NTFS_V1.E01. Подчёркнутые сведения могут быть восстановлены непосредственно из $Boot.
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: NTFS
Volume Serial Number: 2BEFA0611D6F5839
OEM Name: NTFS
Volume Name: NTFS-FS
Version: Windows XP
METADATA INFORMATION
--------------------------------------------
First Cluster of MFT: 4
First Cluster of MFT Mirror: 16383
Size of MFT Entries: 1024 bytes
Size of Index Records: 4096 bytes
Range: 0 - 69
Root Directory: 5
CONTENT INFORMATION
--------------------------------------------
Sector Size: 512
Cluster Size: 4096
Total Cluster Range: 0 - 32766
Total Sector Range: 0 - 262142
$AttrDef Attribute Values:
$STANDARD_INFORMATION (16) Size: 48-72 Flags: Resident
$ATTRIBUTE_LIST (32) Size: No Limit Flags: Non-resident
$FILE_NAME (48) Size: 68-578 Flags: Resident,Index
...[snip]...
На самом деле вывод из fsstat вырабатывается путём обработки двух структур файловой системы. Первые три раздела (Сведения файловой системы, Сведения о метаданных, Сведения о содержимом) вырабатываются из файла $Boot в NTFS, который изучается в данном разделе. Остальной раздел, Значения атрибута $AttrDef, производятся из файла $AttrDef. Этот файл содержит информацию обо всех возможных атрибутах в своей файловой системе NTFS. Листинг 7.12 показывает содержимое $Boot из NTFS_V1.E01, в то время как таблица 7.29 отображает некоторые обработанные из $Boot значения.
Листинг 7.12. Обрезок $Boot из NTFS_V1.E01.
000000: eb52 904e 5446 5320 2020 2000 0208 0000 .R.NTFS .....
000010: 0000 0000 00f8 0000 3f00 ff00 0008 0000 ........?.......
000020: 0000 0000 8000 8000 ffff 0300 0000 0000 ................
000030: 0400 0000 0000 0000 ff3f 0000 0000 0000 .........?......
000040: f600 0000 0100 0000 3958 6f1d 61a0 ef2b ........9Xo.a..+
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Имя OEM |
NTFS |
|
|
Размер сектора |
0x200 (512d) |
|
|
Секторов в кластере |
0x08 (512 × 8 = 4096d) |
|
|
Число секторов |
0x3FFFF (262 143d) |
|
|
Местоположение MFT |
0x04 (4d) |
|
|
Местоположение MFTMirr |
0x3FFF (16 383d) |
|
|
Размер записи MFT |
0xF6 (−10d) (−10d → 210 = 1024d) |
|
|
Серийный номер |
0x2BEFA0611D6F5839 |
Сопоставление вывода fsstat (Листинг 7.11) с содержимым Таблицы 7.29 показывает, что из $Boot можно восстановить множество сведений. Например, в этой структуре имеется имя OEM, наряду с размерами сектора и кластера. Величины диапазонов секторов и кластеров могут быть вычислены из доступных здесь сведений. Общее число секторов равно 262 143d; поскольку для всех структур в NTFS нумерация начинается с 0d, это подразумевает диапазон секторов начиная с 0d по 262 142d, что и показывает fsstat.
Здесь нет соответствующего вывода для общего числа кластеров; тем не менее, предоставляется значение числа секторов в кластере (8d). Общее число кластеров можно вычислить, воспользовавшись:
numClusters = int (sectorsPerCluster / numSectors )
В данном случае это приводит к 32 767d. И снова, поскольку вся нумерация стартует с 0d, в результате это даёт нам диапазон кластеров с 0d по 32 766d. Также обратите внимание, что в данном примере в самом конце устройства также присутствуют семь секторов, не относящихся ни к какому кластеру!
$Boot также снабжает сведениями относительно Главной таблицы файлов (MFT). Значение первого кластера структуры $MFT находится в самой структуре $Boot. В таблице 7.29 это значение равно 4d; зная размер кластера в данном образе, мы можем установить, что самый первый кластер $MFT можно отыскать по смещению в байтах 4 × 4096 = 16 384d. Однако это предоставляет нам только самый первый кластер искомого файла $MFT. Для восстановления всего содержимого $MFT следует обработать самую первую запись из этого кластера. Это сделает возможным восстановление всего файла $MFT целиком (Во всех файловых системах NTFS самая первая запись MFT - 0d - это запись для самого $MFT!) $MFT настолько жизненно необходим для файловой системы NTFS, что поддерживается зеркало самого первого кластера $MFT. Его местоположение также находится в $Boot. Согласно Таблицы 7.29, его можно найти в кластере 16 383d.
Окончательным элементом необходимых для обработки сведений является размер записи MFT. Хотя обычно это 1024d байт, он может изменяться в процессе создания файловой системы. Значение, которое для этого располагается в $Boot равно 0xF6. Это два представленных обратным видом числа (см. Раздел 3.2.7), которые имеют значение -10d. Поскольку это отрицательное значение, размер записи MFT равен 2, возведённым в степень абсолютной величины этого значения. Иными словами, размер записи MFT равен 210 = 1024d байт.
Восстановление $MFT
Наш следующий шаг после обработки $Boot заключается в восстановлении Главной таблицы файлов (MFT, master file table). Помимо значения размера каждой записи MFT, самый первый кластер получается из $Boot. Самая первая запись MFT это $MFT сам по себе (В случае ошибки в файле $MFT, вторя запись это $MFTMirr). Из Таблицы 7.29 известно, что размер записи MFT равен 1024d. Листинг 7.13 отображает запись MFT для $MFT из NTFS_V1.E01 (обращаем внимание на то, что часть нулевых байт из самого конца записи были удалены). Данная запись начинается с Заголовка записи MFT, за которым следуют эти выделенные альтернативные атрибуты.
Листинг 7.13. Запись MFT для $MFT в NTFS_V1.E01.
004000: 4649 4c45 3000 0300 0000 0000 0000 0000 FILE0...........
004010: 0100 0100 3800 0100 9801 0000 0004 0000 ....8...........
004020: 0000 0000 0000 0000 0400 0000 0000 0000 ................
004030: 0700 0000 0000 0000 1000 0000 6000 0000 ............‘...
004040: 0000 1800 0000 0000 4800 0000 1800 0000 ........H.......
004050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
004060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
004070: 0600 0000 0000 0000 0000 0000 0000 0000 ................
004080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
004090: 0000 0000 0000 0000 3000 0000 6800 0000 ........0...h...
0040a0: 0000 1800 0000 0200 4a00 0000 1800 0100 ........J.......
0040b0: 0500 0000 0000 0500 0069 b830 bc0b da01 .........i.0....
0040c0: 0069 b830 bc0b da01 0069 b830 bc0b da01 .i.0.....i.0....
0040d0: 0069 b830 bc0b da01 0070 0000 0000 0000 .i.0.....p......
0040e0: 006c 0000 0000 0000 0600 0000 0000 0000 .l..............
0040f0: 0403 2400 4d00 4600 5400 0000 0000 0000 ..$.M.F.T.......
004100: 8000 0000 4800 0000 0100 4000 0000 0100 ....H.....@.....
004110: 0000 0000 0000 0000 1200 0000 0000 0000 ................
004120: 4000 0000 0000 0000 0030 0100 0000 0000 @........0......
004130: 0014 0100 0000 0000 0014 0100 0000 0000 ................
004140: 1113 0400 0000 0000 b000 0000 4800 0000 ............H...
004150: 0100 4000 0000 0300 0000 0000 0000 0000 ..@.............
004160: 0000 0000 0000 0000 4000 0000 0000 0000 ........@.......
004170: 0010 0000 0000 0000 1000 0000 0000 0000 ................
004180: 1000 0000 0000 0000 1101 0200 0000 0000 ................
004190: ffff ffff 0000 0000 0000 0000 0000 0000 ................
Таблица 7.30 суммирует значения атрибутов, присутствующих в записи MFT для $MFT. Как и ожидалось, присутствует атрибут $STANDARD_INFORMATION, который предоставляет метаданные относительно самого файла $MFT. Он следует за атрибутом $FILENAME. Ознакомление с ASCII значениями $атрибута $FILENAME из Листинга 7.13 показывает, сто значением его имени, как и ожидалось, выступает $MFT. Заключительными двумя атрибутами являются $DATA и $BITMAP. Значение атрибута $DATA предоставит местоположение содержимого данного файла, а значение атрибута $BITMAP сообщает какие записи MFT используются/ свободны.
| ID типа | Название | Размер | Резидент |
|---|---|---|---|
|
$FILENAME |
0x68 (104d) |
Да |
|
$STANDARD_INFORMATION |
0x60 (96d) |
Да |
|
$DATA |
0x48 (72d) |
Нет |
|
$BITMAP |
0x48 (72d) |
Нет |
Для восстановления всего содержимого самого файла MFT надлежит проанализировать значение атрибута $DATA. Из Таблицы 7.30 видно, что этот атрибут не резидентный. Значение этого атрибута самого по себе представлено в Листинге 7.14. Значение атрибута начинается с общего заголовка атрибута, за которым следует не резидентный заголовок (выделенный). Обработанные заголовки отражены в Таблице 7.31.
Листинг 7.14. Атрибут $DATA для записи 0 MFT (файл $MFT) в NTFS_V1.E01. Выделены заголовки самого атрибута и не резидента.
004100: 8000 0000 4800 0000 0100 4000 0000 0100 ....H.....@.....
004110: 0000 0000 0000 0000 1200 0000 0000 0000 ................
004120: 4000 0000 0000 0000 0030 0100 0000 0000 @........0......
004130: 0014 0100 0000 0000 0014 0100 0000 0000 ................
004140: 1113 0400 0000 0000 ........
Из Таблицы 7.31 получены следующие сведения:
-
Этот атрибут $DATA представлен в первых 19d кластерах содержимого файла (начальный VCN это кластер 0d, а последний VCN это 18d).
-
Итого наш кластер размещён в 19d (выделенное пространство равно 0x13000, в то время как размер кластера равен 0x1000). В сочетании с этими сведениями предыдущего пункта означает, что для этого файла требуется лишь один атрибут $DATA.
-
Потенциально в конце данного файла имеется пустое пространство. Под файл выделено 0x13000, однако его реальный размер равен 0x11400. Это подразумевает потенциально 0x1C00 пустых байт в самом конце файла.
-
Значение списка последовательности находится по смещению 0x40 от начала этого атрибута. Значение списка последовательности равно 0x111304.
| Смещение | Размер | Название | Описание |
|---|---|---|---|
|
|
Общий заголовок |
Тип: 0x80 ($DATA) Размер: 0x48 (72d) Резидентный: Нет Длина имени: 0x00 (0d) Смещение имени: 0x40 (64d) Флаги: 0x00 (0d) ID атрибута: 0x01 (1d) |
|
|
Начальный кластер |
0x00 (0d) |
|
|
Последний кластер |
0x12 (18d) |
|
|
Смещение списка последовательности |
0x40 (64d) |
|
|
Размер выделенного пространства |
0x13000 (77 824d) |
|
|
Реальный размер |
11400 (70 656d) |
|
|
Инициализированный размер |
11400 (70 656d) |
Для восстановления содержимого далее следует интерпретировать содержимое списка последовательности. Возвращаясь к Рисунку 7.5, видим, что в данной ситуации число байт, используемых для начального кластеров и значения
числа непрерывных кластеров равно 1d. Это подразумевает, что наш список последовательности
представлен 0x13 непрерывными кластерами, начинающимися с кластера 0x04. Листинг 7.15 отображает команду
dd, которой можно воспользоваться для выделения данного файла.
Также показан sleuthkitс обоими результатами для сравнения их значений MD5.
Листинг 7.15. Применение dd
для восстановления содержимого $MFT из NTFS_V1.E01
$ dd if=mnt/ewf1 of=mft.dd.raw bs=1 skip=$((4*4096))
count=$((0x11400))
70656+0 records in
70656+0 records out
70656 bytes (71 kB, 69 KiB) copied, 1.83432 s, 38.5 kB/s
$
$ md5sum mft.*
dc382d0e7992af4dfad9d35f708eace9 mft.dd.raw
dc382d0e7992af4dfad9d35f708eace9 mft.tsk.raw
Раз $MFT был восстановлен, теперь у нас для анализа имеются все сведения относительно исследуемой файловой системы. Этот процесс продолжается перечислением всех имеющихся в данной файловой системе файлов/ каталогов.
Обработка каталогов
Восстановление метаданных файла
Восстановление содержимого файла


