Перейти до змісту

Головна файлова таблиця ($MFT)

Що таке MFT

NTFS представляє кожен файл і каталог записом у головній файловій таблиці (Master File Table). Записи містять атрибути, як-от імена, посилання на батьківський каталог, часові позначки, розміри, прапорці, ідентифікатори безпеки, відомості про точки повторного аналізу (reparse) і метадані потоків даних. Невеликий вміст файлів і альтернативні потоки даних можуть бути резидентними, тобто їхні байти зберігаються безпосередньо в записі MFT.

MFT має фундаментальне значення, оскільки охоплює розподілені та видалені записи по всьому тому. Вона може показати, що файл існував, де він був зв'язаний, чи його було видалено і як змінювалися його метадані, — навіть коли звичайний перегляд каталогів його вже не показує.

Найобґрунтованіший висновок: запис файлу NTFS із показаними метаданими існував на момент збирання або зберігся в нерозподіленому записі. Сама лише MFT не доводить виконання чи намір користувача.

Розташування та збирання

C:\$MFT

$MFT — це захищені метадані NTFS. Збирайте його засобом криміналістичного отримання даних або тріажу, здатним до необробленого доступу до NTFS; звичайне копіювання в режимі користувача зазвичай не може його прочитати. За можливості збирайте його разом із $J, $LogFile і метаданими тому.

Застереження для аналітика

  • Видалений запис може бути частково перезаписаний, а його номер запису може бути використаний повторно.
  • SN розрізняє покоління одного й того самого номера запису. Зіставляйте номер запису та порядковий номер.
  • Часові позначки $STANDARD_INFORMATION (0x10) і $FILE_NAME (0x30) оновлюються по-різному. Жодна з них не захищена від маніпуляцій.
  • SI<FN, uSecZeros і Copied — це зачіпки, а не автоматичні вердикти щодо timestomping.
  • Жорсткі посилання створюють кілька атрибутів $FILE_NAME і шляхів для одного запису файлу.
  • NTFS може зберігати кілька імен (зокрема DOS 8.3), альтернативні потоки даних і записи розширення.
  • Оновлення часу доступу може бути вимкнено, відкладено або об'єднано.
  • Повний шлях відтворюється з батьківських записів. [Orphaned], [Unknown] або PathUnknown сигналізують про відсутні/повторно використані/пошкоджені предки — це не буквальна назва каталогу.
  • Slack запису FILE (його байти за межами використовуваного розміру) може зберігати імена, які він містив раніше: записи індексу невеликого каталогу, індекс якого перемістився до розподілу індексу (більшість із них там досі використовуються), попереднє ім'я або попереднього власника повторно використаного запису. Відновлені імена не мають $STANDARD_INFORMATION, а заголовок запису імені міг бути перезаписаний. Якщо використовуваний розмір або атрибути запису не вказують, де починається його slack, з нього нічого не відновлюється, а ParseErrors його рядка містить slack not read і причину.

Аналіз за допомогою Juntei

Usage: juntei parse-ntfs mft <INPUT> [OPTIONS]

Input:
  -d, --directory <DIR>  Recursively find $MFT files
  -f, --file <FILE>      Parse one $MFT

Filtering:
  -r, --ranges <RANGES>  Parse selected entry numbers (example: 0-15,30)

Output:
  -o, --output <PATH>                   Save records
  -t, --output-type <TYPE>              csv, ys-ntfs-parser-csv, json, jsonl
  -e, --extract-resident-streams <DIR>  Extract resident $DATA streams

CSV Output:
  -a, --all-times      Include every $FILE_NAME time
  -s, --short-names    Include DOS 8.3-name rows
      --cutoff <DATE>  Keep recent SI-created or SI-modified records

Records:
  -x, --recover-slack  Recover file names from FILE record slack

Resident Data:
  -i, --include-resident-data      Put resident $DATA in the CSV
  -E, --resident-extensions <EXT>  Only these extensions (ex: ps1,bat,vbs,js)
  -M, --resident-max-size <BYTES>  Only data up to this size

Inspection:
  -D, --dump-entry <ENTRY>           Show one entry in full detail
  -L, --list-directory <ENTRY|PATH>  List a directory's contents
