Windows-Artefakte · Lektion 5 von 9
Shellbags
10 Min. Lesezeit
Windows merkt sich, wie jeder Ordner aussah, als ein Benutzer ihn zuletzt im Explorer aufgerufen hat: Fenstergröße und -position, Sortierreihenfolge, Ansichtsmodus und Symbolgröße. Diese als Shellbags bezeichneten Datensätze bleiben erhalten, nachdem der Ordner, das USB-Laufwerk oder die Netzwerkfreigabe nicht mehr vorhanden ist. Diese Lektion behandelt, wo sie gespeichert werden, wie sich Ordnerpfade daraus rekonstruieren lassen und wie weit ihren Zeitstempeln vertraut werden kann.
Was Shellbags sind und warum sie für Prüfer wichtig sind
Shellbags werden von der Windows-Shell geschrieben, die den Datei-Explorer, den Desktop und die standardmäßigen Öffnen-/Speichern-Dialoge steuert. Wenn ein Benutzer einen Ordner über die Shell öffnet, zeichnet Windows die Position des Ordners im Shell-Namensraum (Desktop, Dieser PC, E:\, Clients …) in der Registrierungsstruktur des Benutzers auf, zusammen mit einem Speicherplatz für seine Ansichtseinstellungen. Der Benutzer muss die Ansicht nicht ändern, damit der Eintrag erstellt wird.
Dies ist ein Beleg dafür, dass ein bestimmtes Benutzerkonto zu einem Ordner navigiert hat, einschließlich Ordnern, die sich auf anderem Wege nur schwer nachweisen lassen:
- Ordner auf Wechseldatenträgern, die nicht mehr angeschlossen sind;
- Netzwerkfreigaben (zum Beispiel
\\FILESRV01\Projects); - Ordner innerhalb von ZIP-Archiven, die im Explorer als komprimierte Ordner geöffnet wurden;
- Ordner, die später gelöscht, umbenannt oder sicher gelöscht wurden.
Die Daten befinden sich in einer benutzerspezifischen Registrierungsstruktur und werden daher dem Konto zugeordnet, dem diese Registrierungsstruktur gehört (Lektion 2.2).
Wo sie gespeichert sind
Unter Windows 7, 8, 10 und 11 befinden sich die meisten Shellbags in UsrClass.dat, unter C:\Users\<user>\AppData\Local\Microsoft\Windows\UsrClass.dat:
Local Settings\Software\Microsoft\Windows\Shell\BagMRULocal Settings\Software\Microsoft\Windows\Shell\Bags
Auf einem laufenden System ist diese Registrierungsstruktur als HKEY_USERS\<SID>_Classes eingebunden. NTUSER.DAT enthält ebenfalls Software\Microsoft\Windows\Shell\BagMRU und Software\Microsoft\Windows\Shell\Bags; unter diesen Versionen enthält sie gewöhnlich deutlich weniger Einträge, ist jedoch nicht immer leer. Werten Sie daher beide Registrierungsstrukturen aus.
Bei einer Triage-Sicherung sollten Sie UsrClass.dat zusammen mit UsrClass.dat.LOG1 und .LOG2 erwarten: Die Registrierungsstruktur befindet sich häufig in einem nicht vollständig geschriebenen Zustand, und aktuelle Einträge können ausschließlich in den Transaktionsprotokollen vorliegen, bis diese eingespielt werden (Lektion 2.1).
Struktur des BagMRU-Baums
BagMRU ist ein Baum, der den Shell-Namensraum widerspiegelt. Der Schlüssel BagMRU selbst bildet die Wurzel (den Desktop). Jeder Schlüssel enthält:
- Nummerierte Werte (
0,1,2…, REG_BINARY). Jeder enthält ein_ Shell-Element_: den binären Bezeichner eines untergeordneten Ordners im ITEMIDLIST-Format, das auch in LNK-Dateien verwendet wird. Der Unterschlüssel mit derselben Nummer enthält die untergeordneten Elemente dieses Ordners. Der vollständige Pfad eines Ordners ergibt sich somit aus der Kette der Elemente von der Wurzel abwärts. - MRUListEx (REG_BINARY): die Nummern der Werte für die untergeordneten Elemente als 4-Byte-Ganzzahlen in Little-Endian-Reihenfolge, mit dem zuletzt verwendeten Element zuerst und abgeschlossen durch
0xFFFFFFFF. - NodeSlot (REG_DWORD): die Nummer_ n_ des Schlüssels
Bags\<n>, der die Ansichtseinstellungen dieses Ordners enthält. UnterBags\<n>\Shell\<folder type GUID>befinden sich Werte wieMode,LogicalViewMode,SortundIconSize; bei Ordnern, die über Öffnen-/Speichern-Dialoge angezeigt wurden, erscheint ein UnterschlüsselComDlg.
Die Nummern haben keine eigene Bedeutung: Der Wert 2 ist lediglich das dritte unter diesem übergeordneten Element erfasste untergeordnete Element.
Typen von Shell-Elementen
Jedes Shell-Element beginnt mit einer 2-Byte-Größenangabe und einer 1-Byte-Klassentypkennung an Offset 2, die dem Parser vorgibt, wie der Rest zu lesen ist.
| Klassentyp | Elementtyp | Inhalt | Beispiel |
|---|---|---|---|
| 0x1F | Stammordner | Sortierindex (Offset 3) und eine 16-Byte-GUID (Offset 4) | Arbeitsplatz {20D04FE0-3AEA-1069-A2D8-08002B30309D}, Netzwerk {F02C1A0D-BE21-4350-88B0-7367FC96EF3C} |
| 0x20–0x2F (häufig 0x2F) | Volume | Laufwerksbuchstabenpfad als ASCII-Zeichenfolge | E:\ |
| 0x31 | Dateieintrag, Verzeichnis | Größe, DOS-Änderungszeit, Attribute, 8.3-Kurzname, Erweiterungsblöcke | CLIENTS / Clients |
| 0x32 | Dateieintrag, Datei | Gleicher Aufbau, für eine Datei, die von der Shell als Ordner behandelt wird | archive.zip |
| 0x40–0x4F | Netzwerkadresse | Server- oder Freigabename, Beschreibung | \\FILESRV01\Projects |
| 0x61 | URI | Eine URL, etwa eine FTP-Adresse | ftp://files.example.org |
Ordner innerhalb eines ZIP-Archivs erscheinen unterhalb des Elements des Archivs selbst. Dies ist einer der wenigen Fälle, in denen ein Dateiname in Shellbags erscheint.
Zeitstempel
Shellbags bieten zwei unterschiedliche Arten von Zeitangaben; verwechseln Sie diese nicht.
LastWrite-Zeiten der Schlüssel
Jeder BagMRU-Schlüssel hat eine LastWrite-Zeit (FILETIME, UTC): den Zeitpunkt der letzten Änderung eines beliebigen Werts in diesem Schlüssel, etwa durch das Hinzufügen eines neuen untergeordneten Elements, eine Neusortierung von MRUListEx beim erneuten Aufrufen eines untergeordneten Elements oder die Erstellung des Schlüssels. Die LastWrite-Zeit eines übergeordneten Schlüssels gibt daher an, wann seine Liste untergeordneter Elemente zuletzt geändert wurde. Das Element an der Spitze von MRUListEx ist am wahrscheinlichsten daran beteiligt gewesen. Pro Schlüssel gibt es eine Zeitangabe; frühere Aufrufe werden überschrieben.
Zeitstempel innerhalb von Dateieintragselementen
Ein Dateieintragselement (0x31/0x32) speichert, von seinem Anfang ausgehend:
| Offset | Größe | Feld |
|---|---|---|
| 0x00 | 2 | Elementgröße |
| 0x02 | 1 | Klassentyp (0x31 Verzeichnis, 0x32 Datei) |
| 0x04 | 4 | Dateigröße (0 für Verzeichnisse) |
| 0x08 | 4 | Letzte Änderung, DOS-Datum und -Uhrzeit |
| 0x0C | 2 | Dateiattribute (0x10 Verzeichnis) |
| 0x0E | var. | Kurzname (8.3), ASCII, nullterminiert |
Auf den Kurznamen folgt ein Erweiterungsblock mit der Signatur 0xBEEF0004. Er enthält die Erstellungszeit und die Zeit des letzten Zugriffs (ebenfalls als DOS-Datum/-Uhrzeit), den langen Namen in UTF-16LE und unter Windows 10 und 11 bei Ordnern auf NTFS die 8-Byte-Dateireferenz des Ordners (6-Byte-MFT-Eintragsnummer plus 2-Byte-Sequenznummer).
DOS-Datum/-Uhrzeit kodiert ein 16-Bit-Datum (Bits 15–9: Jahr seit 1980, 8–5: Monat, 4–0: Tag) und eine 16-Bit-Uhrzeit (Bits 15–11: Stunde, 10–5: Minute, 4–0: Sekunden geteilt durch 2). Sekunden werden in 2er-Schritten gespeichert, sodass diese Werte um bis zu 2 Sekunden von den NTFS-Zeitstempeln abweichen können. Parser wie SBECmd geben sie als UTC aus.
Dies sind die eigenen MAC-Zeiten des Ordners zum Zeitpunkt, als das Element geschrieben wurde, keine Aufrufzeiten. Sie helfen indirekt: Das Element kann nicht vor seiner eingebetteten Änderungszeit entstanden sein, und die MFT-Referenz identifiziert den Ordner in der $MFT des Laufwerks (Lektion 1.3).
„Erste Interaktion“ und „letzte Interaktion“
Parser leiten diese aus LastWrite-Zeiten ab. Wenn ein Ordner an der Spitze der MRUListEx seines übergeordneten Ordners steht, wird die LastWrite-Zeit des übergeordneten Schlüssels typischerweise als Zeitpunkt der letzten Interaktion mit dem Ordner ausgegeben. Hat der eigene Schlüssel eines Ordners keine untergeordneten Elemente, wird seine LastWrite-Zeit als Zeitpunkt der ersten Interaktion ausgegeben, da dieser Schlüssel seit seiner Erstellung nicht mehr geändert wurde. Dies sind Schlussfolgerungen, keine gespeicherten Felder. Geben Sie sie unter Bezug auf ihre Quelle an („Schlüssel BagMRU\1\0\2 wurde zuletzt zum Zeitpunkt T geschrieben, mit 2026 an erster Stelle seiner MRUListEx“), nicht als „Der Benutzer öffnete 2026 zum Zeitpunkt T“, und untermauern Sie sie durch LNK-Dateien, Sprunglisten (Lektion 2.4) und USB-Verbindungszeiten (Lektion 2.6).
Was Shellbags belegen und was nicht
Shellbags stützen die Aussage, dass dieses Benutzerkonto mindestens einmal und spätestens zur maßgeblichen LastWrite-Zeit über die Windows-Shell zu diesem Ordnerpfad navigiert hat. Sie belegen nicht:
- dass irgendeine Datei im Ordner geöffnet, kopiert oder gesehen wurde: Gewöhnliche Dateinamen werden nicht aufgezeichnet;
- wie lange oder wie häufig der Benutzer den Ordner aufgerufen hat;
- dass jeder dazwischenliegende Ordner einzeln geöffnet wurde: Auch die Eingabe eines vollständigen Pfads in die Adressleiste erzeugt Knoten für die darüberliegenden Ordner;
- welches physische Gerät als E: eingebunden war (verwenden Sie die Artefakte aus Lektion 2.6 oder die MFT-Referenz).
Das Löschen eines Ordners löscht seinen Shellbag nicht; dies geschieht nur durch eine Bereinigung der Registrierungsstruktur (Modul 7).
Beispielwerkzeuge: ShellBags Explorer (grafischer Baum), SBECmd (SBECmd.exe -d <hive folder> --csv <out>, eine CSV-Zeile pro Element mit absolutem Pfad, MRU-Position, NodeSlot, LastWrite und eingebetteten Zeitangaben) und Registry Explorer für die unverarbeiteten Schlüssel.
Durchgearbeitetes Beispiel: E:\Clients\2026\Contracts
Die UsrClass.dat des Benutzers mira (Windows 11, Protokolle eingespielt; E: war ein NTFS-USB-Laufwerk) enthält diesen Zweig:
| Schlüssel | Repräsentiert | Verfolgter Wert und sein Element | MRUListEx | LastWrite (UTC) |
|---|---|---|---|---|
BagMRU | Desktop (Wurzel) | 1: 0x1F, Arbeitsplatz-GUID | 1, 0 | 2026-03-12T07:58:20Z |
BagMRU\1 | Arbeitsplatz | 0: 0x2F, E:\ | 0, 1 | 2026-03-18T14:05:40Z |
BagMRU\1\0 | E:\ | 2: 0x31, Clients | 2, 0, 1 | 2026-03-18T14:05:44Z |
BagMRU\1\0\2 | E:\Clients | 0: 0x31, 2026 | 0, 1 | 2026-03-18T14:05:51Z |
BagMRU\1\0\2\0 | E:\Clients\2026 | 1: 0x31, Contracts | 1, 0 | 2026-03-18T14:06:03Z |
BagMRU\1\0\2\0\1 | E:\Clients\2026\Contracts | keiner (keine untergeordneten Elemente), NodeSlot 38 | keine | 2026-03-18T14:06:03Z |
Pfad. Das Zusammenfügen der Elemente von der Wurzel abwärts ergibt E:\Clients\2026\Contracts, mit Ansichtseinstellungen in Bags\38.
Eingebettete Zeitangaben des Elements 2026. Das Änderungsfeld enthält das Datumswort 0x5C62 und das Zeitwort 0x8509. Datum: 0x5C62 = 23.650; 23.650 >> 9 = 46, also ist das Jahr 1980 + 46 = 2026; (23.650 >> 5) & 0xF = 3 (März); 23.650 & 0x1F = 2. Uhrzeit: 0x8509 = 34.057; 34.057 >> 11 = 16 Stunden; (34.057 >> 5) & 0x3F = 40 Minuten; (34.057 & 0x1F) × 2 = 9 × 2 = 18 Sekunden. Ergebnis: 2026-03-02T16:40:18Z. Der Block 0xBEEF0004 liefert die Erstellungszeit 2026-01-05T09:12:44Z und den MFT-Eintrag 64, Sequenz 1.
Was sich über E:\Clients\2026 schlussfolgern lässt:
- Das Konto
miranavigierte über die Shell zuE:\Clients\2026auf dem Volume, das als E: eingebunden war. - Der Schlüssel
E:\Clientswurde zuletzt um 2026-03-18T14:05:51Z geschrieben, mit2026an der Spitze seiner MRUListEx: Die am besten belegte Aussage lautet, dass2026zu diesem Zeitpunkt der Liste der unterClientsaufgerufenen Ordner hinzugefügt oder an deren Anfang verschoben wurde. - Der Schlüssel
2026wurde zuletzt um 2026-03-18T14:06:03Z geschrieben, mitContractsan der Spitze, und der SchlüsselContractsohne untergeordnete Elemente trägt dieselbe Zeitangabe: Um 14:06:03Z erreichte der BenutzerContractsüber2026, wahrscheinlich zum ersten Mal. - Wann
2026erstmals aufgerufen wurde, lässt sich nicht bestimmen; frühere Aufrufe werden überschrieben. Die eingebetteten Datumsangaben beschreiben den Ordner und zeigen lediglich, dass das Element frühestens um 2026-03-02T16:40:18Z geschrieben wurde. - Nichts zeigt, welche Dateien in
Contractsgeöffnet wurden. Um E: dem Beweislaufwerk zuzuordnen, schlagen Sie den MFT-Eintrag 64 in der $MFT des USB-Abbilds nach: Sequenz 1, Name2026, übergeordneter OrdnerClientswürden die Zuordnung bestätigen.
Prüfungsschwerpunkt: Rechnen Sie damit, einen vollständigen Ordnerpfad aus einem BagMRU-Zweig rekonstruieren zu müssen, einschließlich Speicherorten auf Wechseldatenträgern oder im Netzwerk, und das Konto anhand der Registrierungsstruktur zu benennen, aus der er stammt. Möglicherweise sollen Sie eine LastWrite-Zeit in ISO 8601 UTC angeben, sie von den eingebetteten Zeitstempeln des Ordners unterscheiden oder einen Ordner seinem MFT-Eintrag zuordnen. Sie sollten wissen, was ein Shellbag nicht belegt, insbesondere nicht, dass darin enthaltene Dateien geöffnet wurden.
Kernpunkte
- Shellbags erfassen Ordner, die ein Benutzer über die Windows-Shell aufgerufen hat, samt Ansichtseinstellungen; sie bleiben erhalten, nachdem der Ordner, das Laufwerk oder die Freigabe nicht mehr vorhanden ist.
- Unter Windows 7 und höher befinden sie sich hauptsächlich in UsrClass.dat (
Local Settings\Software\Microsoft\Windows\Shell\BagMRUundBags), mit weniger Einträgen in NTUSER.DAT (Software\Microsoft\Windows\Shell\BagMRUundBags); sichern Sie auch die Dateien .LOG1/.LOG2. - BagMRU ist ein Baum: Nummerierte Werte enthalten Shell-Elemente, Unterschlüssel mit derselben Nummer enthalten untergeordnete Elemente, MRUListEx gibt die Reihenfolge an und NodeSlot verweist auf
Bags\<n>. - Die LastWrite-Zeiten der Schlüssel zeigen, wann die Liste der untergeordneten Elemente eines Knotens zuletzt geändert wurde; DOS-Zeitstempel innerhalb von Dateieintragselementen sind die eigenen MAC-Zeiten des Ordners zum Zeitpunkt der Aufzeichnung, mit einer Auflösung von 2 Sekunden.
- Werte für „erste/letzte Interaktion“ sind Schlussfolgerungen aus LastWrite-Zeiten; geben Sie diese unter Bezug auf ihre Quelle an und untermauern Sie sie durch weitere Belege.
- Shellbags belegen die Navigation zu einem Pfad, nicht, dass irgendeine darin enthaltene Datei geöffnet wurde.