Головна файлова таблиця ($MFT)¶
Що таке MFT¶
NTFS представляє кожен файл і каталог записом у головній файловій таблиці (Master File Table). Записи містять атрибути, як-от імена, посилання на батьківський каталог, часові позначки, розміри, прапорці, ідентифікатори безпеки, відомості про точки повторного аналізу (reparse) і метадані потоків даних. Невеликий вміст файлів і альтернативні потоки даних можуть бути резидентними, тобто їхні байти зберігаються безпосередньо в записі MFT.
MFT має фундаментальне значення, оскільки охоплює розподілені та видалені записи по всьому тому. Вона може показати, що файл існував, де він був зв'язаний, чи його було видалено і як змінювалися його метадані, — навіть коли звичайний перегляд каталогів його вже не показує.
Найобґрунтованіший висновок: запис файлу NTFS із показаними метаданими існував на момент збирання або зберігся в нерозподіленому записі. Сама лише 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.
Стратегія розслідування¶
- Фільтруйте за часовим вікном, але зберігайте видалені записи та обидва набори часових позначок.
- Шукайте повні шляхи, підозрілі подвійні розширення, ADS, каталоги для підготовки даних і відомі хеші/імена.
З
-xвключайте імена зі slack, яких не має жоден використовуваний файл (CopyOfEntryInUseFalse); з-i -E ps1,bat,vbs,jsчитайте невеликі сценарії безпосередньо з CSV. - Переходьте за номером запису/порядковим номером і
USNдо журналу USN. - Порівнюйте посилання MFT з Prefetch/LNK/Jump List із цільовим записом.
- Зіставляйте видалення з карантином Defender або активністю USN
FILE_DELETE/перейменування.