MuiCache¶
Qu'est-ce que MuiCache¶
Lorsqu'un utilisateur démarre un programme, Windows lit les ressources de version du programme pour obtenir le nom que le
shell doit afficher (le FileDescription, par exemple « Windows Command Processor » pour
cmd.exe) et le met en cache, par utilisateur, dans MuiCache. Windows 8 et les versions ultérieures mettent également en cache la société
(CompanyName). Le cache est indexé par le chemin complet du programme :
- Windows 8 et versions ultérieures : deux valeurs par programme,
<path>.FriendlyAppNameet<path>.AppCompany. - Windows Vista et 7 : une valeur par programme,
<path>, contenant le nom convivial. - Windows XP : la même forme, dans
NTUSER.DAT.
MuiCache peut fournir des pistes d'exécution de programmes pour la session shell d'un utilisateur, y compris pour des programmes situés sur des lecteurs amovibles, des partages réseau et des dossiers qui n'existent plus, avec le nom et la société indiqués par le fichier lui-même.
Meilleure conclusion : ce profil shell a mis en cache le chemin, la description et la société d'un fichier. Corrélez cela avec d'autres artefacts d'exécution. Le profil n'identifie pas le compte sous lequel le processus s'est exécuté. MuiCache ne comporte ni heure par programme ni nombre d'exécutions.
Emplacement¶
C:\Users\<user>\AppData\Local\Microsoft\Windows\UsrClass.dat Windows Vista and later
Local Settings\Software\Microsoft\Windows\Shell\MuiCache
C:\Documents and Settings\<user>\NTUSER.DAT Windows XP
Software\Microsoft\Windows\ShellNoRoam\MUICache
LangID (la langue des chaînes mises en cache) n'est pas un programme et est ignoré. Les valeurs nommées
@<file>,-<number> (@shell32.dll,-22019) sont des chaînes de ressources que le shell a mises en cache pour ses propres
menus et types de fichiers, et non des programmes ; elles sont ignorées et comptées dans la synthèse. Sous Windows Vista
et versions ultérieures, NTUSER.DAT ne contient pas de MuiCache.
Collectez UsrClass.dat (et NTUSER.DAT) avec leurs journaux de transactions pour chaque profil, ainsi que les
ruches système SYSTEM et SOFTWARE pour l'hôte et les noms d'utilisateurs.
Précautions d'analyse¶
- Le propriétaire du profil n'est pas nécessairement le compte du processus. Un programme démarré avec un autre
compte peut afficher une fenêtre dans la session de cet utilisateur et laisser des métadonnées dans le cache de cet utilisateur.
UseretUserSididentifient le propriétaire de la ruche, et non le contexte de sécurité du processus. - Pas d'heure par programme.
KeyLastWrittenUTCest la dernière écriture de la clé : la modification la plus récente de l'un quelconque de ses programmes, et non le moment où un programme particulier s'est exécuté. Prefetch, BAM, UserAssist et les journaux d'événements fournissent des heures. - Pas uniquement les programmes que l'utilisateur a démarrés manuellement. Une DLL ou un programme chargé par le shell lui-même (pour
Open with, une extension du shell, un processus enfant d'un programme d'installation) peut apparaître, par exempleexplorerframe.dlloushell32.dll. - Le nom provient du fichier.
FriendlyAppNameetAppCompanycorrespondent à ce qu'indiquaient les ressources de version du fichier lors de son exécution. Un logiciel malveillant peut revendiquer n'importe quelle description et société ; un outil renommé conserve sa description d'origine, ce qui peut le trahir (un fichier nommésvchost.exedont le nom convivial est celui d'un outil d'accès à distance). - Une entrée par chemin. Exécuter à nouveau le même programme n'ajoute pas d'entrée ; une copie située à un autre chemin, si. L'entrée d'un programme peut subsister après la suppression du fichier.
- Les deux formes pour un même chemin. Lorsqu'un chemin possède un nom convivial sous les deux formes (profil mis à niveau), chacune donne lieu à son propre enregistrement, de sorte qu'aucune valeur n'est perdue.
- Valeurs endommagées. Une valeur qui n'est pas une chaîne, n'est pas de l'UTF-16 valide ou ne peut pas être lue intégralement conserve
ses octets (
FriendlyAppNameRaw,AppCompanyRaw) et est signalée dansProblems. De l'UTF-16 non valide peut aussi produire des caractères de remplacement dans le texte affiché ; utilisez la colonne brute pour les octets d'origine.
Analyser avec Juntei¶
Usage: juntei parse-registry muicache <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find UsrClass.dat and NTUSER.DAT hives
-f, --file <FILE> Parse one UsrClass.dat or NTUSER.DAT
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry muicache -d evidence/ -o muicache.csv
juntei parse-registry muicache -f UsrClass.dat -t jsonl \
| jq 'select(.Path | test("\\\\(Users|ProgramData|Temp)\\\\"; "i"))'
La synthèse liste les programmes situés en dehors des dossiers Windows et Program Files (dossiers utilisateur,
autres lecteurs, partages réseau) avec leurs utilisateurs, ainsi que le nombre de chaînes de ressources ignorées.
Les dossiers Program Files portant d'autres noms (sur des versions de Windows dans d'autres langues) sont également listés.
Les chemins relatifs et les chemins qui sortent d'un dossier défini par une variable d'environnement restent listés. Les chemins de lecteur
ordinaires sont vérifiés après résolution des composants . et .., sans accéder au système de fichiers
de l'examinateur.
Champs de sortie¶
| Champ | Interprétation |
|---|---|
Host, User, UserSID, SourcePath |
Hôte, nom du dossier de profil, SID de l'utilisateur (indiqué par la clé racine d'un UsrClass.dat ; à défaut, par ProfileList du système), et ruche. |
HiveType |
UsrClass.dat ou NTUSER.DAT. |
Path |
Chemin du programme : le nom de la valeur sans .FriendlyAppName ni .AppCompany. |
FriendlyAppName |
Description du programme, issue de <path>.FriendlyAppName ou de <path>. |
AppCompany |
Société du programme, issue de <path>.AppCompany (Windows 8 et versions ultérieures). |
KeyPath, KeyLastWrittenUTC |
Clé MuiCache et sa dernière écriture : la modification la plus récente de l'un quelconque de ses programmes. |
FriendlyAppNameRaw, AppCompanyRaw |
Octets de la valeur (hexadécimal), lorsqu'il ne s'agit pas d'un texte qui se décode proprement. |
TransactionLogStatus, LogsApplied |
Contexte de récupération du Registre : replayed lorsque les journaux ont écrit l'une des valeurs du programme. |
Problems |
Valeurs qui ne sont pas des chaînes, ne sont pas de l'UTF-16 valide ou sont illisibles. |
Stratégie d'investigation¶
- Examinez les programmes situés dans des emplacements accessibles en écriture par l'utilisateur (
\Users\,Downloads,Temp,ProgramData), sur d'autres lecteurs et sur des partages réseau, ainsi que les outils d'administration, d'accès à distance et d'archivage. - Comparez le nom du fichier avec son nom convivial et sa société : une incohérence peut révéler un outil renommé ou un fichier usurpant une identité.
- Corrélez avec Prefetch, BAM et UserAssist (moment de l'exécution), Amcache et ShimCache (empreinte et
présence du fichier), et la
$MFT(présence actuelle du fichier). - Utilisez
parse-registry read --recover-deletedsurUsrClass.datpour les valeurs MuiCache supprimées.