Діалоги відкриття та збереження файлів (OpenSaveMRU)¶
Що таке історія діалогів¶
Коли програма показує стандартний діалог «Відкрити» або «Зберегти як», Windows записує в
NTUSER.DAT користувача:
- який файл було відкрито або збережено:
OpenSavePidlMRUмає по одному підключу на розширення (docx,ps1, …) і*для всіх розширень, кожен з яких є списком нещодавно використаних елементів; - яка програма використовувала діалог і в якій папці він був:
LastVisitedPidlMRU(іLastVisitedPidlMRULegacyдля програм, які використовують старіші діалоги); - програми, які показували діалог:
CIDSizeMRU(розмір діалогу для кожної програми) іFirstFolder(шлях програми та папка); - у Windows 2000 і XP —
OpenSaveMRU(шляхи за розширеннями) іLastVisitedMRU(програми та їхні папки у вигляді шляхів).
Починаючи з Windows Vista, файли та папки зберігаються як списки елементів оболонки (shell items) — ті самі структури, що й ціль ярлика: кожен елемент — це частина шляху (This PC, диск, папка, файл), а елемент файлу чи папки може містити власні значення часу та посилання на файл NTFS.
Найобґрунтованіший висновок: програма використала діалог «Відкрити» або «Зберегти як», щоб відкрити чи зберегти цей файл або в цій папці, у сеансі цього користувача. Датовано лише найновіший запис кожного списку: часом останнього запису його ключа.
Розташування¶
C:\Users\<user>\NTUSER.DAT
Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\
OpenSavePidlMRU\<extension> shell item lists, MRUListEx order (Vista and later)
OpenSavePidlMRU\* every extension
LastVisitedPidlMRU program name, then a shell item list
LastVisitedPidlMRULegacy the same
CIDSizeMRU program name
FirstFolder program path, then a folder path
OpenSaveMRU\<extension> paths, MRUList order (2000 and XP)
LastVisitedMRU program name, then a folder path (2000 and XP)
Зберіть NTUSER.DAT разом із журналами транзакцій для кожного профілю.
Застереження для аналітика¶
- Один час на список. Час останнього запису ключа змінюється, коли один із його записів переміщується на
початок списку, тому він датує лише запис у позиції 0 (
IsMostRecent,LastUsedUTC). Інші записи впорядковано від найновішого до найстарішого вниз за списком, але вони не датовані. - Той самий файл у двох списках. Файл є в списку свого розширення та в
*; не рахуйте це як два використання.*дає порядок у межах усіх розширень. - Відкрито чи збережено. Списки цього не вказують. Зіставляйте із записами
$MFTі журналу USN для файлу, файлами LNK і Jump Lists. - Час елементів — це час файлу, а не діалогу.
ItemModifiedUTC,ItemCreatedUTCіItemAccessedUTC— це час файлу на момент запису елемента, з точністю до 2 секунд (FAT). Елементи відомих папок (CLSID_ThisPCDocumentsRegFolder,Downloads, …) часто їх не мають. Ці часові мітки FAT не мають зміщення часового поясу. Суфікс стовпцяUTC— це лише умовність відображення, а не доказ того, що вихідний годинник працював в UTC; перш ніж порівнювати їх із FILETIME реєстру, зіставте їх з часовим поясом вихідної системи та іншими часовими мітками. Див. рекомендації Microsoft щодо часу файлів. - Шляхи — це шляхи оболонки. Вони починаються від робочого столу:
This PC\C:\Users\…, відома папка, бібліотека (UsersLibraries\Documents\…) або мережеве розташування. Шлях, що починається з папки або файлу, вказує на робочий стіл. Порожній шлях — це сам робочий стіл. - Недекодовані елементи. Елемент типу, невідомого парсеру елементів оболонки, показується за його
класом (
[class 0x00]), його тип —unknown, а байти списку містяться вDataRaw. - Програми — це імена.
LastVisitedPidlMRUіCIDSizeMRUзберігають ім'я файлу (WINWORD.EXE), а не шлях.FirstFolderзберігає шлях. - Списки короткі й очищаються. Кожен список зберігає обмежену кількість записів, а засоби очищення
видаляють ключі. Для видалених значень використовуйте
parse-registry read --recover-deleted.
Аналіз за допомогою Juntei¶
Usage: juntei parse-registry open-save-mru <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find NTUSER.DAT hives
-f, --file <FILE> Parse one NTUSER.DAT
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
--code-page <CP> Code page of shell item names that aren't Unicode (default 1252)
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry open-save-mru -d evidence/ -o opensavemru.csv
juntei parse-registry open-save-mru -f NTUSER.DAT -t jsonl \
| jq 'select(.List == "OpenSavePidlMRU" and .Extension != "*")'
Зведення перелічує записи кожного списку, програми, які використовували діалоги, і найновіший файл кожного куща
(перший запис *).
Поля виводу¶
| Поле | Інтерпретація |
|---|---|
Host, User, UserSID, SourcePath |
Хост, власник профілю (зі шляху або папок оболонки), SID із ProfileList системи та кущ. |
List |
OpenSavePidlMRU, LastVisitedPidlMRU, LastVisitedPidlMRULegacy, CIDSizeMRU, FirstFolder, OpenSaveMRU або LastVisitedMRU. |
Extension |
Підключ розширення (docx, *); порожнє для інших списків. |
MRU-Position, IsMostRecent |
Місце у списку ключа (0 — найновіший); порожнє, якщо список не називає значення. |
ValueName |
Номер (MRUListEx) або літера (MRUList) значення. |
Program |
Програма, яка показала діалог. |
Path |
Файл або папка: об'єднані імена елементів оболонки або шлях, збережений як текст. |
ItemType |
Тип останнього елемента оболонки: file, directory, root_folder, volume, network_location, property_view, unknown, … |
ItemModifiedUTC, ItemCreatedUTC, ItemAccessedUTC |
Час файлу або папки в тому вигляді, як його записав елемент оболонки. |
MFT-Entry, MFT-Sequence |
Посилання на файл NTFS, записане елементом оболонки. |
LastUsedUTC |
Час останнього запису ключа, лише для найновішого запису. |
KeyPath, KeyLastWrittenUTC |
Ключ і його останній запис: час його найновішого запису, а не кожного рядка. |
DataRaw |
Байти значення (hex), якщо вони не декодуються, або список елементів оболонки, якщо тип елемента невідомий. |
TransactionLogStatus, LogsApplied |
Контекст відновлення реєстру. |
Problems |
Значення, які список називає, але яких немає в ключі, значення, яких він не називає, неправильні типи, обрізані імена або списки. |
Стратегія розслідування¶
- Прочитайте
*по порядку для кожного користувача таLastUsedUTCдля найновішого файлу. - Шукайте скрипти, архіви, виконувані файли та документи в розташуваннях, доступних користувачу для запису, знімних або мережевих розташуваннях, а також файли з назвами, що нагадують облікові дані або експорти.
- Використовуйте
LastVisitedPidlMRU, щоб пов'язати програму з папкою, яку вона використовувала востаннє, аCIDSizeMRUіFirstFolder— для програм, які взагалі використовували діалоги. - Зіставляйте шляхи та
MftEntryз$MFT, журналом USN, файлами LNK, Jump Lists, ShellBags і RecentDocs.