TL;DR. Cada generación de Windows reescribió la estructura del AppCompatCache. XP usa un magic 0xDEADBEEF y un registro fijo de 552 bytes. Server 2003, Vista/2008, Windows 7/2008 R2 y Windows 8/8.1 tienen cada uno su propio header y diseño de entradas. Un parser debe ramificar sobre la magic del header. No hay un único formato.
La mayor parte de la documentación de ShimCache cubre el layout de Windows 10/11, porque eso es lo que ven los investigadores en estaciones de trabajo. Luego te pasan un hive SYSTEM de un domain controller Windows 7, una máquina de aplicación Server 2008 R2 o algún appliance XP ocasional que todavía corre código de negocio, y el parser moderno se niega cortésmente. Esta es la referencia para esos casos.
Por qué no hay un único formato
ShimCache es una estructura interna de Windows sin especificación pública. Microsoft la rehizo entre releases conforme evolucionaba la infraestructura de shim. El nombre y la ruta del valor de registro también se movieron. Un parser robusto identifica la versión desde el header antes de leer una sola entrada. El AppCompatCacheParser de Eric Zimmerman maneja todas las versiones. El Mandiant Shim Cache Parser maneja la mayoría. Implementar el tuyo sin un paso de detección de versión es como producir corrupción silenciosa.
Chuleta por versión
| Windows | Valor de registro | Magic del header | Forma de la entrada |
|---|---|---|---|
| XP (32 bits) | …\AppCompatibility\AppCompatCache | 0xDEADBEEF | Registros fijos de 552 bytes, máx 96 |
| Server 2003 | …\AppCompatCache\AppCompatCache | 0xBADC0FFE | Entradas de 24 bytes (x86) / 32 bytes (x64) |
| Vista / 2008 | …\AppCompatCache\AppCompatCache | 0xBADC0FFE | Como 2003, flags diferentes |
| Windows 7 / 2008 R2 | …\AppCompatCache\AppCompatCache | 0xBADC0FEE | Header de 32 bytes; las entradas llevan el flag de inserción |
| Windows 8 / 2012 | …\AppCompatCache\AppCompatCache | 0x00000080 | Firma de entrada 00ts de longitud variable |
| Windows 8.1 / 2012 R2 | …\AppCompatCache\AppCompatCache | 0x00000080 | Firma de entrada 10ts |
El diseño moderno 10ts de Windows 10/11 se detalla por separado.
XP, el bicho raro
Windows XP no se parece a nada después de él. Magic 0xDEADBEEF, registros de ancho fijo de 552 bytes, un tope duro de 96 entradas, rutas UTF-16 rellenadas hasta una longitud fija. También guardaba un timestamp de última actualización y un campo de tamaño de archivo que las versiones posteriores tiraron. Si ves 0xDEADBEEF, estás en territorio XP y nada de la lógica de parsing moderna aplica. La ruta del registro también se movió: XP guarda el valor bajo AppCompatibility, no AppCompatCache.
Windows 7, el que más te vas a encontrar
Windows 7 y Server 2008 R2 siguen siendo comunes en IR. Magic 0xBADC0FEE, header de 32 bytes y registros por entrada que incluyen la ruta, la fecha de última modificación del archivo y (de utilidad única) un flag de ejecución que se eliminó en Windows 8 y posteriores. En Windows 7, un flag de ejecución activado es una corroboración razonable de ejecución, no absoluta. No extrapoles eso a sistemas más nuevos, como se explica en ¿prueba el ShimCache la ejecución?.
Los hives de Windows 7 también van de la mano con RecentFileCache.bcf, el predecesor de AmCache. Si tienes un SYSTEM Win7, probablemente tengas un RecentFileCache.bcf útil al lado.
La transición 8 / 8.1
Windows 8 introdujo la entrada de longitud variable con una firma por entrada (00ts), y 8.1 la subió a 10ts. Este es el ancestro estructural del formato de Windows 10/11, así que un parser que maneje 8.1 está casi listo para manejar 10. La magic del header se movió a 0x00000080 (el offset de la primera entrada), que es la convención que mantuvieron los hives modernos.
Server 2003 y Vista
Magic 0xBADC0FFE. Las entradas son más pequeñas (24 bytes en x86, 32 bytes en x64). Vista añadió una palabra de flags que 2003 no tenía. Ambos son poco comunes en respuesta a incidentes moderna pero aparecen en migraciones lift-and-shift de infraestructura legacy.
Parsearlos sin toolchain
El Shimcache Parser detecta automáticamente la magic del header y ramifica al decodificador correcto para XP, 2003, Vista, 7, 8, 8.1 y 10/11. Puedes leer un hive SYSTEM legacy en el navegador sin montar tooling antiguo. Para guía de recolección en estos sistemas más antiguos, mira adquirir un hive SYSTEM. Para triage de registro más amplio en una máquina legacy, el registry parser maneja las particularidades del formato hive más antiguo.
Lectura adicional
- Caching Out the Val de Mandiant. el reverse engineering por versión original.
- AppCompatCacheParser de Eric Zimmerman. maneja todas las versiones; un buen ground truth.