Comment est calculé le hash Windows Prefetch
Chaque fichier Prefetch présent dans C:\Windows\Prefetch\ porte un nom du
type NOTEPAD.EXE-1B4A5887.pf. Les huit caractères hexadécimaux à la fin
ne constituent pas un checksum du contenu du fichier : il s'agit d'un hash
calculé sur le chemin complet de l'exécutable, encodé en UTF-16. Deux
copies de notepad.exe lancées depuis C:\Windows\System32\ et
C:\Users\analyst\notepad.exe produiront deux fichiers .pf distincts,
parce que leurs chemins diffèrent, et ce même si le binaire est strictement
identique octet pour octet.
Trois algorithmes, trois époques
La fonction de hachage a évolué en même temps que Windows :
- Windows XP / Server 2003 — le hash SuperFetch d'origine, un simple calcul roulant appliqué à la chaîne de caractères du chemin en UTF-16.
- Windows Vista / 2008 — même famille, mais avec un multiplicateur constant différent et une graine de départ différente. Un fichier Prefetch issu de l'ère Vista ne peut pas être recalculé avec la fonction XP, et inversement.
- Windows 7 et versions ultérieures — « Hash function 5 » dans la terminologie de Microsoft, toujours utilisée par Windows 10 et 11. Elle enchaîne des groupes d'octets issus du chemin UTF-16 dans une boucle multiplication-XOR, masque le résultat sur 32 bits, puis le tronque aux 32 bits inférieurs pour former le suffixe du nom de fichier Prefetch.
La chaîne de chemin transmise aux trois algorithmes inclut un préfixe
\DEVICE\HARDDISK et le chemin du fichier encodé en majuscules au format
UTF-16 (LE), avec quelques subtilités liées au format des volumes et aux
arguments de ligne de commande sur les versions plus récentes de Windows.
Pourquoi cela compte pour un enquêteur
Un fichier Prefetch implanté est l'une des techniques anti-forensiques les
plus simples. Si vous soupçonnez une manipulation, recalculez le hash
attendu pour le chemin de l'exécutable et comparez-le au nom de fichier.
Une différence est un indice fort que le .pf n'a pas été généré sur ce
système : soit il a été copié depuis une autre machine, soit il a été
fabriqué à la main par un attaquant peu rigoureux.
Corollaire : lorsqu'un exécutable se trouve dans un emplacement inhabituel (un répertoire de profil, un dossier temporaire, une lettre de volume USB), le hash constitue la preuve la plus directe de l'endroit d'où il a été lancé. Le chemin lui-même n'est plus présent dans la charge utile du Prefetch — seul le numéro de série du volume y figure — et le hash demeure donc bien souvent la seule trace résiduelle de l'emplacement exact de l'exécution.
Notes d'implémentation
Des implémentations open source des trois fonctions de hachage sont
disponibles dans la documentation de libscca de libyal ainsi que dans
la crate Rust frnsc-prefetch qui alimente cet outil. Si vous écrivez
un script d'analyse forensique, les fonctions Vista et Windows 7+ sont
suffisamment courtes pour être intégrées directement — une douzaine de
lignes chacune — sans avoir à ajouter de dépendance.
Ce parseur ne vérifie pas le hash par défaut ; il se contente d'afficher la valeur extraite du nom de fichier afin que vous puissiez la vérifier manuellement. Une future mise à jour permettra de signaler en option les incohérences avec le chemin d'exécutable analysé.