Artéfacts Windows · Leçon 6 sur 9
USB et périphériques externes
13 min de lecture
Lorsque des données quittent une organisation sur une clé USB, l’examinateur doit répondre à trois questions : quel périphérique a été connecté, quand a-t-il été connecté et quel utilisateur l’a utilisé. Aucun artefact ne répond à lui seul aux trois questions. Windows 10 et 11 répartissent les éléments de preuve entre les ruches SYSTEM, SOFTWARE et NTUSER.DAT, un journal d’installation en texte brut et plusieurs journaux d’événements. Cette leçon montre où se trouve chaque valeur et comment les relier, jusqu’au numéro de série du volume dans l’image USB elle-même. Cette chaîne de corrélation est au cœur de l’examen pratique CFX, dont le dossier fourni contient une collecte de triage Windows et une image E01 d’une clé USB.
Avant de commencer : le jeu de contrôle
Une ruche SYSTEM hors ligne ne possède pas de CurrentControlSet. Ce nom est un lien qui n’existe que sur un système en cours d’exécution. Lisez d’abord SYSTEM\Select\Current. Une valeur de 1 signifie que ControlSet001 est le jeu actif. Tous les chemins SYSTEM de cette leçon supposent que ControlSet001 est actif. Convertissez les heures locales à l’aide des paramètres de fuseau horaire que vous avez relevés dans la leçon 2.2.
Identifier le périphérique : USBSTOR et USB
Chaque périphérique de stockage de masse USB que Windows a configuré possède une entrée à deux niveaux sous SYSTEM\ControlSet001\Enum\USBSTOR :
- Clé de classe de périphérique :
Disk&Ven_<vendor>&Prod_<product>&Rev_<rev>, par exempleDisk&Ven_SanDisk&Prod_Cruzer_Blade&Rev_1.00. Le fabricant et le produit sont ici les chaînes déclarées par le périphérique, et non des identifiants enregistrés. - Clé d’instance :
<serial>&<n>, par exemple4C530001230411109384&0. La partie précédant le dernier&est le numéro de série du périphérique (la chaîne USB iSerialNumber). Le nombre final est le numéro d’unité logique (LUN), normalement0, ajouté par Windows.
La valeur FriendlyName de la clé d’instance contient un nom lisible tel que SanDisk Cruzer Blade USB Device.
Le piège du numéro de série. Si le deuxième caractère de l’identifiant d’instance est &, comme dans 7&2c1f9a3e&0, le périphérique n’a déclaré aucun numéro de série unique. Windows a généré lui-même l’identifiant, en partie à partir du port auquel le périphérique était connecté. Il ne s’agit pas d’un numéro de série matériel, il ne peut pas être rapproché d’un périphérique physique et la même clé peut produire un identifiant différent sur un autre port. Présentez-le comme un identifiant d’instance généré par Windows, jamais comme un numéro de série.
Le même périphérique apparaît aussi sous SYSTEM\ControlSet001\Enum\USB\VID_xxxx&PID_yyyy\<serial>. VID et PID sont les identifiants du fabricant et du produit sur 16 bits, en hexadécimal, par exemple VID_0781&PID_5567 pour une SanDisk Cruzer Blade. Ici, le nom de l’instance est le numéro de série sans le suffixe &0 ; c’est donc la chaîne du numéro de série qui relie les entrées USB et USBSTOR. Les supports USB utilisant le protocole UASP sont souvent énumérés sous Enum\SCSI plutôt que sous Enum\USBSTOR ; effectuez donc vos recherches aux deux emplacements.
Horodatages du périphérique dans la clé Properties
La clé d’instance contient les horodatages les plus précis du périphérique, dans Properties\{83da6326-97a6-4088-9453-a1923f573b29}\. Chaque sous-clé est un identifiant de propriété en hexadécimal. Sa valeur est un FILETIME de 8 octets, qui compte les intervalles de 100 nanosecondes écoulés depuis le 1601-01-01 UTC.
| Sous-clé | Propriété (devpkey.h) | Signification |
|---|---|---|
0064 | DEVPKEY_Device_InstallDate | Dernière installation de l’instance du périphérique ; change lorsque le pilote est réinstallé ou mis à jour |
0065 | DEVPKEY_Device_FirstInstallDate | Première installation : première configuration de ce périphérique |
0066 | DEVPKEY_Device_LastArrivalDate | Dernière arrivée : connexion la plus récente |
0067 | DEVPKEY_Device_LastRemovalDate | Dernier retrait : déconnexion la plus récente (Windows 8 et versions ultérieures) |
Certaines fiches de référence publiées présentent 0064 comme la « première installation ». Le fichier d’en-tête du SDK Windows devpkey.h définit la propriété 100 (0x64) comme InstallDate et 101 (0x65) comme FirstInstallDate. Pour une clé USB, les deux valeurs sont généralement identiques ; vérifiez donc les deux et citez la sous-clé utilisée. Sur un système en cours d’exécution, la clé Properties n’est normalement accessible en lecture qu’à SYSTEM ; un éditeur de registre exécuté en tant qu’administrateur peut donc se voir refuser l’accès. Hors ligne, tout analyseur de ruches, tel que RECmd ou Registry Explorer, la lit directement.
Lettre de lecteur et volume : MountedDevices
SYSTEM\MountedDevices associe des noms aux volumes au moyen de deux types de valeurs :
\DosDevices\E:contient le volume auquel la lettre E: a été attribuée le plus récemment.\??\Volume{GUID}contient une entrée par volume détecté par le gestionnaire de montage. Le GUID du volume est persistant pour ce volume sur ce système.
Les données binaires identifient le volume. Pour les supports amovibles, il s’agit d’une chaîne UTF-16LE contenant le chemin du périphérique, par exemple _??_USBSTOR#Disk&Ven_SanDisk&Prod_Cruzer_Blade&Rev_1.00#4C530001230411109384&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}. Le numéro de série présent dans cette chaîne relie le GUID du volume à l’instance USBSTOR. Pour un disque fixe MBR, comme de nombreux disques durs USB, les données occupent 12 octets : la signature de disque sur 4 octets, suivie du décalage de début de partition sur 8 octets, exprimé en octets. Les partitions GPT stockent DMIO:ID: suivi du GUID de la partition.
Les lettres de lecteur sont réutilisées. Chaque nouveau lecteur peut devenir E:, et \DosDevices\E: ne conserve que le dernier. Un chemin tel que E:\Plans\budget.xlsx ne prouve rien quant au périphérique concerné. La lettre constitue un élément de preuve faible tant qu’un numéro de série de volume ne le confirme pas.
Relier le périphérique à un utilisateur : MountPoints2
La clé NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2 de chaque utilisateur contient une sous-clé nommée {volume GUID} pour chaque volume apparu dans la session de cet utilisateur. Si le GUID correspond à une valeur \??\Volume{GUID} dans MountedDevices, le périphérique a été monté alors que cet utilisateur était connecté. Le fichier NTUSER.DAT dans lequel vous l’avez trouvé identifie le compte. L’horodatage LastWrite de la sous-clé indique une activité récente impliquant le volume dans la session de cet utilisateur. Traitez-le comme un élément de corroboration, car d’autres activités peuvent également mettre à jour l’horodatage LastWrite d’une clé (leçon 2.1). MountPoints2 répertorie aussi les partages réseau, sous forme de sous-clés telles que ##server#share.
Noms de volume dans la ruche SOFTWARE
Deux clés SOFTWARE peuvent permettre de récupérer un nom de volume, tel que « WORK », que la ruche SYSTEM n’enregistre pas :
SOFTWARE\Microsoft\Windows Portable Devices\Devices\<device path containing the serial>: la valeurFriendlyNamecorrespond souvent au nom du volume, ou à la lettre de lecteur si le volume n’avait pas de nom.SOFTWARE\Microsoft\Windows Search\VolumeInfoCache\<drive letter>: contient le nom du dernier volume détecté sous cette lettre. Comme MountedDevices, cette clé est indexée par lettre et son contenu est remplacé.
Aucune de ces clés n’est renseignée pour tous les périphériques ; utilisez-les donc pour corroborer les résultats, et non comme éléments de preuve principaux.
setupapi.dev.log : première installation
C:\Windows\INF\setupapi.dev.log est un journal texte des installations de pilotes. Lors de la première connexion d’un périphérique, Windows écrit un bloc comme celui-ci :
>>> [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’horodatage Section start correspond à la première installation, qui équivaut en pratique à la première connexion. Il est exprimé en heure locale du système, sans indicateur de fuseau ; vous devez donc le convertir en UTC. Les connexions ultérieures du même périphérique ne créent pas de nouveaux blocs d’installation. Les entrées plus anciennes sont déplacées vers des fichiers issus de la rotation des journaux, tels que setupapi.dev.yyyymmdd_hhmmss.log, dans le même dossier.
Journaux d’événements
- Microsoft-Windows-Partition/Diagnostic, ID d’événement 1006 (
Microsoft-Windows-Partition%4Diagnostic.evtx, Windows 10 et 11) : consigné lors de l’arrivée ou du retrait d’un disque. Il enregistre Manufacturer, Model, Revision, SerialNumber et Capacity, le style et la table de partition, ainsi que des copies brutes du MBR (Mbr) et de quatre secteurs de démarrage de volume au maximum (Vbr0àVbr3). Les événements de déconnexion indiquent une capacité de 0 et ne contiennent aucune donnée de partition. L’événement 1006 relie le numéro de série matériel à un système de fichiers, car le numéro de série du volume peut être lu dans les octetsVbr. L’événement subsiste après le retrait du périphérique. - Microsoft-Windows-Kernel-PnP/Configuration : les ID d’événement 400 (périphérique configuré), 410 (périphérique démarré) et 420 (périphérique supprimé) indiquent l’identifiant d’instance du périphérique, y compris le numéro de série, et corroborent les heures de connexion.
- Microsoft-Windows-DriverFrameworks-UserMode/Operational : les ID d’événement 2003 et 2100 à 2102 enregistrent les connexions et les retraits, mais le canal est désactivé par défaut sous Windows 10 et 11. Ne vous attendez pas à le trouver et ne considérez pas son absence comme significative.
La chaîne de corrélation du numéro de série du volume
Un système de fichiers écrit un numéro de série de volume (VSN) dans son secteur de démarrage de volume (VBR) lors du formatage du volume. Tous les décalages ci-dessous sont relatifs au début du volume, et les valeurs sont en petit-boutiste :
| Système de fichiers | Décalage dans le VBR | Taille | Affichage |
|---|---|---|---|
| NTFS | 0x48 | 8 octets | 4 octets de poids faible, XXXX-XXXX |
| FAT32 | 0x43 | 4 octets | XXXX-XXXX |
| exFAT | 0x64 | 4 octets | XXXX-XXXX |
Le même numéro apparaît à trois endroits. Le premier est le VBR dans l’image USB. Le deuxième est le VolumeID de LinkInfo dans les fichiers LNK et les Jump Lists sur l’hôte (leçon 2.4), à côté du type de lecteur (amovible) et du chemin d’origine. Le troisième est la copie Vbr0 dans Partition/Diagnostic 1006. Un quatrième lien, le numéro de série USBSTOR, les relie au matériel par l’intermédiaire du champ SerialNumber de cet événement. Si un fichier LNK dans C:\Users\ana\... pointe vers E:\Plans\budget.xlsx avec le VSN 1A2B3C4D, et que le VBR de l’E01 contient le même VSN, alors le fichier a été ouvert depuis ce volume. Il n’a pas été ouvert depuis un autre lecteur utilisant lui aussi la lettre E:. Une limite s’applique : le reformatage crée un nouveau VSN ; une correspondance identifie donc un état de formatage particulier du support, que le numéro de série matériel relie ensuite au périphérique physique.
Exemple détaillé : un périphérique, de bout en bout
Les paramètres de fuseau horaire (leçon 2.2) indiquent E. South America Standard Time avec ActiveTimeBias = 180 minutes, donc UTC = heure locale + 3 heures.
Select\Current= 1.ControlSet001\Enum\USBSTOR\Disk&Ven_SanDisk&Prod_Cruzer_Blade&Rev_1.00\4C530001230411109384&0existe. Le deuxième caractère estC; le numéro de série est donc réel : 4C530001230411109384.Enum\USB\VID_0781&PID_5567\4C530001230411109384le confirme.MountedDevices: la valeur\??\Volume{a9d9c980-1ca5-11f1-a3d2-806e6f6e6963}contient...#4C530001230411109384&0#..., et\DosDevices\E:contient les mêmes données.C:\Users\ana\NTUSER.DATcontientMountPoints2\{a9d9c980-1ca5-11f1-a3d2-806e6f6e6963}; le volume a donc été monté dans la session d’ana.- setupapi.dev.log : Section start
2026/03/10 14:22:06.120en heure locale. L’ajout de 3 heures donne 2026-03-10T17:22:06.120Z.0065contient les octets00 A0 2F 6C B2 B0 DC 01, qui se décodent en 2026-03-10T17:22:08Z et corroborent l’heure de setupapi à quelques secondes près. 0066contient les octets80 B6 F9 4D 6B E7 DC 01. Lus en petit-boutiste, ils donnent 0x01DCE76B4DF9B680 = 134 236 536 970 000 000 intervalles de 100 ns. En divisant par 10 000 000, on obtient 13 423 653 697 s depuis 1601. En soustrayant 11 644 473 600 s, on obtient le temps Unix 1 779 180 097, soit 2026-05-19T08:41:37Z (dernière arrivée).- Partition/Diagnostic 1006 à 2026-05-19T08:41:38Z indique SerialNumber 4C530001230411109384 et une partition commençant au LBA 2048. Les octets 0x43 à 0x46 de
Vbr0sont4D 3C 2B 1A. - Dans l’E01, la partition commence à 2 048 × 512 = 1 048 576 octets. Le VSN FAT32 à 1 048 576 + 0x43 est
4D 3C 2B 1A, soit 0x1A2B3C4D, affiché sous la forme 1A2B-3C4D.fsstat -o 2048 usb.E01indique le même identifiant de volume. - Le dossier Recent d’
anacontientbudget.xlsx.lnk, avec un type de lecteur amovible, le numéro de série 1A2B3C4D et le cheminE:\Plans\budget.xlsx.
Réponses de type examen : numéro de série 4C530001230411109384 (sans &0) ; première connexion 2026-03-10T17:22:06Z.
Tableau récapitulatif
| Question | Artefact | Champ |
|---|---|---|
| Numéro de série du périphérique | SYSTEM Enum\USBSTOR\...\<serial>&0 | Nom de la clé d’instance |
| Identifiants du fabricant et du produit | SYSTEM Enum\USB\VID_xxxx&PID_yyyy | Nom de la clé |
| Première connexion | setupapi.dev.log ; Properties 0065 | Section start (heure locale) ; FILETIME (UTC) |
| Dernière connexion / dernier retrait | Properties 0066 / 0067 | FILETIME (UTC) |
| Lettre de lecteur et GUID du volume | SYSTEM MountedDevices | Données de \DosDevices\X:, \??\Volume{GUID} |
| Utilisateur concerné | NTUSER.DAT MountPoints2 | Sous-clé {volume GUID} |
| Nom du volume | SOFTWARE Windows Portable Devices ; VolumeInfoCache | FriendlyName ; VolumeLabel |
| Numéro de série du volume | VBR de l’image USB ; LinkInfo des fichiers LNK ; Partition/Diagnostic 1006 | 0x43 / 0x48 / 0x64 ; DriveSerialNumber ; Vbr0 |
Points clés pour l’examen : Attendez-vous à des tâches demandant un numéro de série USB, qui doit être le numéro de série matériel et non un identifiant & généré par Windows, ainsi qu’une heure de première ou de dernière connexion en UTC. L’heure de setupapi doit être convertie depuis l’heure locale. Soyez prêt à prouver qu’un fichier ouvert depuis une lettre de lecteur provenait de l’image USB fournie en faisant correspondre le VSN du VBR de l’image avec celui du fichier LNK et de l’événement 1006.
Points essentiels
- Déterminez d’abord le jeu actif avec
SYSTEM\Select\Current, puis lisezEnum\USBSTORetEnum\USB. Un identifiant d’instance dont le deuxième caractère est&est généré par Windows ; ce n’est pas un numéro de série. Properties\{83da6326-...}:0065pour la première installation,0066pour la dernière arrivée,0067pour le dernier retrait, tous au format FILETIME en UTC. setupapi.dev.log fournit la première installation en heure locale.- MountedDevices relie le numéro de série à un GUID de volume et à une lettre. MountPoints2 dans NTUSER.DAT relie ce GUID à un utilisateur.
- Les lettres de lecteur sont réutilisées ; c’est donc le numéro de série du volume (NTFS 0x48, FAT32 0x43, exFAT 0x64) qui relie les chemins des fichiers LNK à un volume précis.
- Partition/Diagnostic 1006 enregistre le numéro de série matériel et une copie du VBR, établissant le lien entre le périphérique et son système de fichiers. DriverFrameworks-UserMode est désactivé par défaut.