Cómo se calcula el hash de Windows Prefetch
Cada archivo prefetch dentro de C:\Windows\Prefetch\ recibe un nombre del estilo
NOTEPAD.EXE-1B4A5887.pf. Los ocho caracteres hexadecimales finales no son una
suma de verificación del contenido del archivo: son un hash de la ruta completa
del ejecutable, codificada como UTF-16. Dos copias de notepad.exe lanzadas desde
C:\Windows\System32\ y desde C:\Users\analyst\notepad.exe generan dos archivos
.pf distintos porque sus rutas difieren, aunque el binario sea idéntico byte a
byte.
Tres algoritmos, tres épocas
La función de hash fue cambiando junto con el propio Windows:
- Windows XP / Server 2003: el hash original de SuperFetch, un cálculo rotativo simple sobre la cadena de la ruta en UTF-16.
- Windows Vista / 2008: la misma familia, pero con un multiplicador constante distinto y una semilla inicial diferente. Los archivos prefetch de la era Vista no pueden recalcularse con la función de XP, ni viceversa.
- Windows 7 en adelante: la llamada "Hash function 5" en la terminología de Microsoft, que sigue en uso en Windows 10 y 11. Procesa grupos de bytes de la ruta UTF-16 mediante un bucle de multiplicación y XOR, enmascara el resultado a 32 bits y luego lo trunca a los 32 bits inferiores para formar el sufijo del nombre del archivo prefetch.
La cadena de ruta que alimenta a los tres algoritmos incluye un prefijo
\DEVICE\HARDDISK y la ruta del archivo codificada en UTF-16 (LE) en mayúsculas,
con algunas peculiaridades en cuanto al formato del volumen y los argumentos de
línea de comandos en las versiones más recientes de Windows.
Por qué le importa al investigador
Un archivo prefetch plantado es uno de los trucos antiforenses más sencillos. Si
sospechas que ha habido manipulación, recalcula el hash esperado para la ruta del
ejecutable y compáralo con el del nombre del archivo. Una discrepancia es una
señal clara de que ese .pf no se originó en este sistema: o fue copiado desde
otra máquina, o fue fabricado a mano por un atacante poco cuidadoso.
El corolario es el siguiente: cuando un ejecutable reside en una ruta inusual (un directorio de perfil, una carpeta temporal, una letra de volumen USB), el hash es la evidencia más directa de desde dónde se ejecutó. La ruta en sí ya no está presente dentro del payload del prefetch —solo aparece el número de serie del volumen—, por lo que el hash suele ser la única huella que sobrevive de la ubicación exacta de ejecución.
Notas de implementación
Existen implementaciones de código abierto de los tres algoritmos de hash en la
documentación de libscca de libyal y en el crate de Rust frnsc-prefetch que
da vida a esta herramienta. Si estás programando un pipeline forense, las
funciones de Vista y Windows 7+ son lo bastante cortas como para integrarlas
directamente —apenas una docena de líneas cada una— sin añadir una dependencia.
Este parser no verifica el hash por defecto; expone el valor extraído del nombre del archivo para que puedas contrastarlo manualmente. Una próxima actualización permitirá, de forma opcional, marcar las discrepancias respecto a la ruta del ejecutable que se ha parseado.