Artefatti di Windows · Lezione 3 di 9
Esecuzione dei programmi: Prefetch, Amcache, Shimcache e BAM
11 min di lettura
"Questo programma è stato eseguito, quando e con quale utente?" è una delle domande più comuni in un'indagine su Windows. Nessun singolo artefatto risponde a tutte e tre le parti. Questa lezione tratta i principali artefatti di esecuzione su Windows 10 e 11: dove si trova ciascuno in una raccolta di triage, quali timestamp contiene e che cosa dimostra e non dimostra. Il metodo consiste nell'indicare un orario di esecuzione solo sulla base di un artefatto che registra l'esecuzione e nel corroborarlo con gli altri.
Prefetch
Il prefetcher accelera l'avvio dei programmi registrando ciò che un eseguibile carica. A ogni eseguibile viene associato un file C:\Windows\Prefetch\<EXENAME>-<HASH>.pf, ad esempio XFER.EXE-1A2B3C4D.pf. L'hash di 8 cifre esadecimali viene calcolato a partire dal percorso completo dell'eseguibile e, per i processi host come svchost.exe, rundll32.exe e dllhost.exe, anche dalla riga di comando. Per gli altri eseguibili, quindi, lo stesso nome con hash diversi indica che il programma è stato eseguito da percorsi diversi, un aspetto spesso rilevante: SVCHOST.EXE al di fuori di System32 è sospetto.
Formato
Su Windows 10 e 11 i file .pf sono compressi. Iniziano con la firma MAM seguita da un byte il cui nibble meno significativo pari a 4 indica XPRESS Huffman (solitamente 0x04), quindi dalla dimensione non compressa; pertanto, un editor esadecimale non mostra nulla di leggibile finché uno strumento non li decomprime. Dopo la decompressione, l'intestazione inizia con la versione del formato all'offset 0 (30, ossia 0x1E, su Windows 10 e 11; alcune build di Windows 11 usano 31, quindi è opportuno aspettarsi una "versione 30 o successiva"), la firma SCCA all'offset 4, il nome dell'eseguibile in UTF-16 all'offset 0x10 e l'hash del percorso all'offset 0x4C. L'analisi di un file fornisce:
- il conteggio delle esecuzioni;
- fino a 8 orari delle ultime esecuzioni (FILETIME, UTC), dal più recente;
- i file e le directory referenziati durante circa i primi dieci secondi di esecuzione, spesso inclusi DLL, file di dati e il percorso completo del programma stesso;
- informazioni sul volume: percorso del dispositivo, numero di serie del volume e ora di creazione del volume.
Il file .pf viene scritto circa dieci secondi dopo l'avvio del programma. I suoi timestamp del file system sono quindi utili: ora di creazione ≈ prima esecuzione (la prima esecuzione avviene circa 10 secondi prima) e ora di modifica ≈ ultima esecuzione. Questo aspetto è importante quando il conteggio delle esecuzioni supera 8 e gli orari delle esecuzioni più vecchie non sono più conservati.
Impostazioni e limiti
Prefetch è controllato da EnablePrefetcher in SYSTEM\ControlSet001\Control\Session Manager\Memory Management\PrefetchParameters (0 disabilitato, 1 avvio delle applicazioni, 2 solo avvio del sistema, 3 entrambi). Le versioni client di Windows lo abilitano per impostazione predefinita; in Windows Server il prefetching delle applicazioni è solitamente disabilitato. Da Windows 8 la cartella contiene fino a 1.024 file .pf e quelli più vecchi vengono eliminati. In un hive offline non esiste CurrentControlSet; leggere SYSTEM\Select\Current per scegliere il ControlSet00x corretto (Lezione 2.1).
Dimostra: che l'eseguibile in quel percorso è stato avviato, quante volte e quando. Non dimostra: quale utente lo abbia eseguito, se abbia completato la propria attività o che non sia mai stato eseguito in precedenza (un file .pf eliminato o rimosso dalla cache cancella la cronologia). PECmd è un esempio di parser.
Amcache.hve
C:\Windows\AppCompat\Programs\Amcache.hve è un hive in formato registro con i propri log delle transazioni, Amcache.hve.LOG1 e .LOG2; acquisirli tutti e tre e applicare i log prima dell'analisi. Nelle build attuali di Windows 10 e 11, i file sono elencati in Root\InventoryApplicationFile, con una sottochiave per ogni file e valori quali:
| Valore | Significato |
|---|---|
LowerCaseLongPath | Percorso completo in minuscolo |
Name, Publisher, Version | Dalla risorsa di versione PE (possono essere vuoti) |
Size | Dimensione del file in byte |
LinkDate | Ora di compilazione nell'intestazione PE (impostata dal linker, può essere falsificata) |
FileId | 0000 seguito dallo SHA-1 del file |
ProgramId | Collegamento a un programma installato in Root\InventoryApplication |
Lo SHA-1 copre l'intero file solo fino a 31.457.280 byte (30 MiB); per un file più grande copre i primi 31.457.280 byte, quindi l'hash dell'intero file non corrisponderà. Root\InventoryApplication elenca i programmi installati con nome, autore, versione e informazioni di installazione. Le build precedenti utilizzavano invece Root\File.
La precisazione importante: su Windows 10 e 11, Amcache viene popolato da attività di inventario che esaminano i programmi e i file installati, quindi una voce indica che il file era presente ed è stato inventariato, non necessariamente che sia stato eseguito. Il timestamp LastWrite della chiave di una voce indica quando Windows ha scritto la voce, non un orario di esecuzione. Considerare Amcache una solida evidenza di supporto e utilizzare il suo SHA-1 per identificare l'esatto binario, anche dopo l'eliminazione del file. AmcacheParser è un esempio di strumento.
Shimcache (AppCompatCache)
La cache di compatibilità delle applicazioni è memorizzata in SYSTEM\ControlSet001\Control\Session Manager\AppCompatCache, nel valore AppCompatCache, come un unico blocco di dati binari. Su Windows 10 e 11 ogni voce inizia con la firma 10ts e contiene il percorso del file e l'ora dell'ultima modifica del file ricavata da $STANDARD_INFORMATION. Tale ora non è un orario di esecuzione e su Windows 10 e 11 non esiste un flag affidabile che indichi che il file è stato eseguito. Le voci sono ordinate dalla più recente, quindi la posizione può aiutare a ordinare gli eventi, e la cache contiene fino a 1.024 voci.
La cache risiede in memoria e viene scritta nell'hive all'arresto o al riavvio. Una raccolta di triage acquisita da un sistema in esecuzione contiene quindi la cache nello stato in cui si trovava all'ultimo arresto: i programmi recenti potrebbero mancare (l'analisi della memoria nel Modulo 5 può recuperarli). Dimostra: che un file esisteva in quel percorso con quell'ora di modifica. Non dimostra: l'esecuzione o un orario di esecuzione. AppCompatCacheParser è un esempio di strumento.
BAM e DAM
Background Activity Moderator, un servizio introdotto con Windows 10 versione 1709, mantiene un elenco per utente nell'hive SYSTEM:
SYSTEM\ControlSet001\Services\bam\State\UserSettings\<SID>(build più recenti di Windows 10 e Windows 11);SYSTEM\ControlSet001\Services\bam\UserSettings\<SID>nelle build precedenti di Windows 10.
Ogni valore ha come nome il percorso completo del dispositivo, ad esempio \Device\HarddiskVolume3\Users\ana\Downloads\xfer.exe, e i primi 8 byte dei dati sono un FILETIME (UTC) dell'ultima esecuzione del programma. Associare il volume a una lettera di unità usando gli altri artefatti; il volume di Windows è solitamente C:. Poiché la chiave è specifica per SID, BAM, come UserAssist descritto più avanti, collega un'esecuzione a un account utente (la Lezione 2.2 tratta la risoluzione dei SID). Le voci vengono ripulite: quelle più vecchie di circa una settimana e quelle relative a eseguibili eliminati possono scomparire all'avvio, quindi l'assenza dimostra ben poco. L'orario può differire di alcuni secondi o più rispetto all'orario di esecuzione di Prefetch. Desktop Activity Moderator (Services\dam\...) utilizza la stessa struttura e compare principalmente sui dispositivi con standby moderno.
UserAssist
NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count registra i programmi avviati dall'utente tramite Explorer: menu Start, desktop, doppio clic. {CEBFF5CD-ACE2-4F4F-9178-9926F41749EA} contiene gli eseguibili e {F4E57C4B-2036-45F0-A9AB-443BCFE33D9F} contiene i collegamenti. I nomi dei valori sono codificati in ROT13: P:\Hfref\nan\Qbjaybnqf\ksre.rkr viene decodificato in C:\Users\ana\Downloads\xfer.exe. Le cartelle note sono rappresentate come GUID, ad esempio {1AC14E77-02E7-4E5D-B744-2EB1AE5198B7} per System32. I dati di 72 byte contengono il conteggio delle esecuzioni (offset 4), il conteggio delle acquisizioni del focus (offset 8), il tempo di permanenza del focus in millisecondi (offset 12) e il FILETIME dell'ultima esecuzione (offset 60). Dimostra un avvio tramite interfaccia grafica da parte di quell'utente, ma i programmi avviati da riga di comando, da uno script o da un servizio non compaiono.
Log di Program Compatibility Assistant (Windows 11)
Windows 11 22H2 e versioni successive scrivono file di testo semplice in C:\Windows\appcompat\pca\. PcaAppLaunchDic.txt contiene una riga per eseguibile: percorso completo, | e un orario dell'ultimo avvio in UTC, ad esempio C:\Users\ana\Downloads\xfer.exe|2026-03-14 10:42:17.130. Le ricerche pubbliche mostrano che queste righe tracciano i programmi avviati tramite Explorer, ma il formato non è documentato e non tutti i processi compaiono. Considerare una riga un'evidenza di esecuzione da corroborare e la sua assenza priva di significato.
Confronto
| Artefatto | Posizione | Significato del timestamp | Dimostra l'esecuzione? |
|---|---|---|---|
| Prefetch | C:\Windows\Prefetch\*.pf | Fino a 8 ultime esecuzioni; creazione del .pf ≈ prima esecuzione, modifica ≈ ultima esecuzione | Sì (senza utente) |
| Amcache | C:\Windows\AppCompat\Programs\Amcache.hve | LastWrite della chiave = scrittura della voce; LinkDate = ora di compilazione | No, la supporta; fornisce lo SHA-1 |
| Shimcache | SYSTEM ...\Session Manager\AppCompatCache | Ora dell'ultima modifica del file in $SI | No, solo presenza |
| BAM | SYSTEM ...\Services\bam\State\UserSettings\<SID> | Ultima esecuzione | Sì, per utente |
| UserAssist | NTUSER.DAT ...\Explorer\UserAssist\{GUID}\Count | Ultimo avvio tramite interfaccia grafica | Sì, avvii tramite interfaccia grafica da parte di quell'utente |
| PCA | C:\Windows\appcompat\pca\PcaAppLaunchDic.txt | Ultimo avvio (testo in UTC) | La supporta; da corroborare |
Esempio svolto: quando è stato eseguito xfer.exe?
La raccolta di triage di un portatile Windows 11 contiene C:\Windows\Prefetch\XFER.EXE-1A2B3C4D.pf (il valore dell'hash qui è illustrativo).
Prefetch. PECmd riporta la versione 30, un conteggio delle esecuzioni pari a 3 e il percorso referenziato \VOLUME{…}\USERS\ANA\DOWNLOADS\XFER.EXE. L'orario di esecuzione più recente è FILETIME 0x01DCB39F3A299D50 = 134.179.585.371.250.000. Dividendo per 10.000.000 si ottengono 13.417.958.537,125 s dal 1601-01-01; sottraendo 11.644.473.600 s (dal 1601 al 1970) si ottiene il tempo Unix 1.773.484.937,125, ossia 2026-03-14T10:42:17.125Z. Gli altri orari di esecuzione sono 2026-03-14T10:05:33Z e 2026-03-13T16:20:02Z. Il file .pf è stato creato alle 2026-03-13T16:20:12Z (10 s dopo la prima esecuzione) e modificato alle 2026-03-14T10:42:27Z, entrambi coerenti.
BAM. In bam\State\UserSettings\S-1-5-21-…-1001, il valore \Device\HarddiskVolume3\Users\ana\Downloads\xfer.exe inizia con 50 AB 50 41 9F B3 DC 01. Letto in little-endian, corrisponde a 0x01DCB39F4150AB50 = 134.179.585.491.250.000, ossia 2026-03-14T10:42:29.125Z: 12 secondi dopo l'ultima esecuzione indicata da Prefetch, e associato al RID 1001, l'account ana.
Amcache. Una voce InventoryApplicationFile ha LowerCaseLongPath pari a c:\users\ana\downloads\xfer.exe, Size pari a 1.482.752 (inferiore a 31.457.280, quindi lo SHA-1 copre l'intero file), Publisher vuoto e FileId pari a 00003f2a9c1e7b0d4e85a6c2f19b0e7d3a5c48b1f6e2. Rimuovendo 0000 rimane lo SHA-1 di 40 cifre esadecimali 3f2a9c1e7b0d4e85a6c2f19b0e7d3a5c48b1f6e2, che è possibile confrontare con una copia nell'immagine dell'unità USB o con un database di malware.
L'insidia. Shimcache elenca C:\Users\ana\Downloads\xfer.exe con l'orario 2026-03-13T16:18:40Z. Si tratta dell'ora dell'ultima modifica del file, molto probabilmente del momento in cui è stato scritto il download, e corrisponde all'ora di modifica $SI nella $MFT. Non è un orario di esecuzione: la risposta a "quando è stato eseguito xfer.exe per la prima volta?" è 2026-03-13T16:20:02Z da Prefetch, non 16:18:40Z.
Focus sull'esame: È possibile che venga richiesto di riportare l'orario della prima o dell'ultima esecuzione da Prefetch in UTC, uno SHA-1 daFileIddi Amcache (senza il prefisso0000) o il SID che BAM associa a un programma. Le domande verificheranno probabilmente quali timestamp indicano l'esecuzione: gli orari di Shimcache sono orari di modifica dei file e le voci di Amcache indicano la presenza. Due file .pf con lo stesso nome e hash diversi indicano due percorsi, a meno che il programma non sia un processo host come svchost.exe.
Punti chiave
- Prefetch (
EXENAME-HASH.pf, compresso con MAM, versione 30 o successiva) fornisce il conteggio delle esecuzioni, fino a 8 orari di esecuzione, i file referenziati e i dati del volume; l'hash dipende dal percorso. - L'ora di creazione del file .pf è circa 10 secondi dopo la prima esecuzione e l'ora di modifica circa 10 secondi dopo l'ultima esecuzione.
InventoryApplicationFiledi Amcache fornisce percorso, dimensione, LinkDate e SHA-1 (FileIdsenza0000, primi 31.457.280 byte), ma indica la presenza, non l'esecuzione.- Shimcache registra il percorso e l'ora di modifica $SI, viene scritto all'arresto e non dispone di un flag di esecuzione affidabile su Windows 10 e 11.
- BAM fornisce un FILETIME dell'ultima esecuzione per SID utente; UserAssist fornisce gli avvii tramite interfaccia grafica codificati in ROT13 per utente; i log PCA su Windows 11 22H2+ aggiungono una registrazione testuale da corroborare.