thumbcache_*.db-Dateiformat: CMMM-Header und Eintragsaufbau
Byteebene der Windows-Thumbcache- und Iconcache-Datenbanken von Vista bis Windows 11: Dateiheader, versionsabhängige Cache-Typen und Eintragsstruktur.
Dies ist eine Referenz für den Aufbau der Vorschaubild- und Icon-Caches des
Windows Explorer (thumbcache_*.db, iconcache_*.db) auf Byteebene. Der
Aufbau ist von Microsoft nicht dokumentiert. Das Folgende stimmt mit
öffentlichen Recherchen und Open-Source-Parsern wie Vinetto und Thumbcache
Viewer überein und ist das, was der Thumbcache Parser implementiert.
Alle Ganzzahlen sind Little-Endian.
Dateiheader
| Offset | Größe | Feld |
|---|---|---|
| 0 | 4 | Signatur CMMM |
| 4 | 4 | Formatversion |
| 8 | 4 | Cache-Typ (Index in die Tabelle unten) |
Was folgt, hängt von der Version ab:
| Version | Geschrieben von | Offset 12 | Offset 16 | Offset 20 | Offset 24 |
|---|---|---|---|---|---|
0x14 | Vista | erster Eintrag | freier Eintrag | Eintragsanzahl | – |
0x15 | 7 | erster Eintrag | freier Eintrag | Eintragsanzahl | – |
0x1A | 8 | erster Eintrag | freier Eintrag | Eintragsanzahl | – |
0x1C | 8 (v2) | reserviert | erster Eintrag | freier Eintrag | Eintragsanzahl |
0x1E | 8 (v3) | reserviert | erster Eintrag | freier Eintrag | – |
0x1F | 8.1 | reserviert | erster Eintrag | freier Eintrag | – |
0x20 | 10 / 11 | reserviert | erster Eintrag | freier Eintrag | – |
Erster Eintrag ist der Offset des ersten Cache-Eintrags. Freier Eintrag
markiert den Beginn des freien Bereichs: Einträge dahinter wurden freigegeben,
ihre Bytes sind aber oft noch intakt. Ein robuster Parser sollte prüfen, ob
der Offset des ersten Eintrags tatsächlich auf CMMM zeigt, und andernfalls
den Rest der Datei durchsuchen.
Cache-Typen
Die Cache-Typ-Nummer entspricht der Größenklasse der Datei, und die Tabelle hat sich zwischen den Versionen geändert:
| Version | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Vista / 7 | 32 | 96 | 256 | 1024 | sr | |||||||||
| 8 (alle) | 16 | 32 | 48 | 96 | 256 | 1024 | sr | wide | exif | |||||
| 8.1 | 16 | 32 | 48 | 96 | 256 | 1024 | 1600 | sr | wide | exif | wide_alternate | |||
| 10 / 11 | 16 | 32 | 48 | 96 | 256 | 768 | 1280 | 1920 | 2560 | sr | wide | exif | wide_alternate | custom_stream |
Cache-Eintrag
Die Einträge folgen lückenlos aufeinander. Der Header ist unter Windows 7 48 Bytes groß, unter Vista und Windows 8+ 56 Bytes:
| Feld | Vista | 7 | 8 → 11 |
|---|---|---|---|
Signatur CMMM | 0 | 0 | 0 |
| Eintragsgröße (gesamter Eintrag) | 4 | 4 | 4 |
| Eintrags-Hash / Cache-ID (u64) | 8 | 8 | 8 |
| Quellerweiterung (4 × UTF-16) | 16 | – | – |
| Größe der Kennung | 24 | 16 | 16 |
| Padding-Größe | 28 | 20 | 20 |
| Datengröße | 32 | 24 | 24 |
| Breite | – | – | 28 |
| Höhe | – | – | 32 |
| Unbekannt | 36 | 28 | 36 |
| Daten-Prüfsumme (u64) | 40 | 32 | 40 |
| Header-Prüfsumme (u64) | 48 | 40 | 48 |
Nach dem Header folgen die Kennung (UTF-16LE, meist die Cache-ID als 16
Hex-Ziffern), das Padding und die Bilddaten. Der nächste Eintrag beginnt bei
Offset + Eintragsgröße.
Einträge mit Datengröße 0 sind häufig. Es sind Platzhalter für Elemente, deren Vorschaubild nicht erzeugt wurde oder verworfen wurde. Sie tragen dennoch eine Cache-ID und sind daher für eine Zeitleiste relevant.
Plausibilitätsprüfungen beim Carving
Beim Scannen nach CMMM außerhalb der aktiven Kette sollte ein Kandidat
verworfen werden, außer:
- die Eintragsgröße ist mindestens so groß wie die Headerlänge und passt in die Datei;
- Header + Kennung + Padding + Daten ≤ Eintragsgröße;
- die Größe der Kennung ist gerade und angemessen klein.
Diese Prüfungen halten die Zahl falsch positiver Treffer gering, da CMMM in
Bilddaten selten vorkommt.
Die Bilddaten
Die Nutzlast ist eine vollständige Bilddatei: BM (BMP), FF D8 FF (JPEG)
oder 89 50 4E 47 (PNG). Diese Bytes werden unverändert gehasht. Windows 10
und 11 speichern meist 32-Bit-BMPs (Top-Down oder Bottom-Up), die jeder
moderne Browser anzeigen kann.
thumbcache_idx.db
Der Index (IMMM) ordnet Cache-IDs den Eintrags-Offsets in den jeweiligen
Größendatenbanken zu, zusammen mit Flags. Er enthält keine Bilder, und sein
Aufbau variiert stärker zwischen den Builds. Er ist besonders nützlich, um zu
bestätigen, dass eine ID einmal zwischengespeichert war, selbst wenn die
Größendatenbanken bereits bereinigt wurden.