Boîtes de dialogue Ouvrir et Enregistrer sous (OpenSaveMRU)¶
Qu'est-ce que l'historique des boîtes de dialogue ?¶
Lorsqu'un programme affiche la boîte de dialogue commune Ouvrir ou Enregistrer sous, Windows enregistre dans le
NTUSER.DAT de l'utilisateur :
- quel fichier a été ouvert ou enregistré :
OpenSavePidlMRUpossède une sous-clé par extension (docx,ps1, …) et*pour toutes les extensions, chacune étant une liste des éléments les plus récemment utilisés ; - quel programme a utilisé la boîte de dialogue, et le dossier dans lequel elle se trouvait :
LastVisitedPidlMRU(etLastVisitedPidlMRULegacypour les programmes qui utilisent les anciennes boîtes de dialogue) ; - les programmes qui ont affiché la boîte de dialogue :
CIDSizeMRU(la taille de la boîte de dialogue par programme), etFirstFolder(le chemin d'un programme et un dossier) ; - sous Windows 2000 et XP,
OpenSaveMRU(chemins par extension) etLastVisitedMRU(programmes et leurs dossiers sous forme de chemins).
Depuis Windows Vista, les fichiers et dossiers sont des listes d'éléments du shell (shell items), les mêmes structures que la cible d'un raccourci : chaque élément est une partie du chemin (Ce PC, un lecteur, un dossier, le fichier), et un élément de fichier ou de dossier peut porter ses propres horodatages et sa référence de fichier NTFS.
Meilleure conclusion : un programme a utilisé la boîte de dialogue Ouvrir ou Enregistrer sous pour ouvrir ou enregistrer ce fichier, ou dans ce dossier, au cours de la session de cet utilisateur. Seule l'entrée la plus récente de chaque liste est datée : par l'heure de dernière écriture de sa clé.
Emplacement¶
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)
Collectez NTUSER.DAT avec ses journaux de transactions pour chaque profil.
Précautions d'analyse¶
- Un seul horodatage par liste. L'heure de dernière écriture d'une clé change lorsque l'une de ses entrées passe en
tête de sa liste ; elle ne date donc que l'entrée en position 0 (
IsMostRecent,LastUsedUTC). Les autres entrées sont ordonnées, de la plus récente à la plus ancienne en descendant dans la liste, mais ne sont pas datées. - Le même fichier dans deux listes. Un fichier figure dans la liste de son extension et dans
*; ne le comptez pas comme deux utilisations.*donne l'ordre toutes extensions confondues. - Ouvert ou enregistré. Les listes ne précisent pas lequel. Corrélez avec les enregistrements
$MFTet du Journal USN du fichier, les fichiers LNK et les Jump Lists. - Les horodatages des éléments sont ceux du fichier, et non de la boîte de dialogue.
ItemModifiedUTC,ItemCreatedUTCetItemAccessedUTCsont les horodatages du fichier au moment où l'élément a été écrit, à 2 secondes près (FAT). Les éléments des dossiers connus (CLSID_ThisPCDocumentsRegFolder,Downloads, …) n'en ont souvent aucun. Ces horodatages FAT n'ont pas de décalage de fuseau horaire. Le suffixe de colonneUTCest une convention d'affichage, et non une preuve que l'horloge d'origine était en UTC ; corrélez avec le fuseau horaire du système source et d'autres horodatages avant de les comparer aux FILETIME du Registre. Consultez les recommandations de Microsoft sur les horodatages de fichiers. - Les chemins sont des chemins du shell. Ils commencent au bureau :
This PC\C:\Users\…, un dossier connu, une bibliothèque (UsersLibraries\Documents\…) ou un emplacement réseau. Un chemin qui commence par un dossier ou un fichier se trouve sur le bureau. Un chemin vide correspond au bureau lui-même. - Éléments non décodés. Un élément d'un type que le parseur d'éléments du shell ne connaît pas est affiché par sa
classe (
[class 0x00]), son type estunknown, et les octets de la liste figurent dansDataRaw. - Les programmes sont des noms.
LastVisitedPidlMRUetCIDSizeMRUconservent un nom de fichier (WINWORD.EXE), et non un chemin.FirstFolderconserve un chemin. - Les listes sont courtes et nettoyées. Chaque liste conserve un nombre limité d'entrées, et les outils de nettoyage
suppriment les clés. Utilisez
parse-registry read --recover-deletedpour les valeurs supprimées.
Analyser avec 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 != "*")'
Le résumé répertorie les entrées par liste, les programmes qui ont utilisé les boîtes de dialogue et le fichier le plus
récent de chaque ruche (la première entrée de *).
Champs de sortie¶
| Champ | Interprétation |
|---|---|
Host, User, UserSID, SourcePath |
L'hôte, le propriétaire du profil (d'après le chemin ou les dossiers du shell), le SID provenant du ProfileList du système, et la ruche. |
List |
OpenSavePidlMRU, LastVisitedPidlMRU, LastVisitedPidlMRULegacy, CIDSizeMRU, FirstFolder, OpenSaveMRU ou LastVisitedMRU. |
Extension |
La sous-clé de l'extension (docx, *) ; vide pour les autres listes. |
MRU-Position, IsMostRecent |
La position dans la liste de la clé (0 est la plus récente) ; vide lorsque la liste ne nomme pas la valeur. |
ValueName |
Le numéro (MRUListEx) ou la lettre (MRUList) de la valeur. |
Program |
Le programme qui a affiché la boîte de dialogue. |
Path |
Le fichier ou le dossier : les noms des éléments du shell joints, ou le chemin stocké sous forme de texte. |
ItemType |
Le type du dernier élément du shell : file, directory, root_folder, volume, network_location, property_view, unknown, … |
ItemModifiedUTC, ItemCreatedUTC, ItemAccessedUTC |
Les horodatages du fichier ou du dossier, tels que son élément du shell les a enregistrés. |
MFT-Entry, MFT-Sequence |
La référence de fichier NTFS enregistrée par l'élément du shell. |
LastUsedUTC |
L'heure de dernière écriture de la clé, pour l'entrée la plus récente uniquement. |
KeyPath, KeyLastWrittenUTC |
La clé et sa dernière écriture : l'heure de son entrée la plus récente, et non de chaque ligne. |
DataRaw |
Les octets de la valeur (en hexadécimal) lorsqu'ils ne se décodent pas, ou la liste d'éléments du shell lorsque le type d'un élément est inconnu. |
TransactionLogStatus, LogsApplied |
Contexte de récupération du Registre. |
Problems |
Valeurs que la liste nomme mais que la clé ne contient pas, valeurs qu'elle ne nomme pas, types incorrects, noms ou listes tronqués. |
Stratégie d'investigation¶
- Lisez
*dans l'ordre pour chaque utilisateur, etLastUsedUTCpour le fichier le plus récent. - Recherchez des scripts, archives, exécutables et documents situés dans des emplacements accessibles en écriture par l'utilisateur, amovibles ou réseau, ainsi que des fichiers dont le nom évoque des identifiants ou des exports.
- Utilisez
LastVisitedPidlMRUpour relier un programme au dossier qu'il a utilisé en dernier, etCIDSizeMRUetFirstFolderpour les programmes qui ont utilisé les boîtes de dialogue. - Corrélez les chemins et
MftEntryavec le$MFT, le Journal USN, les fichiers LNK, les Jump Lists, ShellBags et RecentDocs.