Was sich bei Windows Prefetch v30 und v31 änderte
Die ersten vier Bytes im entpackten SCCA-Payload sind die Versionsnummer. Sie ist das nützlichste einzelne Feld in einer Prefetch-Datei. Bekommen Sie sie richtig, und Sie wissen, welches Header-Layout anzuwenden ist, wie viele Last-Run-Slots zu lesen sind und welche Windows-Familie die Datei geschrieben hat:
| 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 |
Bekommen Sie sie falsch, und der Parser reicht Ihnen ohne Fehler Müll, was der häufigere Fehlerfall ist.
Der v26-Sprung: acht Laufzeiten
Die einzige folgenreichste Änderung in der Formatgeschichte landete mit Windows 8.1 (v26). Der Header bekam Platz für acht Last-Run-FILETIME-Werte statt einem. Vor 8.1 sagte Ihnen eine .pf, dass die Binärdatei zuletzt zur Zeit T lief. Ab 8.1 erhalten Sie ein rollendes Fenster der acht jüngsten Ausführungen, jede als Windows-FILETIME (u64, 100-Nanosekunden-Ticks seit dem 01.01.1601 UTC).
Für DFIR ist das der Unterschied zwischen „das Programm lief irgendwann vor gestern" und „das Programm lief achtmal in den letzten drei Tagen zu diesen spezifischen Zeitpunkten". Paaren Sie die acht Zeitstempel mit Sysmon EID 1 oder Security 4688 und Sie haben eine verteidigungsfähige Ausführungs-Timeline auf Sekundenebene.
Beachten Sie die Obergrenze: acht, nicht „mindestens acht". Wenn eine Binärdatei hundertmal läuft, erhalten Sie die acht jüngsten. Die anderen 92 werden in den Ausführungszähler gefaltet und sonst verloren. Die Aussage „last run war vor neun Stunden" aus einer Erfassung plus „last run war vor drei Minuten" aus einer späteren Erfassung auf demselben Host sagt Ihnen, dass Ausführungen weiter passierten; die Acht-Slot-Historie lässt Sie die volle Sequenz nicht rekonstruieren.
v30: Windows 10
v30 verschiebt Offsets in der File-Information-Sektion und strafft die Volume-Informationsdatensätze, aber die extern sichtbaren Felder sind dieselben wie bei v26: Name der ausführbaren Datei, Hash, Ausführungszähler, acht Last-Run-Zeiten, Volume-Info (Pfad, Seriennummer, Erstellungszeit) und die Dateimetrik-Liste jeder DLL und Ressource, die die Binärdatei in ihren ersten zehn Sekunden überwachter Ausführung berührt hat.
Die meisten Parser brauchen keinen radikal anderen Codepfad innerhalb des Payloads, nachdem die Versionsnummer gelesen wurde. Die Felder haben dieselbe Breite und Bedeutung; nur ihre Positionen bewegen sich. PECmd verarbeitet v30 sauber; ebenso libscca und pyscca.
Wissenswert auf Win10 1709+: Windows begann, .pf-Einträge während der Wartung aggressiver ablaufen zu lassen. Wenn die acht Last-Run-Slots einer Binärdatei nur drei populierte FILETIME-Werte zeigen, bedeutet das nicht, dass die Binärdatei dreimal lief. Es bedeutet mindestens drei. Der Ausführungszähler ist die autoritative Anzahl.
v31: Windows 11
v31 ist inkrementell gegenüber v30. Ein paar Padding-Anpassungen, zusätzliche Bits im Prefetch-Flags-Feld. Praktisch wird ein Parser, der v30 korrekt liest, v31 mit höchstens einer kleinen Offset-Anpassung im Header lesen. Wenn Ihre Toolchain „Windows-10-Support" beansprucht, aber bei v31 einen Fehler ausgibt, ist die Ursache fast immer eine überstrikte Versionsprüfung (version == 30) und keine echte Layout-Inkompatibilität.
Auf Win11 22H2 und neuer wird Prefetch auf SSDs von Teilen des OS opportunistisch deaktiviert. Forensisch ist das ein Abdeckungsproblem, kein v31-Layout-Problem — die Dateien, die Sie erhalten, sind gültiges v31, es gibt nur weniger davon, als die Registry vermuten lassen würde.
Was das für die Triage bedeutet
Wenn der Parser Ver. 31 zeigt, können Sie sich auf die acht tiefe Last-Run-Historie, den Ausführungszähler und die Dateimetrik-Liste verlassen. Wenn er Ver. 17 zeigt, erhalten Sie einen einzelnen Last-Run-Zeitstempel und die Binärdatei wurde auf einem XP-, Vista- oder Win7-Host gestartet. Ein v17 auf einem Windows-10- oder -11-Image zu finden, ist ein starkes Indiz dafür, dass die .pf von anderswo eingeschleust wurde — es gibt kein realistisches Szenario, in dem ein moderner Windows-Host v17 nativ schreibt.
Gemischte Versionen in einem einzigen Prefetch-Ordner sind normal auf einem Host, der über große Versionen hinweg geupgradet wurde; ein Windows-10-Image mit v23-Einträgen aus einer lang zurückliegenden Windows-8-Installation ist nicht unerhört. Ein Windows-11-Image mit v17 ist es. Das Versionsfeld ist eines der ersten Triage-Signale, das es lohnt, über den gesamten Ordner zu scannen.
Weiterführende Literatur
- Joachim Metz, libscca-Format-Dokumentation — enthält die Per-Version-Feldtabellen.
- Eric Zimmerman, PECmd — verarbeitet jede der obigen Versionen out of the box korrekt.