juntei parse-ntfs mft -f '$MFT' -o mft.csv
juntei parse-ntfs mft -f '$MFT' --cutoff '2026-10-20T00:00:00Z' -a -o recent.csv
juntei parse-ntfs mft -f '$MFT' -t jsonl -r 32000-32100 | jq .
juntei parse-ntfs mft -f '$MFT' -x -o mft-with-slack.csv
juntei parse-ntfs mft -f '$MFT' -i -E ps1,bat,vbs,js -o scripts.csv
juntei parse-ntfs mft -f '$MFT' -D 0x270-5
juntei parse-ntfs mft -f '$MFT' -L '\Users\alice\Downloads'

Ніколи не виконуйте резидентні потоки, витягнуті з -e; Juntei недарма дає їм імена з .dontrun. Стовпці резидентних даних -i містять ті самі байти: розглядайте їх як недовірений вміст.

-D виводить один запис: його заголовок, кожен атрибут (з фрагментами даних) та імена в його slack у тому вигляді, як їх записує -t json -x, а потім байти запису. -L перелічує кожне ім'я в каталозі, як використовуване, так і видалене, з його номером запису та порядковим номером, типом, розміром і часом зміни. Каталог задається номером запису (30, 0x1E, 30-1) або шляхом (\Windows\System32, C:/Windows; без урахування регістру).

Поля виводу CSV

Поле Інтерпретація
EntryNum (Entry Number) Номер запису MFT. Поєднуйте з SN; номери записів використовуються повторно.
SN (Sequence Number) Лічильник поколінь, який використовують посилання NTFS. Невідповідність може виявити застарілі/видалені зв'язки.
InUse Прапорець розподілу на момент збирання. false означає, що запис вільний/видалений, а не що всі байти цілі.
ParentEntryNum (ParentEntryNumber), ParentSN (Parent Sequence Number) Посилання на батьківський каталог із $FILE_NAME. Перевіряйте обидві частини.
ParentPath Відтворений шлях до батьківського каталогу. Позначки невідомих/осиротілих записів показують нерозв'язані предки.
File (Filename) Ім'я з $FILE_NAME або потоку поточного рядка. Один запис може мати кілька рядків.
Ext (Extension) Допоміжне розширення, розібране з імені; не є надійним визначенням типу файлу.
Size (File Size) Логічний розмір, пов'язаний із рядком/потоком. Розподіл для розріджених/стиснених файлів може відрізнятися.
RefCnt (Reference Count) Лічильник посилань жорстких посилань NTFS; обережно порівнюйте з кількістю збережених імен.
ReparseTarget Декодована ціль для підтримуваних точок повторного аналізу, як-от з'єднань (junctions)/символьних посилань. Шляхи можуть перенаправлятися.
Dir (Directory) Запис має прапорець каталогу.
HasADS (Has Alternate Data Streams) Запис містить іменовані альтернативні потоки даних. Це не робить його шкідливим.
IsADS (Is Alternate Data Stream) Цей рядок представляє іменований альтернативний потік даних, а не безіменні дані файлу.
SI<FN (Standard Information Before File Name) Час створення SI передує іншому часу створення FN. Досліджуйте копіювання/timestomping і легітимні причини.
uSecZeros (Microsecond Zeros) Час створення/зміни SI припадає точно на межу мілісекунди. Лише слабка евристика timestomping.
Copied Час зміни передує часу створення. Часто узгоджується з копіюванням файлу; не є доказом дій зловмисника.
SI-Flags (Standard Information Flags) Атрибути/прапорці файлу $STANDARD_INFORMATION. Прапорці hidden/system можуть бути корисними точками переходу.
Type (Name Type) Простір імен $FILE_NAME (Win32, DOS, POSIX або комбінований). Використовуйте, щоб уникнути подвійного підрахунку імен.
DataModified (SI), Accessed (SI), MetadataChanged (SI), Created (SI) Часові позначки SI. Поширені поля хронології, але інструменти режиму користувача можуть змінювати кілька з них.
DataModified (FN), Accessed (FN), MetadataChanged (FN), Created (FN) Часові позначки FN. Оновлюються інакше і загалом їх важче змінити звичайними API; утім, вони не є незмінними.
USN (Update Sequence Number) Останній USN, пов'язаний з атрибутом SI запису. Переходьте до $J, якщо цей USN зберігся.
LogfileSN (Logfile Sequence Number) Порядковий номер NTFS $LogFile із заголовка запису FILE; корисний для низькорівневого аналізу транзакцій.
SID (Security ID) Індекс у NTFS $Secure; сам по собі не є SID Windows. Об'єднуйте його із SecurityID з parse-ntfs secure-sds, щоб отримати власника файлу та ACL.
ObjectID-FileDroid Ідентифікатор об'єкта / ідентифікатор розподіленого відстеження посилань, якщо є; зіставляйте з droid-ідентифікаторами LNK/Jump List.
LoggedUtilStream Декодований контекст $LOGGED_UTILITY_STREAM, якщо підтримується. Перевіряйте незнайомі значення.
ZoneID-Contents Резидентний вміст Zone.Identifier, як-от ZoneId і URL-адреси завантаження. Він може бути відсутнім, видаленим або нерезидентним.
SourceFile Вхідний $MFT; необхідний під час об'єднання даних кількох хостів або томів.
ResidentDataBase64, ResidentDataHex, ResidentDataASCII З -i: вміст резидентного $DATA рядка (файлу або альтернативного потоку даних) у вигляді Base64, байтів (41-42) і тексту, якщо це друковані символи ASCII. Порожнє, якщо дані нерезидентні або відфільтровані за допомогою -E/-M.
ParseErrors Пошкодження або непідтримувані зв'язки, що стосуються цього рядка. Ніколи не відкидайте цей стовпець під час фільтрування.
FromSlack З -x: True для імені, відновленого зі slack запису FILE. Його EntryNum і SN — це файл, на який вказувало ім'я (порожні, якщо заголовок його запису перезаписано), відновлені часові позначки містяться в стовпцях (FN), а InUse має значення False.
SlackRecord, SlackOffset З -x: запис FILE, slack якого містив ім'я, визначений за його місцем у $MFT, а не за номером запису, записаним усередині нього (власний номер запису розширення, хоча його імена перелічуються разом з базовим записом), і байтове зміщення імені в $MFT. ParseErrors рядка зі slack — це проблеми цього запису, як-от fixup values do not match: це може впливати на відновлені байти.
CopyOfEntryInUse З -x: використовуваний файл досі має це ім'я в тому самому каталозі (і це той самий файл, якщо посилання збереглося). Цікаві саме ті імена, яких не має жоден використовуваний файл: видалені, перейменовані або імена попереднього власника повторно використаного запису.

