TL;DR. Ogni generazione di Windows ha riscritto la struttura dell'AppCompatCache. XP usa un magic 0xDEADBEEF e un record fisso di 552 byte; Server 2003, Vista/2008, Windows 7/2008 R2 e Windows 8/8.1 hanno ciascuno il proprio header e layout di voce. Un parser deve diramare in base al magic dell'header — non esiste un formato unico.
Gran parte della documentazione ShimCache copre il layout di Windows 10/11. Ma chi risponde agli incidenti incontra ancora domain controller Windows 7, macchine Server 2008 R2 e l'occasionale apparecchio XP. La struttura su disco su quegli host è sostanzialmente diversa. Ecco il riferimento per versione.
Perché non esiste un formato unico
Lo ShimCache è una struttura interna di Windows senza specifica pubblica. Microsoft l'ha rimodellata tra le versioni man mano che l'infrastruttura di shim evolveva. Anche nome e percorso del valore di registro sono cambiati. Un parser robusto identifica la versione dall'header prima di leggere una singola voce.
Promemoria per versione
| Windows | Valore di registro | Magic dell'header | Forma della voce |
|---|---|---|---|
| XP (32 bit) | …\AppCompatibility\AppCompatCache | 0xDEADBEEF | Record fissi da 552 byte, max 96 |
| Server 2003 | …\AppCompatCache\AppCompatCache | 0xBADC0FFE | Voci da 24 byte (x86) / 32 byte (x64) |
| Vista / 2008 | …\AppCompatCache\AppCompatCache | 0xBADC0FFE | Come 2003, flag diversi |
| Windows 7 / 2008 R2 | …\AppCompatCache\AppCompatCache | 0xBADC0FEE | Header da 32 byte; le voci portano il flag d'inserimento |
| Windows 8 / 2012 | …\AppCompatCache\AppCompatCache | 0x00000080 | Firma di voce 00ts a lunghezza variabile |
| Windows 8.1 / 2012 R2 | …\AppCompatCache\AppCompatCache | 0x00000080 | Firma di voce 10ts |
(Il layout moderno 10ts/00ts di Windows 10/11 è dettagliato a parte.)
XP — il caso anomalo
Windows XP non assomiglia a nulla di ciò che è venuto dopo: un magic 0xDEADBEEF, record a larghezza fissa di 552 byte, un limite rigido di 96 voci e percorsi UTF-16 riempiti a lunghezza fissa. Memorizzava anche una marca di ultimo aggiornamento e un campo dimensione file che le versioni successive hanno abbandonato. Se vedi 0xDEADBEEF, sei in territorio XP e nessuna logica di parsing moderna si applica.
Windows 7 — quello che incontrerai di più
Windows 7 / Server 2008 R2 è ancora comune nella IR. Magic 0xBADC0FEE, header da 32 byte e record per voce che includono il percorso, la data di ultima modifica del file e — particolarmente utile — un flag di esecuzione rimosso da Windows 8 in poi. Su Windows 7 un flag impostato è una conferma ragionevole (non assoluta) dell'esecuzione; non estrapolarlo a sistemi più recenti, come spiegato in lo ShimCache prova l'esecuzione.
La transizione 8 / 8.1
Windows 8 ha introdotto la voce a lunghezza variabile con una firma per voce (00ts), e 8.1 l'ha portata a 10ts. È l'antenato strutturale del formato Windows 10/11, quindi un parser che gestisce 8.1 è a buon punto per gestire 10.
Analizzarli senza una toolchain
Lo Shimcache Parser rileva automaticamente il magic dell'header e dirama al decoder corretto per XP, 2003, Vista, 7, 8, 8.1 e 10/11 — così puoi leggere una hive SYSTEM legacy nel browser senza predisporre vecchi strumenti. Per la raccolta su questi sistemi più vecchi, vedi acquisire una hive SYSTEM.
Approfondimenti
- Mandiant: leveraging the ShimCache — il reverse engineering originale per versione.
- AppCompatCacheParser di Eric Zimmerman — gestisce ogni versione; un buon riferimento di verità.