Artéfacts Windows · Leçon 3 sur 9
Exécution des programmes : Prefetch, Amcache, Shimcache et BAM
12 min de lecture
« Ce programme a-t-il été exécuté, quand et sous quel compte utilisateur ? » est l’une des questions les plus fréquentes dans une investigation Windows. Aucun artefact ne répond à lui seul à ces trois volets. Cette leçon présente les principaux artefacts d’exécution sous Windows 10 et 11 : où chacun se trouve dans une collecte de triage, quels horodatages il contient, ce qu’il prouve et ce qu’il ne prouve pas. La méthode consiste à n’affirmer une heure d’exécution qu’à partir d’un artefact qui enregistre l’exécution, puis à la corroborer avec les autres.
Prefetch
Le mécanisme de préchargement accélère le démarrage des programmes en enregistrant ce qu’un exécutable charge. Chaque exécutable dispose d’un fichier C:\Windows\Prefetch\<EXENAME>-<HASH>.pf, par exemple XFER.EXE-1A2B3C4D.pf. L’empreinte de 8 chiffres hexadécimaux est calculée à partir du chemin complet de l’exécutable et, pour les processus hôtes tels que svchost.exe, rundll32.exe et dllhost.exe, également à partir de la ligne de commande. Pour les autres exécutables, un même nom associé à des empreintes différentes signifie donc que le programme a été exécuté depuis des chemins différents, ce qui est souvent important : la présence de SVCHOST.EXE en dehors de System32 est suspecte.
Format
Sous Windows 10 et 11, les fichiers .pf sont compressés. Ils commencent par la signature MAM, suivie d’un octet dont le quartet de poids faible égal à 4 indique XPRESS Huffman (généralement 0x04), puis de la taille décompressée ; un éditeur hexadécimal n’affiche donc rien de lisible tant qu’un outil ne les a pas décompressés. Après décompression, l’en-tête commence par la version du format au décalage 0 (30, soit 0x1E, sous Windows 10 et 11 ; certaines versions de Windows 11 utilisent 31, attendez-vous donc à « version 30 ou ultérieure »), la signature SCCA au décalage 4, le nom de l’exécutable en UTF-16 au décalage 0x10 et l’empreinte du chemin au décalage 0x4C. Une fois analysé, un fichier fournit :
- le nombre d’exécutions ;
- jusqu’à 8 dernières heures d’exécution (FILETIME, UTC), de la plus récente à la plus ancienne ;
- les fichiers et répertoires référencés pendant environ les dix premières secondes d’exécution, comprenant souvent des DLL, des fichiers de données et le chemin complet du programme lui-même ;
- des informations sur le volume : chemin de périphérique, numéro de série du volume et heure de création du volume.
Le fichier .pf est écrit environ dix secondes après le démarrage du programme. Ses propres horodatages dans le système de fichiers sont donc utiles : heure de création ≈ première exécution (la première exécution a lieu environ 10 secondes plus tôt) et heure de modification ≈ dernière exécution. Cela importe lorsque le nombre d’exécutions dépasse 8 et que les heures d’exécution les plus anciennes ne sont plus conservées.
Paramètres et limites
Prefetch est contrôlé par EnablePrefetcher sous SYSTEM\ControlSet001\Control\Session Manager\Memory Management\PrefetchParameters (0 : désactivé, 1 : lancement des applications, 2 : démarrage uniquement, 3 : les deux). Les éditions clientes de Windows l’activent par défaut ; sous Windows Server, le préchargement des applications est généralement désactivé. Depuis Windows 8, le dossier contient jusqu’à 1 024 fichiers .pf et les plus anciens sont supprimés. Dans une ruche hors ligne, il n’existe pas de CurrentControlSet ; lisez SYSTEM\Select\Current pour choisir le bon ControlSet00x (leçon 2.1).
Prouve : que l’exécutable situé à ce chemin a été lancé, combien de fois et quand. Ne prouve pas : quel utilisateur l’a exécuté, s’il a terminé sa tâche ou s’il n’avait jamais été exécuté auparavant (un fichier .pf supprimé ou évincé efface l’historique). PECmd est un exemple d’outil d’analyse.
Amcache.hve
C:\Windows\AppCompat\Programs\Amcache.hve est une ruche au format du Registre possédant ses propres journaux de transactions, Amcache.hve.LOG1 et .LOG2 ; collectez les trois et rejouez les journaux avant l’analyse. Dans les versions actuelles de Windows 10 et 11, les fichiers sont répertoriés sous Root\InventoryApplicationFile, avec une sous-clé par fichier et des valeurs telles que :
| Valeur | Signification |
|---|---|
LowerCaseLongPath | Chemin complet en minuscules |
Name, Publisher, Version | Issus de la ressource de version PE (peuvent être vides) |
Size | Taille du fichier en octets |
LinkDate | Heure de compilation de l’en-tête PE (définie par l’éditeur de liens, peut être falsifiée) |
FileId | 0000 suivi du SHA-1 du fichier |
ProgramId | Renvoie à un programme installé dans Root\InventoryApplication |
Le SHA-1 couvre le fichier entier uniquement jusqu’à 31 457 280 octets (30 MiB) ; pour un fichier plus volumineux, il couvre les 31 457 280 premiers octets, de sorte que le calcul de l’empreinte du fichier entier ne donnera pas le même résultat. Root\InventoryApplication répertorie les programmes installés avec leur nom, leur éditeur, leur version et leurs informations d’installation. Les versions plus anciennes utilisaient plutôt Root\File.
Point important : sous Windows 10 et 11, Amcache est alimenté par des tâches d’inventaire qui examinent les programmes et fichiers installés ; une entrée indique donc que le fichier était présent et a été inventorié, mais pas nécessairement qu’il a été exécuté. L’heure LastWrite de la clé d’une entrée correspond au moment où Windows a écrit l’entrée, et non à une heure d’exécution. Considérez Amcache comme un élément de corroboration solide et utilisez son SHA-1 pour identifier précisément le binaire, même après la suppression du fichier. AmcacheParser est un exemple d’outil.
Shimcache (AppCompatCache)
Le cache de compatibilité des applications est stocké dans SYSTEM\ControlSet001\Control\Session Manager\AppCompatCache, dans la valeur AppCompatCache, sous la forme d’un bloc binaire unique. Sous Windows 10 et 11, chaque entrée commence par la signature 10ts et contient le chemin du fichier ainsi que son heure de dernière modification issue de $STANDARD_INFORMATION. Cette heure n’est pas une heure d’exécution et, sous Windows 10 et 11, aucun indicateur fiable ne montre que le fichier a été exécuté. Les entrées sont classées de la plus récente à la plus ancienne ; leur position peut donc aider à ordonner les événements, et le cache contient jusqu’à 1 024 entrées.
Le cache réside en mémoire et est écrit dans la ruche lors de l’arrêt ou du redémarrage. Une collecte de triage effectuée sur un système en cours d’exécution contient donc le cache tel qu’il était au dernier arrêt : des programmes récents peuvent en être absents (l’analyse de la mémoire abordée dans le module 5 peut les récupérer). Prouve : qu’un fichier existait à ce chemin avec cette heure de modification. Ne prouve pas : une exécution ou une heure d’exécution. AppCompatCacheParser est un exemple d’outil.
BAM et DAM
Le Background Activity Moderator, un service présent depuis Windows 10 version 1709, conserve une liste par utilisateur dans la ruche SYSTEM :
SYSTEM\ControlSet001\Services\bam\State\UserSettings\<SID>(versions ultérieures de Windows 10 et Windows 11) ;SYSTEM\ControlSet001\Services\bam\UserSettings\<SID>dans les versions plus anciennes de Windows 10.
Chaque valeur porte comme nom le chemin de périphérique complet, tel que \Device\HarddiskVolume3\Users\ana\Downloads\xfer.exe, et les 8 premiers octets des données sont un FILETIME (UTC) de la dernière exécution du programme. Associez le volume à une lettre de lecteur à l’aide des autres artefacts ; le volume Windows est généralement C:. Comme la clé est propre à chaque SID, BAM, à l’instar de UserAssist ci-dessous, relie une exécution à un compte utilisateur (la leçon 2.2 explique la résolution des SID). Les entrées font l’objet d’un nettoyage : celles datant de plus d’une semaine environ et celles correspondant à des exécutables supprimés peuvent disparaître au démarrage ; leur absence ne prouve donc pas grand-chose. L’heure peut différer de quelques secondes ou davantage de l’heure d’exécution Prefetch. Le Desktop Activity Moderator (Services\dam\...) utilise la même structure et apparaît principalement sur les appareils dotés de la veille moderne.
UserAssist
NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count enregistre les programmes que l’utilisateur a lancés via l’Explorateur : menu Démarrer, bureau, double-clic. {CEBFF5CD-ACE2-4F4F-9178-9926F41749EA} contient les exécutables et {F4E57C4B-2036-45F0-A9AB-443BCFE33D9F} les raccourcis. Les noms des valeurs sont encodés en ROT13 : P:\Hfref\nan\Qbjaybnqf\ksre.rkr se décode en C:\Users\ana\Downloads\xfer.exe. Les dossiers connus apparaissent sous forme de GUID, par exemple {1AC14E77-02E7-4E5D-B744-2EB1AE5198B7} pour System32. Les données de 72 octets contiennent le nombre d’exécutions (décalage 4), le nombre de prises de focus (décalage 8), la durée de focus en millisecondes (décalage 12) et le FILETIME de la dernière exécution (décalage 60). Cet artefact prouve un lancement par cet utilisateur depuis l’interface graphique, mais les programmes démarrés depuis une ligne de commande, un script ou un service n’y apparaissent pas.
Journaux du Program Compatibility Assistant (Windows 11)
Windows 11 22H2 et les versions ultérieures écrivent des fichiers en texte brut dans C:\Windows\appcompat\pca\. PcaAppLaunchDic.txt contient une ligne par exécutable : le chemin complet, | et une heure de dernier lancement en UTC, telle que C:\Users\ana\Downloads\xfer.exe|2026-03-14 10:42:17.130. Les recherches publiques montrent que ces lignes suivent les programmes lancés via l’Explorateur, mais le format n’est pas documenté et tous les processus n’y apparaissent pas. Considérez une ligne comme un élément de preuve d’exécution à corroborer, et son absence comme non significative.
Comparaison
| Artefact | Emplacement | Signification de l’horodatage | Prouve l’exécution ? |
|---|---|---|---|
| Prefetch | C:\Windows\Prefetch\*.pf | Jusqu’à 8 dernières exécutions ; création du .pf ≈ première exécution, modification ≈ dernière exécution | Oui (sans utilisateur) |
| Amcache | C:\Windows\AppCompat\Programs\Amcache.hve | LastWrite de la clé = écriture de l’entrée ; LinkDate = heure de compilation | Non, la corrobore ; fournit le SHA-1 |
| Shimcache | SYSTEM ...\Session Manager\AppCompatCache | Heure de dernière modification $SI du fichier | Non, présence uniquement |
| BAM | SYSTEM ...\Services\bam\State\UserSettings\<SID> | Dernière exécution | Oui, par utilisateur |
| UserAssist | NTUSER.DAT ...\Explorer\UserAssist\{GUID}\Count | Dernier lancement depuis l’interface graphique | Oui, lancements depuis l’interface graphique par cet utilisateur |
| PCA | C:\Windows\appcompat\pca\PcaAppLaunchDic.txt | Dernier lancement (texte en UTC) | Élément à l’appui ; à corroborer |
Exemple détaillé : quand xfer.exe a-t-il été exécuté ?
La collecte de triage d’un ordinateur portable sous Windows 11 contient C:\Windows\Prefetch\XFER.EXE-1A2B3C4D.pf (la valeur de l’empreinte est ici donnée à titre d’illustration).
Prefetch. PECmd indique la version 30, un nombre d’exécutions de 3 et le chemin référencé \VOLUME{…}\USERS\ANA\DOWNLOADS\XFER.EXE. L’heure d’exécution la plus récente est le FILETIME 0x01DCB39F3A299D50 = 134 179 585 371 250 000. La division par 10 000 000 donne 13 417 958 537,125 s depuis le 1601-01-01 ; la soustraction de 11 644 473 600 s (de 1601 à 1970) donne l’heure Unix 1 773 484 937,125, soit 2026-03-14T10:42:17.125Z. Les autres heures d’exécution sont 2026-03-14T10:05:33Z et 2026-03-13T16:20:02Z. Le fichier .pf a été créé à 2026-03-13T16:20:12Z (10 s après la première exécution) et modifié à 2026-03-14T10:42:27Z, deux valeurs cohérentes.
BAM. Sous bam\State\UserSettings\S-1-5-21-…-1001, la valeur \Device\HarddiskVolume3\Users\ana\Downloads\xfer.exe commence par 50 AB 50 41 9F B3 DC 01. Lue en petit-boutiste, elle correspond à 0x01DCB39F4150AB50 = 134 179 585 491 250 000, soit 2026-03-14T10:42:29.125Z : 12 secondes après la dernière exécution Prefetch, et associée au RID 1001, le compte ana.
Amcache. Une entrée InventoryApplicationFile possède un LowerCaseLongPath égal à c:\users\ana\downloads\xfer.exe, un Size de 1 482 752 (inférieur à 31 457 280, le SHA-1 couvre donc le fichier entier), un Publisher vide et un FileId égal à 00003f2a9c1e7b0d4e85a6c2f19b0e7d3a5c48b1f6e2. Après suppression de 0000, il reste le SHA-1 de 40 chiffres hexadécimaux 3f2a9c1e7b0d4e85a6c2f19b0e7d3a5c48b1f6e2, que vous pouvez comparer à celui d’une copie présente dans l’image de la clé USB ou dans une base de données de logiciels malveillants.
Le piège. Shimcache répertorie C:\Users\ana\Downloads\xfer.exe avec l’heure 2026-03-13T16:18:40Z. Il s’agit de l’heure de dernière modification du fichier, très probablement celle de l’écriture du téléchargement, et elle correspond à l’heure de modification $SI dans la $MFT. Ce n’est pas une heure d’exécution : la réponse à « quand xfer.exe a-t-il été exécuté pour la première fois ? » est 2026-03-13T16:20:02Z d’après Prefetch, et non 16:18:40Z.
Points clés pour l'examen : Attendez-vous à devoir indiquer une heure de première ou de dernière exécution en UTC à partir de Prefetch, un SHA-1 issu duFileIdd’Amcache (sans le préfixe0000) ou le SID que BAM associe à un programme. Les questions porteront probablement sur les horodatages qui indiquent une exécution : ceux de Shimcache sont des heures de modification de fichiers et les entrées Amcache indiquent une présence. Deux fichiers .pf portant le même nom et des empreintes différentes indiquent deux chemins, sauf si le programme est un processus hôte tel que svchost.exe.
Points essentiels
- Prefetch (
EXENAME-HASH.pf, compressé avec MAM, version 30 ou ultérieure) fournit le nombre d’exécutions, jusqu’à 8 heures d’exécution, les fichiers référencés et les données du volume ; l’empreinte dépend du chemin. - L’heure de création du fichier .pf se situe environ 10 secondes après la première exécution et son heure de modification environ 10 secondes après la dernière exécution.
- L’entrée
InventoryApplicationFiled’Amcache fournit le chemin, la taille, LinkDate et le SHA-1 (FileIdsans0000, 31 457 280 premiers octets), mais indique la présence, pas l’exécution. - Shimcache enregistre le chemin et l’heure de modification $SI, est écrit à l’arrêt et ne dispose d’aucun indicateur d’exécution fiable sous Windows 10 et 11.
- BAM fournit un FILETIME de dernière exécution par SID utilisateur ; UserAssist fournit les lancements depuis l’interface graphique par utilisateur, avec des noms encodés en ROT13 ; les journaux PCA sous Windows 11 22H2+ ajoutent un enregistrement textuel à corroborer.