Стовпці часових позначок ідуть у порядку MACB (Modified, Accessed, Changed, Birth/створення): DataModified SI/FN, Accessed SI/FN, MetadataChanged SI/FN, потім Created SI/FN.

(SI) означає $STANDARD_INFORMATION; (FN) означає $FILE_NAME. Ці назви описують звичайне джерело для повного запису. Для звичайного рядка імені файлу без атрибута SI наявний резервний механізм поміщає час створення FN у Created (FN), а значення зміни/зміни запису/доступу FN — у DataModified (SI), MetadataChanged (SI) і Accessed (SI) відповідно. Відновлені рядки зі slack поміщають усі чотири часові позначки в стовпці (FN) і залишають стовпці SI порожніми. Резервні значення звичайних рядків не є незалежними доказами SI. Щоб визначити джерело часової позначки, використовуйте вихідні атрибути JSON і походження зі slack.

-t ys-ntfs-parser-csv (раніше ys-mft-parser-csv, досі приймається) використовує орієнтовану на записи схему підтримуваного парсера. Ці зрозумілі назви стовпців стосуються стандартного виводу -t csv, зокрема MFT.csv з auto-parse. JSON/JSONL зберігає кожен атрибут (включно з резидентним $DATA у шістнадцятковому вигляді) і FullPath; використовуйте цей формат, коли пласкому CSV для розслідування бракує низькорівневої структури. З -x кожен запис JSON також має SlackFileNames.

Стратегія розслідування

  1. Фільтруйте за часовим вікном, але зберігайте видалені записи та обидва набори часових позначок.
  2. Шукайте повні шляхи, підозрілі подвійні розширення, ADS, каталоги для підготовки даних і відомі хеші/імена. З -x включайте імена зі slack, яких не має жоден використовуваний файл (CopyOfEntryInUse False); з -i -E ps1,bat,vbs,js читайте невеликі сценарії безпосередньо з CSV.
  3. Переходьте за номером запису/порядковим номером і USN до журналу USN.
  4. Порівнюйте посилання MFT з Prefetch/LNK/Jump List із цільовим записом.
  5. Зіставляйте видалення з карантином Defender або активністю USN FILE_DELETE/перейменування.

Додаткові відомості