Artefatti di Windows · Lezione 5 di 9
Shellbags
11 min di lettura
Windows ricorda l'aspetto di ogni cartella all'ultima esplorazione da parte di un utente in Esplora file: dimensioni e posizione della finestra, ordinamento, modalità di visualizzazione e dimensioni delle icone. Questi record, chiamati Shellbags, persistono anche dopo che la cartella, l'unità USB o la condivisione di rete non sono più presenti. Questa lezione illustra dove vengono memorizzati, come ricostruire i percorsi delle cartelle a partire da essi e fino a che punto sia possibile fidarsi dei loro timestamp.
Che cosa sono le Shellbags e perché interessano agli esaminatori
Le Shellbags vengono scritte dalla shell di Windows, che gestisce Esplora file, il desktop e le finestre di dialogo standard Apri/Salva. Quando un utente apre una cartella tramite la shell, Windows registra la posizione della cartella nello spazio dei nomi della shell (Desktop, Questo PC, E:\, Clients …) nell'hive del Registro di sistema dell'utente, con uno slot per le relative impostazioni di visualizzazione. Non è necessario che l'utente modifichi la visualizzazione affinché la voce venga creata.
Questo costituisce una prova del fatto che uno specifico account utente ha raggiunto una cartella, comprese cartelle altrimenti difficili da individuare:
- cartelle su unità rimovibili non più collegate;
- condivisioni di rete (ad esempio
\\FILESRV01\Projects); - cartelle all'interno di archivi ZIP aperti in Esplora file come cartelle compresse;
- cartelle successivamente eliminate, rinominate o cancellate in modo sicuro.
I dati risiedono in un hive specifico dell'utente, quindi vengono attribuiti all'account proprietario di tale hive (Lezione 2.2).
Dove si trovano
In Windows 7, 8, 10 e 11 la maggior parte delle Shellbags si trova in UsrClass.dat, nel percorso C:\Users\<user>\AppData\Local\Microsoft\Windows\UsrClass.dat:
Local Settings\Software\Microsoft\Windows\Shell\BagMRULocal Settings\Software\Microsoft\Windows\Shell\Bags
Su un sistema in esecuzione questo hive viene montato come HKEY_USERS\<SID>_Classes. Anche NTUSER.DAT contiene Software\Microsoft\Windows\Shell\BagMRU e Software\Microsoft\Windows\Shell\Bags; in queste versioni contiene solitamente molte meno voci, ma non è sempre privo di voci, pertanto occorre analizzare entrambi gli hive.
Durante una raccolta di triage, è normale trovare UsrClass.dat insieme a UsrClass.dat.LOG1 e .LOG2: l'hive si trova spesso in uno stato non consolidato e le voci recenti possono esistere soltanto nei log delle transazioni finché questi non vengono riapplicati (Lezione 2.1).
Struttura dell'albero BagMRU
BagMRU è un albero che rispecchia lo spazio dei nomi della shell. La chiave BagMRU stessa è la radice (il Desktop). Ogni chiave contiene:
- Valori numerati (
0,1,2…, REG_BINARY). Ciascuno contiene un_ elemento della shell_: l'identificatore binario di una cartella figlia, nel formato ITEMIDLIST utilizzato anche nei file LNK. La sottochiave con lo stesso numero contiene i figli di quella cartella, quindi il percorso completo di una cartella è la catena di elementi dalla radice verso il basso. - MRUListEx (REG_BINARY): i numeri dei valori figli sotto forma di interi little-endian di 4 byte, dal più recente al meno recente, terminati da
0xFFFFFFFF. - NodeSlot (REG_DWORD): il numero_ n_ della chiave
Bags\<n>che contiene le impostazioni di visualizzazione di questa cartella. InBags\<n>\Shell\<folder type GUID>si trovano valori comeMode,LogicalViewMode,SorteIconSize; per le cartelle visualizzate tramite le finestre di dialogo Apri/Salva compare una sottochiaveComDlg.
I numeri non hanno un significato intrinseco: il valore 2 è semplicemente il terzo figlio registrato sotto quel genitore.
Tipi di elementi della shell
Ogni elemento della shell inizia con una dimensione di 2 byte e un indicatore del tipo di classe di 1 byte all'offset 2, che indica al parser come leggere il resto.
| Tipo di classe | Tipo di elemento | Contenuto | Esempio |
|---|---|---|---|
| 0x1F | Cartella radice | Indice di ordinamento (offset 3) e GUID di 16 byte (offset 4) | Risorse del computer {20D04FE0-3AEA-1069-A2D8-08002B30309D}, Rete {F02C1A0D-BE21-4350-88B0-7367FC96EF3C} |
| 0x20–0x2F (spesso 0x2F) | Volume | Percorso con lettera di unità come stringa ASCII | E:\ |
| 0x31 | Voce di file, directory | Dimensione, data e ora DOS di modifica, attributi, nome breve 8.3, blocchi di estensione | CLIENTS / Clients |
| 0x32 | Voce di file, file | Stessa struttura, per un file che la shell tratta come cartella | archive.zip |
| 0x40–0x4F | Percorso di rete | Nome del server o della condivisione, descrizione | \\FILESRV01\Projects |
| 0x61 | URI | Un URL, ad esempio un percorso FTP | ftp://files.example.org |
Le cartelle all'interno di un archivio ZIP compaiono sotto l'elemento dell'archivio stesso: si tratta di uno dei pochi casi in cui un nome di file compare nelle Shellbags.
Timestamp
Le Shellbags offrono due diversi tipi di informazioni temporali; non vanno confusi.
Timestamp LastWrite delle chiavi
Ogni chiave BagMRU ha un timestamp LastWrite (FILETIME, UTC): l'ultima modifica a un qualsiasi valore di quella chiave, come l'aggiunta di un nuovo figlio, il riordinamento di MRUListEx perché un figlio è stato visitato nuovamente oppure la creazione della chiave. Il LastWrite di un genitore indica quindi quando il suo elenco di figli è stato modificato l'ultima volta, e il figlio in testa a MRUListEx è quello più probabilmente coinvolto. Esiste un solo timestamp per chiave; le visite precedenti vengono sovrascritte.
Timestamp all'interno degli elementi di tipo voce di file
Un elemento di tipo voce di file (0x31/0x32) memorizza, a partire dal proprio inizio:
| Offset | Dimensione | Campo |
|---|---|---|
| 0x00 | 2 | Dimensione dell'elemento |
| 0x02 | 1 | Tipo di classe (0x31 directory, 0x32 file) |
| 0x04 | 4 | Dimensione del file (0 per le directory) |
| 0x08 | 4 | Ultima modifica, data e ora DOS |
| 0x0C | 2 | Attributi del file (0x10 directory) |
| 0x0E | var. | Nome breve (8.3), ASCII, terminato da un carattere nullo |
Dopo il nome breve si trova un blocco di estensione con firma 0xBEEF0004. Contiene i timestamp di creazione e ultimo accesso (anch'essi in formato data/ora DOS), il nome lungo in UTF-16LE e, in Windows 10 e 11 per le cartelle su NTFS, il riferimento al file della cartella di 8 byte (numero della voce MFT di 6 byte più numero di sequenza di 2 byte).
Il formato data/ora DOS codifica una data a 16 bit (bit 15–9 anno a partire dal 1980, 8–5 mese, 4–0 giorno) e un'ora a 16 bit (bit 15–11 ora, 10–5 minuti, 4–0 secondi divisi per 2). I secondi vengono memorizzati a intervalli di 2, quindi questi valori possono differire dai timestamp NTFS fino a 2 secondi. Parser come SBECmd li riportano in UTC.
Questi sono i timestamp MAC propri della cartella al momento in cui l'elemento è stato scritto, non i tempi di esplorazione. Sono utili indirettamente: l'elemento non può essere anteriore al timestamp di modifica incorporato e il riferimento MFT identifica la cartella nella $MFT dell'unità (Lezione 1.3).
"Prima interazione" e "ultima interazione"
I parser ricavano questi valori dai timestamp LastWrite. In genere, se una cartella è in testa al MRUListEx del proprio genitore, il LastWrite del genitore viene riportato come timestamp di ultima interazione della cartella; se la chiave della cartella stessa non ha figli, il suo LastWrite viene riportato come prima interazione, poiché nulla ha modificato quella chiave dalla sua creazione. Si tratta di deduzioni, non di campi memorizzati. Occorre riportarli indicando la fonte ("la chiave BagMRU\1\0\2 è stata scritta l'ultima volta al tempo T, con 2026 al primo posto nel suo MRUListEx"), non come "l'utente ha aperto 2026 al tempo T", e cercare riscontri nei file LNK, nelle Jump List (Lezione 2.4) e negli orari di connessione USB (Lezione 2.6).
Che cosa dimostrano e che cosa non dimostrano le Shellbags
Le Shellbags supportano l'affermazione secondo cui questo account utente ha raggiunto questo percorso di cartella tramite la shell di Windows, almeno una volta, e non oltre il timestamp LastWrite pertinente. Non dimostrano:
- che un qualsiasi file nella cartella sia stato aperto, copiato o visto: i nomi dei file ordinari non vengono registrati;
- per quanto tempo o con quale frequenza l'utente abbia visitato la cartella;
- che ogni cartella intermedia sia stata aperta separatamente: anche digitare un percorso completo nella barra degli indirizzi crea nodi per le cartelle sovrastanti;
- quale dispositivo fisico fosse montato come E: (utilizzare gli artefatti della Lezione 2.6 o il riferimento MFT).
L'eliminazione di una cartella non elimina la sua Shellbag; soltanto la pulizia dell'hive la elimina (Modulo 7).
Esempi di strumenti: ShellBags Explorer (albero grafico), SBECmd (SBECmd.exe -d <hive folder> --csv <out>, una riga CSV per elemento con percorso assoluto, posizione MRU, slot del nodo, LastWrite e timestamp incorporati) e Registry Explorer per le chiavi grezze.
Esempio svolto: E:\Clients\2026\Contracts
UsrClass.dat dell'utente mira (Windows 11, log riapplicati; E: era un'unità USB NTFS) contiene questo ramo:
| Chiave | Rappresenta | Valore seguito e relativo elemento | MRUListEx | LastWrite (UTC) |
|---|---|---|---|---|
BagMRU | Desktop (radice) | 1: 0x1F, GUID di Risorse del computer | 1, 0 | 2026-03-12T07:58:20Z |
BagMRU\1 | Risorse del computer | 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 | nessuno (nessun figlio), NodeSlot 38 | nessuno | 2026-03-18T14:06:03Z |
Percorso. Unendo gli elementi dalla radice verso il basso si ottiene E:\Clients\2026\Contracts, con le impostazioni di visualizzazione in Bags\38.
Timestamp incorporati dell'elemento 2026. Il campo di modifica contiene la word della data 0x5C62 e la word dell'ora 0x8509. Data: 0x5C62 = 23.650; 23.650 >> 9 = 46, quindi l'anno è 1980 + 46 = 2026; (23.650 >> 5) & 0xF = 3 (marzo); 23.650 & 0x1F = 2. Ora: 0x8509 = 34.057; 34.057 >> 11 = 16 ore; (34.057 >> 5) & 0x3F = 40 minuti; (34.057 & 0x1F) × 2 = 9 × 2 = 18 secondi. Risultato: 2026-03-02T16:40:18Z. Il blocco 0xBEEF0004 fornisce la creazione 2026-01-05T09:12:44Z e la voce MFT 64, sequenza 1.
Che cosa si può concludere su E:\Clients\2026:
- L'account
miraha raggiunto tramite la shellE:\Clients\2026sul volume che era montato come E:. - La chiave
E:\Clientsè stata scritta l'ultima volta a 2026-03-18T14:05:51Z con2026in testa al suo MRUListEx: l'affermazione meglio supportata è che in quel momento2026sia stata aggiunta alle cartelle esplorate sottoClients, oppure spostata in testa al relativo elenco. - La chiave
2026è stata scritta l'ultima volta a 2026-03-18T14:06:03Z conContractsin testa, e la chiaveContracts, priva di figli, riporta lo stesso timestamp: alle 14:06:03Z l'utente ha raggiuntoContractspassando per2026, probabilmente per la prima volta. - Non è possibile determinare quando
2026sia stata esplorata per la prima volta; le visite precedenti vengono sovrascritte. Le date incorporate descrivono la cartella e mostrano soltanto che l'elemento non è stato scritto prima di 2026-03-02T16:40:18Z. - Nulla mostra quali file in
Contractssiano stati aperti. Per collegare E: all'unità acquisita come prova, cercare la voce MFT 64 nella $MFT dell'immagine USB: sequenza 1, nome2026, genitoreClientsconfermerebbero il collegamento.
Focus sull'esame: Occorre saper ricostruire un percorso completo di cartella da un ramo BagMRU, compresi i percorsi su supporti rimovibili o in rete, e identificare l'account a partire dall'hive di provenienza. Potrebbe essere richiesto di indicare un timestamp LastWrite in formato ISO 8601 UTC, di distinguerlo dai timestamp incorporati della cartella o di associare una cartella alla sua voce MFT. È necessario sapere che cosa una Shellbag non dimostra, in particolare che i file al suo interno siano stati aperti.
Punti chiave
- Le Shellbags registrano le cartelle esplorate da un utente tramite la shell di Windows, con le impostazioni di visualizzazione; persistono anche dopo che la cartella, l'unità o la condivisione non sono più presenti.
- In Windows 7 e versioni successive si trovano principalmente in UsrClass.dat (
Local Settings\Software\Microsoft\Windows\Shell\BagMRUeBags), con un numero inferiore in NTUSER.DAT (Software\Microsoft\Windows\Shell\BagMRUeBags); occorre raccogliere anche i file .LOG1/.LOG2. - BagMRU è un albero: i valori numerati contengono elementi della shell, le sottochiavi con lo stesso numero contengono i figli, MRUListEx fornisce l'ordine e NodeSlot punta a
Bags\<n>. - I timestamp LastWrite delle chiavi mostrano quando l'elenco dei figli di un nodo è stato modificato l'ultima volta; i timestamp DOS all'interno degli elementi di tipo voce di file sono i timestamp MAC propri della cartella al momento della registrazione, con una risoluzione di 2 secondi.
- I valori di "prima/ultima interazione" sono deduzioni ricavate dai timestamp LastWrite; occorre riportarli indicando la fonte e cercare riscontri.
- Le Shellbags dimostrano la navigazione verso un percorso, non che un qualsiasi file al suo interno sia stato aperto.