Qué cambió en Windows Prefetch v30 y v31
Los primeros cuatro bytes dentro del payload SCCA descomprimido son el número de versión. Es el campo único más útil en un archivo Prefetch. Aciertas y sabes qué layout de cabecera aplicar, cuántas ranuras de última ejecución leer y qué familia de Windows escribió el archivo:
| Version | Windows | Compression | Last-run slots |
|---|---|---|---|
| 17 | XP, Vista, 7 | None | 1 |
| 23 | Windows 8 | Xpress Huff. | 1 |
| 26 | Windows 8.1 | Xpress Huff. | 8 |
| 30 | Windows 10 | Xpress Huff. | 8 |
| 31 | Windows 11 | Xpress Huff. | 8 |
Te equivocas y el parser te entrega basura sin error, que es el modo de fallo más común.
El salto de v26: ocho tiempos de ejecución
El cambio más consecuente de la historia del formato llegó con Windows 8.1 (v26). La cabecera ganó espacio para ocho valores FILETIME de última ejecución en lugar de uno. Antes de 8.1, un .pf te decía que el binario corrió más recientemente en el momento T. Desde 8.1 obtienes una ventana móvil de las ocho ejecuciones más recientes, cada una como FILETIME de Windows (u64, ticks de 100 nanosegundos desde el 01/01/1601 UTC).
Para DFIR es la diferencia entre "el programa corrió en algún momento antes de ayer" y "el programa corrió ocho veces en los últimos tres días, en estos momentos concretos". Empareja las ocho marcas temporales con Sysmon EID 1 o Security 4688 y tienes una cronología de ejecución defendible al nivel del segundo.
Cuidado con el tope: ocho, no "al menos ocho". Si un binario corre cien veces, obtienes las ocho más recientes. Las otras 92 se pliegan en el contador de ejecuciones y por lo demás se pierden. La lectura "última ejecución hace nueve horas" de una recolección más "última ejecución hace tres minutos" de una posterior en el mismo host te dice que siguieron ocurriendo ejecuciones; la historia de ocho ranuras no te permite reconstruir la secuencia completa.
v30: Windows 10
v30 reordena offsets en la sección de información de archivo y aprieta los registros de información de volumen, pero los campos visibles externamente son los mismos que en v26: nombre de ejecutable, hash, contador de ejecuciones, ocho tiempos de última ejecución, info de volumen (ruta, serial, hora de creación) y la lista de métricas de archivos de cada DLL y recurso que el binario tocó en sus primeros diez segundos de ejecución monitorizada.
La mayoría de parsers no necesitan caminos de código radicalmente distintos dentro del payload una vez leído el número de versión. Los campos tienen el mismo ancho y significado; solo se mueven sus posiciones. PECmd maneja v30 limpiamente; también libscca y pyscca.
Vale saber en Win10 1709+: Windows empezó a expirar entradas .pf agresivamente durante el mantenimiento. Si las ocho ranuras de última ejecución de un binario solo muestran tres FILETIME poblados, eso no significa que el binario corrió tres veces. Significa al menos tres. El contador de ejecuciones es la cuenta autorizada.
v31: Windows 11
v31 es incremental sobre v30. Algunos retoques de relleno, bits adicionales en el campo de flags de prefetch. En la práctica, un parser que lee v30 correctamente leerá v31 con, como mucho, un pequeño ajuste de offset en la cabecera. Si tu cadena de herramientas dice "soporte Windows 10" pero falla con v31, la causa casi siempre es una comprobación de versión demasiado estricta (version == 30) en vez de una incompatibilidad real de layout.
En Win11 22H2 y posteriores, Prefetch en SSD queda oportunísticamente deshabilitado por partes del SO. Forense, esto es un problema de cobertura, no de layout v31: los archivos que sí obtienes son v31 válidos, solo hay menos de los que sugeriría el registro.
Qué significa esto para la triage
Cuando el parser muestra Ver. 31 puedes fiarte de la historia de últimas ejecuciones de ocho de profundidad, del contador y de la lista de métricas. Cuando muestra Ver. 17, obtienes una única marca temporal de última ejecución y el binario fue lanzado en un host XP, Vista o Win7. Encontrar un v17 en una imagen de Windows 10 u 11 es una señal fuerte de que el .pf fue traído de otro lado: no hay escenario realista en el que un host Windows moderno escriba v17 nativamente.
Versiones mezcladas en una sola carpeta Prefetch son normales en un host que ha sido actualizado entre versiones mayores; una imagen de Windows 10 con entradas v23 sobrantes de una instalación lejana de Windows 8 no es inaudita. Una imagen de Windows 11 con v17 sí lo es. El campo de versión es una de las primeras señales de triage que merece la pena escanear por toda la carpeta.
Lecturas adicionales
- Joachim Metz, documentación del formato libscca: contiene las tablas de campos por versión.
- Eric Zimmerman, PECmd: maneja correctamente cualquiera de las versiones anteriores nada más sacarlo de la caja.