Shell-Item-Format erklärt: im Inneren eines ShellBags
Die Shell-Items in BagMRU-Werten Byte für Byte: Klassentypen, File-Entry-Items, der 0xBEEF0004-Block, MFT-Referenzen und Netzwerk-Items für die Forensik.
TL;DR. Jeder nummerierte Wert unter einem BagMRU-Schlüssel ist eine ITEMIDLIST mit genau einem Shell-Item: 2 Byte Größe, ein Klassentyp-Byte an Offset 2, dann ein typspezifischer Rumpf. 0x1F ist ein Root-Ordner (eine GUID wie Arbeitsplatz), 0x2X ein Volume, 0x3X ein „File Entry“ (Ordner oder Datei, mit 8.3-Namen und Änderungszeit), 0x4X ein Netzwerkort, 0x71 ein Systemsteuerungselement, 0x74 ein Delegate. Die meisten File-Entry-Items enden mit einem Erweiterungsblock 0xBEEF0004, der Erstellungs- und Zugriffszeit, die NTFS-MFT-Eintrags- und Sequenznummer und den langen Namen ergänzt. Microsoft dokumentiert das Format nicht; Referenz ist libfwsi von libyal.
Um ShellBags zu nutzen, müssen Sie keine Shell-Items von Hand dekodieren. Sie müssen aber wissen, was die Bytes enthalten können und was nicht, denn davon hängt ab, was Sie behaupten dürfen. Dieser Beitrag geht ein Item mit realer Struktur aus dem Sample der Website durch sowie die wenigen Strukturen, die Beweiswert tragen.
ITEMIDLIST in einem Absatz
Die Windows-Shell adressiert Objekte (Ordner, Laufwerke, Systemsteuerungs-Applets, Geräte) über ID-Listen. Microsoft dokumentiert den Container: Eine ITEMIDLIST ist eine Folge von SHITEMID-Strukturen, jeweils beginnend mit einer 2-Byte-Größe cb, abgeschlossen durch einen Terminator der Länge null. Der Inhalt jedes Items ist Sache des Shell-Ordners, der es erzeugt hat. Die Community-Spezifikation, die diese Lücke füllt, ist libyals Windows Shell Item format (libfwsi). Dieselben Items stecken in LNK-Dateien (der LinkTargetIDList aus MS-SHLLINK) und in Jump Lists; das Wissen ist also übertragbar.
In einem BagMRU-Wert enthält die ID-Liste genau ein Item: die Pfadkomponente dieses Schlüssels. Der vollständige Pfad ergibt sich aus dem Durchlaufen des Schlüsselbaums, nicht aus einem einzelnen Wert.
Klassentypen
Das Byte an Offset 2 identifiziert das Item. libfwsi gruppiert Volumes, File Entries und Netzwerk-Items nach dem oberen Nibble (class_type & 0x70):
| Klassentyp | Item | Hauptinhalt | Beweiswert |
|---|---|---|---|
0x1F | Root-Ordner | Sortierindex + Known-Folder-GUID | Namespace-Wurzel: Arbeitsplatz, Netzwerk, Papierkorb, Benutzerprofil, Schnellzugriff / Start. |
0x20–0x2F | Volume | Laufwerksbuchstabe (E:\) oder bei manchen Gerätetypen eine GUID | Welcher Laufwerksbuchstabe durchsucht wurde. Mit der USB-Historie abgleichen. |
0x30–0x3F | File Entry | Größe, FAT-Änderungszeit, Attribute, primärer (8.3-)Name, Erweiterungsblöcke | Ordnername, Zeiten, MFT-Referenz. Flag 0x01 = Verzeichnis, 0x02 = Datei, 0x04 = Unicode-Namen. |
0x40–0x4F | Netzwerkort | Flags, Ortsangabe (\\server, \\server\freigabe), optional Beschreibung/Kommentar | UNC-Pfade von Freigaben und Servern. |
0x52 | In komprimierten Ordnern beobachtet | In libfwsi nicht vollständig dokumentiert | Navigation in Archiven. |
0x61 | URI | URL-Zeichenkette | FTP-Sites und andere per URI adressierte Ordner. |
0x71 | Systemsteuerung | GUID des Applets | Geöffnete Kategorien und Elemente der Systemsteuerung. |
0x74 | Delegate (Ordner der Benutzerdateien) | Signatur CFSF, die einen File Entry umschließt | Häufig bei Profilordnern ab Windows 7. |
0x00 | Variabel | Unterschiedlich: MTP-Geräte, Suchergebnisse, andere Shell-Erweiterungen | Oft lässt sich nur ein lesbarer Name extrahieren. |
Ein File-Entry-Item, Byte für Byte
Hier der Ordner finance_2026 aus dem Sample des ShellBags Parser. Die Daten sind synthetisch (fiktive Geschichte), aber mit dem realen Layout erzeugt:
0000 66 00 31 00 00 00 00 00 2e 5d a0 55 10 00 46 49 f.1......].U..FI
0010 4e 41 4e 43 45 5f 32 30 32 36 00 00 4a 00 09 00 NANCE_2026..J...
0020 04 00 ef be 2e 5d a0 55 2e 5d a0 55 2e 00 00 00 .....].U.].U....
0030 24 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 $...............
0040 00 00 00 00 00 00 00 00 00 00 66 00 69 00 6e 00 ..........f.i.n.
0050 61 00 6e 00 63 00 65 00 5f 00 32 00 30 00 32 00 a.n.c.e._.2.0.2.
0060 36 00 00 00 1c 00 6.....
| Offset | Bytes | Feld | Wert |
|---|---|---|---|
| 0x00 | 66 00 | Item-Größe | 102 Byte |
| 0x02 | 31 | Klassentyp | File Entry, Verzeichnis-Flag (0x01) gesetzt, ASCII-Primärname |
| 0x04 | 00 00 00 00 | Dateigröße | 0 (Verzeichnisse) |
| 0x08 | 2e 5d a0 55 | Änderung, FAT-Datum + Uhrzeit | 2026-09-14 10:45:00 |
| 0x0C | 10 00 | Dateiattribute | FILE_ATTRIBUTE_DIRECTORY (0x10) |
| 0x0E | FINANCE_2026\0 | Primärname | Kurzname, auf einen geraden Offset aufgefüllt |
| 0x1C | 4a 00 | Größe des Erweiterungsblocks | 74 Byte |
| 0x1E | 09 00 | Erweiterungsversion | 9 |
| 0x20 | 04 00 ef be | Signatur | 0xBEEF0004 |
| 0x24 | 2e 5d a0 55 | Erstellt (FAT) | 2026-09-14 10:45:00 |
| 0x28 | 2e 5d a0 55 | Zugriff (FAT) | 2026-09-14 10:45:00 |
| 0x30 | 24 00 00 00 00 00 01 00 | NTFS-Dateireferenz | MFT-Eintrag 36, Sequenz 1 |
| 0x4A | UTF-16LE | Langer Name | finance_2026 |
| 0x64 | 1c 00 | Offset des ersten Erweiterungsblocks | 0x1C |
Dekodierung der FAT-Werte: Das Datumswort 0x5D2E enthält in den Bits 9 bis 15 das Jahr seit 1980 (46 → 2026), in den Bits 5 bis 8 den Monat (9) und in den Bits 0 bis 4 den Tag (14). Das Zeitwort 0x55A0 enthält in den Bits 11 bis 15 die Stunde (10), in den Bits 5 bis 10 die Minute (45) und in den Bits 0 bis 4 die Sekunden/2. Microsoft dokumentiert dasselbe Layout bei DosDateTimeToFileTime. Zu den Folgen für die Genauigkeit siehe FAT-Zeitstempel.
Der Erweiterungsblock 0xBEEF0004
Erweiterungsblöcke folgen auf den Rumpf des Items. Jeder beginnt mit 2 Byte Größe, 2 Byte Version und 4 Byte Signatur. Die File-Entry-Erweiterung mit der Signatur 0xBEEF0004 ist für ShellBags die entscheidende. Laut libfwsi:
| Version | Gesehen unter | Ergänzt |
|---|---|---|
| 3 | Windows XP, 2003 | Erstellungs- und Zugriffszeit, langer Name |
| 7 | Windows Vista | NTFS-Dateireferenz (MFT-Eintrag + Sequenz) |
| 8 | Windows 7, 2008, 8.0 | Zusätzliche Felder vor dem langen Namen |
| 9 | Windows 8.1, 10 (libfwsi-Testsatz; Windows-11-Items bitte selbst prüfen) | Zusätzliche Felder vor dem langen Namen |
Die Version ist selbst ein Indiz: Ein Eintrag mit einem Block der Version 3 wurde von Code aus der XP-Zeit erzeugt, was bei migrierten Profilen eine Rolle spielt. Die versionsabhängigen Felder liegen vor dem langen Namen, deshalb muss ein Parser die Version kennen, um den Namen zu finden. Der ShellBags Parser zeigt die Version in den Eintragsdetails.
Die MFT-Dateireferenz
Ab Version 7 enthält Offset 20 des Blocks (0x30 im Beispiel) eine 8-Byte-NTFS-Dateireferenz: eine 48-Bit-MFT-Eintragsnummer und eine 16-Bit-Sequenznummer, das Layout, das Microsoft als MFT_SEGMENT_REFERENCE dokumentiert. Es ist das am wenigsten genutzte Feld in ShellBags:
- Filtern Sie die $MFT oder das USN-Journal nach Eintrag 36: Ist die Sequenznummer dort höher, wurde der Ordner gelöscht und der Datensatz wiederverwendet.
- Ordner auf FAT-/exFAT-Volumes haben keine MFT; das Feld ist dann null oder bedeutungslos.
- Items, die nicht aus NTFS-Verzeichnissen stammen (Archivinhalt, Netzwerk-Items), tragen keine verwertbare Referenz.
Mehr im Glossareintrag zu MFT-Dateireferenzen und im Beitrag zu gelöschten Ordnern.
Weitere Items, die man erkennen sollte
Root-Ordner (0x1F). Byte 3 ist ein Sortierindex (libfwsi nennt 0x50 für Arbeitsplatz, 0x58 für Netzwerk, 0x60 für Papierkorb), gefolgt von einer 16-Byte-GUID. Das Arbeitsplatz-Item des Samples ist 20 Byte lang: 14 00 1f 50, dann {20D04FE0-3AEA-1069-A2D8-08002B30309D} in gemischter Byte-Reihenfolge. Microsoft listet Ordner-GUIDs unter KNOWNFOLDERID; CLSIDs wie die des Arbeitsplatzes stammen aus älterer Shell-Dokumentation und Community-Tabellen.
Volume (0x2F). Ein Laufwerksbuchstabe an Offset 3: 19 00 2f 45 3a 5c 00 ist E:\. Der Buchstabe ist der, den Windows damals vergeben hat, keine Geräteidentität.
Netzwerk (0x4X). Flags an Offset 3, dann ein NUL-terminierter Ort an Offset 5. Das Freigabe-Item des Samples 1a 00 c3 00 00 5c 5c 46 49 4c 45 53 52 56 30 31 5c 46 69 6e 61 6e 63 65 00 liest sich als \\FILESRV01\Finance. libfwsi dokumentiert die Flags 0x80 (Beschreibung vorhanden) und 0x40 (Kommentar vorhanden).
Delegate (0x74). Ab Windows 7 werden Ordner im Benutzerprofil oft als Delegate-Item mit der Signatur CFSF gespeichert, das einen normalen File Entry umschließt. Ein Parser, der es ignoriert, verliert die Namen vieler Profilordner.
Was Parser mit dem Unbekannten machen
Shell-Erweiterungen können eigene Items definieren, und Microsoft fügt mit jeder Version neue hinzu (Telefone über MTP, Cloud-Anbieter, Suchergebnisse). Ein sorgfältiger Parser dekodiert, was er kennt, und behält den Rest als Hex. Der ShellBags Parser zeigt für jeden Eintrag das Roh-Item im Detailbereich und greift bei variablen Items auf die längste lesbare UTF-16-Zeichenkette zurück. Seine README nennt MTP-Geräte, ZIP-Inhalts-Items (0x52) und Suchergebnisse als noch nicht vollständig dekodiert; ShellBags Explorer deckt mehr Typen ab, ein Grund mehr, auffällige Einträge dort gegenzuprüfen (siehe den Werkzeugvergleich).
Weiterführende Literatur
- libfwsi: Windows Shell Item format
- Kaitai Struct: Windows shell items
- Microsoft: ITEMIDLIST, SHITEMID