Artefatti di Windows · Lezione 6 di 9
USB e dispositivi esterni
12 min di lettura
Quando i dati escono da un'organizzazione su un'unità USB, l'esaminatore deve rispondere a tre domande: quale dispositivo è stato collegato, quando è stato collegato e quale utente lo ha utilizzato. Nessun singolo artefatto risponde a tutte e tre. Windows 10 e 11 distribuiscono le evidenze tra gli hive SYSTEM, SOFTWARE e NTUSER.DAT, un log di installazione in testo semplice e diversi log eventi. Questa lezione mostra dove si trova ciascun valore e come collegarli tra loro, fino al numero di serie del volume nell'immagine USB stessa. Questa catena è centrale per l'esame CFX, le cui domande descrivono spesso una raccolta di triage di Windows e un'immagine E01 di un'unità USB.
Prima di iniziare: il set di controllo
Un hive SYSTEM offline non contiene CurrentControlSet. Questo nome è un collegamento che esiste soltanto su un sistema in esecuzione. Leggere prima SYSTEM\Select\Current. Un valore pari a 1 indica che ControlSet001 è il set attivo. Tutti i percorsi SYSTEM in questa lezione presuppongono ControlSet001. Convertire gli orari locali utilizzando le impostazioni del fuso orario registrate nella lezione 2.2.
Identificazione del dispositivo: USBSTOR e USB
Ogni dispositivo di archiviazione di massa USB configurato da Windows riceve una voce su due livelli in SYSTEM\ControlSet001\Enum\USBSTOR:
- Chiave della classe del dispositivo:
Disk&Ven_<vendor>&Prod_<product>&Rev_<rev>, ad esempioDisk&Ven_SanDisk&Prod_Cruzer_Blade&Rev_1.00. Qui produttore e prodotto sono le stringhe comunicate dal dispositivo, non ID registrati. - Chiave dell'istanza:
<serial>&<n>, ad esempio4C530001230411109384&0. La parte che precede l'ultimo&è il numero di serie del dispositivo (la stringa USB iSerialNumber). Il numero finale è il numero di unità logica (LUN), normalmente0, aggiunto da Windows.
Il valore FriendlyName della chiave dell'istanza contiene un nome leggibile, come SanDisk Cruzer Blade USB Device.
L'insidia del numero di serie. Se il secondo carattere dell'ID dell'istanza è &, come in 7&2c1f9a3e&0, il dispositivo non ha comunicato alcun numero di serie univoco. Windows ha generato autonomamente l'ID, basandosi in parte sulla porta a cui il dispositivo era collegato. Non è un numero di serie hardware, non può essere associato a un dispositivo fisico e la stessa unità può produrre un ID diverso su un'altra porta. Riportarlo come ID dell'istanza generato da Windows, mai come numero di serie.
Lo stesso dispositivo compare anche in SYSTEM\ControlSet001\Enum\USB\VID_xxxx&PID_yyyy\<serial>. VID e PID sono gli ID a 16 bit del produttore e del prodotto in formato esadecimale, ad esempio VID_0781&PID_5567 per una SanDisk Cruzer Blade. Qui il nome dell'istanza è il numero di serie senza il suffisso &0, quindi è la stringa del numero di serie a collegare le voci USB e USBSTOR. Le unità USB che utilizzano il protocollo UASP sono spesso enumerate in Enum\SCSI anziché in Enum\USBSTOR, pertanto cercare in entrambi.
Timestamp del dispositivo nella chiave Properties
La chiave dell'istanza contiene gli orari più precisi del dispositivo, in Properties\{83da6326-97a6-4088-9453-a1923f573b29}\. Ogni sottochiave è un ID di proprietà in formato esadecimale. Il suo valore è un FILETIME di 8 byte, che conta intervalli di 100 nanosecondi a partire da 1601-01-01 UTC.
| Sottochiave | Proprietà (devpkey.h) | Significato |
|---|---|---|
0064 | DEVPKEY_Device_InstallDate | Ultima installazione dell'istanza del dispositivo; cambia quando il driver viene reinstallato o aggiornato |
0065 | DEVPKEY_Device_FirstInstallDate | Prima installazione: la prima volta in cui questo dispositivo è stato configurato |
0066 | DEVPKEY_Device_LastArrivalDate | Ultimo arrivo: la connessione più recente |
0067 | DEVPKEY_Device_LastRemovalDate | Ultima rimozione: la disconnessione più recente (Windows 8 e versioni successive) |
Alcune schede di riferimento pubblicate indicano 0064 come "prima installazione". Il file di intestazione devpkey.h del Windows SDK definisce la proprietà 100 (0x64) come InstallDate e la 101 (0x65) come FirstInstallDate. Per un'unità USB i due valori sono generalmente uguali, quindi verificarli entrambi e citare la sottochiave utilizzata. Su un sistema in esecuzione, la chiave Properties è normalmente leggibile soltanto da SYSTEM, quindi a un editor del registro eseguito come amministratore potrebbe essere negato l'accesso. Offline, qualsiasi parser di hive, come RECmd o Registry Explorer, la legge direttamente.
Lettera di unità e volume: MountedDevices
SYSTEM\MountedDevices associa i nomi ai volumi mediante due tipi di valori:
\DosDevices\E:contiene il volume a cui è stata assegnata più recentemente la lettera E:.\??\Volume{GUID}contiene una voce per ogni volume rilevato da Mount Manager. Il GUID del volume è persistente per quel volume su questo sistema.
I dati binari identificano il volume. Per i supporti rimovibili si tratta di una stringa UTF-16LE contenente il percorso del dispositivo, ad esempio _??_USBSTOR#Disk&Ven_SanDisk&Prod_Cruzer_Blade&Rev_1.00#4C530001230411109384&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}. Il numero di serie in questa stringa collega il GUID del volume all'istanza USBSTOR. Per un disco fisso MBR, come molti dischi rigidi USB, i dati occupano 12 byte: la firma del disco di 4 byte seguita dall'offset iniziale della partizione di 8 byte, espresso in byte. Per le partizioni GPT viene memorizzato DMIO:ID: seguito dal GUID della partizione.
Le lettere di unità vengono riutilizzate. Ogni nuova unità può diventare E:, e \DosDevices\E: conserva soltanto l'ultima. Un percorso come E:\Plans\budget.xlsx non dimostra a quale dispositivo si facesse riferimento. La lettera costituisce un'evidenza debole finché un numero di serie del volume non la conferma.
Collegamento del dispositivo a un utente: MountPoints2
Il percorso NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2 di ciascun utente contiene una sottochiave denominata {volume GUID} per ogni volume comparso nella sessione di quell'utente. Se il GUID corrisponde a un valore \??\Volume{GUID} in MountedDevices, il dispositivo è stato montato mentre quell'utente era connesso. Il file NTUSER.DAT in cui è stata trovata la sottochiave identifica l'account. Il timestamp LastWrite della sottochiave indica un'attività recente che ha coinvolto il volume nella sessione di quell'utente. Considerarlo un'evidenza di supporto, poiché anche altre attività possono aggiornare il timestamp LastWrite di una chiave (lezione 2.1). MountPoints2 elenca anche le condivisioni di rete, come sottochiavi quali ##server#share.
Etichette dei volumi nell'hive SOFTWARE
Due chiavi SOFTWARE consentono di recuperare un'etichetta del volume, come "WORK", che l'hive SYSTEM non registra:
SOFTWARE\Microsoft\Windows Portable Devices\Devices\<device path containing the serial>: il valoreFriendlyNameè spesso l'etichetta del volume, oppure la lettera di unità se il volume non aveva un'etichetta.SOFTWARE\Microsoft\Windows Search\VolumeInfoCache\<drive letter>: contiene l'etichetta dell'ultimo volume rilevato con quella lettera. Come MountedDevices, è indicizzata per lettera e viene sovrascritta.
Nessuna delle due chiavi viene popolata per ogni dispositivo, quindi utilizzarle come riscontro, non come evidenza primaria.
setupapi.dev.log: prima installazione
C:\Windows\INF\setupapi.dev.log è un log testuale delle installazioni dei driver. La prima volta che un dispositivo viene collegato, Windows scrive un blocco come questo:
>>> [Device Install (Hardware initiated) - USBSTOR\Disk&Ven_SanDisk&Prod_Cruzer_Blade&Rev_1.00\4C530001230411109384&0]
>>> Section start 2026/03/10 14:22:06.120
L'orario Section start indica la prima installazione, che corrisponde di fatto alla prima connessione. È espresso nell'ora locale del sistema, senza indicazione del fuso orario, quindi deve essere convertito in UTC. Le connessioni successive dello stesso dispositivo non creano nuovi blocchi di installazione. Le voci meno recenti vengono spostate in file ruotati, come setupapi.dev.yyyymmdd_hhmmss.log, nella stessa cartella.
Log eventi
- Microsoft-Windows-Partition/Diagnostic, ID evento 1006 (
Microsoft-Windows-Partition%4Diagnostic.evtx, Windows 10 e 11): registrato quando un disco viene collegato o scollegato. Registra Manufacturer, Model, Revision, SerialNumber e Capacity, lo stile e la tabella delle partizioni e copie grezze dell'MBR (Mbr) e di un massimo di quattro record di avvio del volume (daVbr0aVbr3). Gli eventi di disconnessione mostrano una capacità pari a 0 e nessun dato sulle partizioni. L'evento 1006 collega il numero di serie hardware a un file system, poiché il numero di serie del volume può essere letto dai byteVbr. L'evento permane dopo la rimozione del dispositivo. - Microsoft-Windows-Kernel-PnP/Configuration: gli ID evento 400 (dispositivo configurato), 410 (dispositivo avviato) e 420 (dispositivo eliminato) indicano l'ID dell'istanza del dispositivo, incluso il numero di serie, e forniscono un riscontro agli orari di connessione.
- Microsoft-Windows-DriverFrameworks-UserMode/Operational: gli ID evento 2003 e da 2100 a 2102 registrano la connessione e la rimozione, ma il canale è disabilitato per impostazione predefinita su Windows 10 e 11. Non darne per scontata la presenza e non attribuire significato alla sua assenza.
La catena del numero di serie del volume
Un file system scrive un numero di serie del volume (VSN) nel proprio record di avvio del volume (VBR) quando il volume viene formattato. Tutti gli offset seguenti sono relativi all'inizio del volume e i valori sono little-endian:
| File system | Offset nel VBR | Dimensione | Visualizzato come |
|---|---|---|---|
| NTFS | 0x48 | 8 byte | 4 byte meno significativi, XXXX-XXXX |
| FAT32 | 0x43 | 4 byte | XXXX-XXXX |
| exFAT | 0x64 | 4 byte | XXXX-XXXX |
Lo stesso numero compare in tre posizioni. La prima è il VBR nell'immagine USB. La seconda è il VolumeID di LinkInfo dei file LNK e delle Jump List sull'host (lezione 2.4), accanto al tipo di unità (rimovibile) e al percorso originale. La terza è la copia Vbr0 in Partition/Diagnostic 1006. Un quarto collegamento, il numero di serie USBSTOR, li associa all'hardware tramite il campo SerialNumber di quell'evento. Se un file LNK in C:\Users\ana\... punta a E:\Plans\budget.xlsx con VSN 1A2B3C4D e il VBR dell'E01 contiene lo stesso VSN, allora il file è stato aperto da quel volume. Non è stato aperto da un'altra unità che utilizzava anch'essa la lettera E:. Vi è un limite: la riformattazione crea un nuovo VSN, quindi una corrispondenza identifica una specifica formattazione del supporto, che il numero di serie hardware collega poi al dispositivo fisico.
Esempio svolto: un dispositivo, dall'inizio alla fine
Le impostazioni del fuso orario (lezione 2.2) mostrano E. South America Standard Time con ActiveTimeBias = 180 minuti, quindi UTC = ora locale + 3 ore.
Select\Current= 1.ControlSet001\Enum\USBSTOR\Disk&Ven_SanDisk&Prod_Cruzer_Blade&Rev_1.00\4C530001230411109384&0esiste. Il secondo carattere èC, quindi il numero di serie è reale: 4C530001230411109384.Enum\USB\VID_0781&PID_5567\4C530001230411109384lo conferma.MountedDevices: il valore\??\Volume{a9d9c980-1ca5-11f1-a3d2-806e6f6e6963}contiene...#4C530001230411109384&0#..., e\DosDevices\E:contiene gli stessi dati.C:\Users\ana\NTUSER.DATcontieneMountPoints2\{a9d9c980-1ca5-11f1-a3d2-806e6f6e6963}, quindi il volume è stato montato nella sessione di ana.- setupapi.dev.log: Section start
2026/03/10 14:22:06.120, ora locale. Aggiungendo 3 ore si ottiene 2026-03-10T17:22:06.120Z.0065contiene i byte00 A0 2F 6C B2 B0 DC 01, che decodificati corrispondono a 2026-03-10T17:22:08Z e confermano l'orario di setupapi con uno scarto di pochi secondi. 0066contiene i byte80 70 DD BD B9 B3 DC 01. Letti in formato little-endian, corrispondono a 0x01DCB3B9BDDD7080 = 134.179.699.250.000.000 intervalli di 100 ns. Dividendo per 10.000.000, si ottengono 13.417.969.925 s dal 1601. Sottraendo 11.644.473.600 s si ottiene il tempo Unix 1.773.496.325, che corrisponde a 2026-03-14T13:52:05Z (ultimo arrivo).- Partition/Diagnostic 1006, alle 2026-03-14T13:52:06Z, mostra SerialNumber 4C530001230411109384 e una partizione che inizia all'LBA 2048. I byte da 0x43 a 0x46 di
Vbr0sono4D 3C 2B 1A. - Nell'E01, la partizione inizia a 2.048 × 512 = 1.048.576 byte. Il VSN FAT32 a 1.048.576 + 0x43 è
4D 3C 2B 1A, ovvero 0x1A2B3C4D, visualizzato come 1A2B-3C4D.fsstat -o 2048 usb.E01riporta lo stesso ID del volume. - La cartella Recent di
anacontienebudget.xlsx.lnkcon tipo di unità rimovibile, numero di serie 1A2B3C4D e percorsoE:\Plans\budget.xlsx.
Risposte in stile esame: numero di serie 4C530001230411109384 (senza &0); prima connessione 2026-03-10T17:22:06Z.
Tabella riepilogativa
| Domanda | Artefatto | Campo |
|---|---|---|
| Numero di serie del dispositivo | SYSTEM Enum\USBSTOR\...\<serial>&0 | Nome della chiave dell'istanza |
| ID del produttore e del prodotto | SYSTEM Enum\USB\VID_xxxx&PID_yyyy | Nome della chiave |
| Prima connessione | setupapi.dev.log; Properties 0065 | Section start (ora locale); FILETIME (UTC) |
| Ultima connessione / rimozione | Properties 0066 / 0067 | FILETIME (UTC) |
| Lettera di unità e GUID del volume | SYSTEM MountedDevices | Dati di \DosDevices\X:, \??\Volume{GUID} |
| Quale utente | NTUSER.DAT MountPoints2 | Sottochiave {volume GUID} |
| Etichetta del volume | SOFTWARE Windows Portable Devices; VolumeInfoCache | FriendlyName; VolumeLabel |
| Numero di serie del volume | VBR dell'immagine USB; LinkInfo dei file LNK; Partition/Diagnostic 1006 | 0x43 / 0x48 / 0x64; DriveSerialNumber; Vbr0 |
Focus sull'esame: Sono previste domande che richiedono un numero di serie USB, che deve essere il numero di serie hardware e non un ID con & generato da Windows, e l'orario della prima o dell'ultima connessione in UTC. L'orario di setupapi deve essere convertito dall'ora locale. Occorre saper dimostrare che un file aperto da una lettera di unità proveniva da una determinata immagine USB, facendo corrispondere il VSN nel VBR dell'immagine a quello del file LNK e dell'evento 1006.
Punti chiave
- Risolvere prima
SYSTEM\Select\Current, quindi leggereEnum\USBSTOReEnum\USB. Un ID dell'istanza il cui secondo carattere è&è generato da Windows, non è un numero di serie. Properties\{83da6326-...}:0065prima installazione,0066ultimo arrivo,0067ultima rimozione, tutti FILETIME in UTC. setupapi.dev.log fornisce la prima installazione nell'ora locale.- MountedDevices collega il numero di serie a un GUID del volume e a una lettera. MountPoints2 in NTUSER.DAT collega quel GUID a un utente.
- Le lettere di unità vengono riutilizzate, quindi è il numero di serie del volume (NTFS 0x48, FAT32 0x43, exFAT 0x64) a collegare i percorsi LNK a uno specifico volume.
- Partition/Diagnostic 1006 registra il numero di serie hardware e una copia del VBR, creando un collegamento tra il dispositivo e il suo file system. DriverFrameworks-UserMode è disabilitato per impostazione predefinita.