Skip to content

Format des shell items : dans une entrée ShellBags

Les shell items des valeurs BagMRU octet par octet : types de classe, items file entry, bloc 0xBEEF0004, références MFT et items réseau, pour l'analyste.

Publié le 8 min de lecture

TL;DR. Chaque valeur numérotée d'une clé BagMRU est une ITEMIDLIST contenant un seul shell item : une taille sur 2 octets, un octet de type de classe à l'offset 2, puis un corps propre au type. 0x1F est un dossier racine (un GUID comme Poste de travail), 0x2X un volume, 0x3X un « file entry » (dossier ou fichier, avec le nom 8.3 et une date de modification), 0x4X un emplacement réseau, 0x71 un élément du Panneau de configuration, 0x74 un délégué. La plupart des items file entry se terminent par un bloc d'extension 0xBEEF0004 qui ajoute les dates de création et d'accès, le numéro d'entrée MFT et de séquence NTFS, et le nom long. Microsoft ne documente pas ce format ; la référence est libfwsi de libyal.

Pas besoin de décoder des shell items à la main pour exploiter les ShellBags. Il faut en revanche savoir ce que les octets peuvent contenir et ce qu'ils ne peuvent pas contenir, car c'est ce qui délimite ce que vous pouvez affirmer. Cet article décortique un item à la structure réaliste tiré de l'échantillon du site, et les quelques structures qui portent de la preuve.

ITEMIDLIST en un paragraphe

Le shell Windows désigne les objets (dossiers, lecteurs, applets du Panneau de configuration, périphériques) par des listes d'identifiants. Microsoft documente le conteneur : une ITEMIDLIST est une suite de structures SHITEMID, chacune commençant par une taille cb sur 2 octets, terminée par un élément de longueur nulle. Le contenu de chaque item est privé au dossier shell qui l'a créé. La spécification communautaire qui comble ce vide est le Windows Shell Item format de libyal (libfwsi). Les mêmes items apparaissent dans les fichiers LNK (la LinkTargetIDList de MS-SHLLINK) et dans les Jump Lists : ces connaissances se transposent.

Dans une valeur BagMRU, la liste ne contient qu'un item : le composant de chemin de cette clé. Le chemin complet provient du parcours de l'arborescence de clés, pas d'une seule valeur.

Types de classe

L'octet à l'offset 2 identifie l'item. libfwsi regroupe volumes, file entries et items réseau par le quartet haut (class_type & 0x70) :

Type de classeItemContenu principalPreuve
0x1FDossier racineIndex de tri + GUID de dossier connuRacine de l'espace de noms : Poste de travail, Réseau, Corbeille, profil utilisateur, Accès rapide / Accueil.
0x20–0x2FVolumeLettre de lecteur (E:\), ou GUID pour certains types de périphériquesQuelle lettre de lecteur a été parcourue. À croiser avec l'historique USB.
0x30–0x3FFile entryTaille, date de modification FAT, attributs, nom principal (8.3), blocs d'extensionNom du dossier, dates, référence MFT. Indicateur 0x01 = répertoire, 0x02 = fichier, 0x04 = noms Unicode.
0x40–0x4FEmplacement réseauIndicateurs, chaîne d'emplacement (\\serveur, \\serveur\partage), description/commentaires optionnelsChemins UNC des partages et serveurs.
0x52Observé dans les dossiers compressésIncomplètement documenté dans libfwsiNavigation dans des archives.
0x61URIChaîne d'URLSites FTP et autres dossiers désignés par URI.
0x71Panneau de configurationGUID de l'appletCatégories et éléments du Panneau de configuration ouverts.
0x74Délégué (dossier des fichiers de l'utilisateur)Signature CFSF enveloppant un file entryFréquent pour les dossiers du profil sous Windows 7+.
0x00VariableVariable : périphériques MTP, résultats de recherche, autres extensions shellSouvent, seul un nom lisible peut être extrait.

Un item file entry, octet par octet

Voici le dossier finance_2026 de l'échantillon du ShellBags Parser. Les données sont synthétiques (scénario fictif) mais construites selon la structure réelle :

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.....
OffsetOctetsChampValeur
0x0066 00Taille de l'item102 octets
0x0231Type de classeFile entry, indicateur répertoire (0x01), nom principal ASCII
0x0400 00 00 00Taille du fichier0 (répertoires)
0x082e 5d a0 55Modification, date + heure FAT2026-09-14 10:45:00
0x0C10 00Attributs de fichierFILE_ATTRIBUTE_DIRECTORY (0x10)
0x0EFINANCE_2026\0Nom principalNom court, complété jusqu'à un offset pair
0x1C4a 00Taille du bloc d'extension74 octets
0x1E09 00Version de l'extension9
0x2004 00 ef beSignature0xBEEF0004
0x242e 5d a0 55Création (FAT)2026-09-14 10:45:00
0x282e 5d a0 55Accès (FAT)2026-09-14 10:45:00
0x3024 00 00 00 00 00 01 00Référence de fichier NTFSEntrée MFT 36, séquence 1
0x4AUTF-16LENom longfinance_2026
0x641c 00Offset du premier bloc d'extension0x1C

Décodage des valeurs FAT : le mot de date 0x5D2E contient l'année depuis 1980 dans les bits 9 à 15 (46 → 2026), le mois dans les bits 5 à 8 (9), le jour dans les bits 0 à 4 (14). Le mot d'heure 0x55A0 contient l'heure dans les bits 11 à 15 (10), les minutes dans les bits 5 à 10 (45) et les secondes/2 dans les bits 0 à 4. Microsoft documente la même structure pour DosDateTimeToFileTime. Voir horodatage FAT pour les conséquences sur la précision.

Le bloc d'extension 0xBEEF0004

Les blocs d'extension suivent le corps de l'item. Chacun commence par une taille sur 2 octets, une version sur 2 octets et une signature sur 4 octets. L'extension file entry, de signature 0xBEEF0004, est celle qui compte pour les ShellBags. D'après libfwsi :

VersionObservée surApporte
3Windows XP, 2003Dates de création et d'accès, nom long
7Windows VistaRéférence de fichier NTFS (entrée MFT + séquence)
8Windows 7, 2008, 8.0Champs supplémentaires avant le nom long
9Windows 8.1, 10 (jeu de tests libfwsi ; vérifiez vous-même les items Windows 11)Champs supplémentaires avant le nom long

La version est elle-même un indice : une entrée avec un bloc de version 3 a été créée par du code de l'époque XP, ce qui compte quand un profil a été migré. Les champs qui varient selon la version se trouvent avant le nom long, d'où la nécessité pour un parseur de connaître la version pour trouver le nom. Le ShellBags Parser affiche la version dans le détail de l'entrée.

La référence de fichier MFT

À partir de la version 7, l'offset 20 du bloc (0x30 dans l'exemple) contient une référence de fichier NTFS sur 8 octets : un numéro d'entrée MFT sur 48 bits et un numéro de séquence sur 16 bits, la structure que Microsoft documente sous le nom MFT_SEGMENT_REFERENCE. C'est le champ le plus sous-exploité des ShellBags :

  • Filtrez la $MFT ou le journal USN sur l'entrée 36 : si le numéro de séquence y est plus élevé, le dossier a été supprimé et l'enregistrement réutilisé.
  • Les dossiers situés sur des volumes FAT/exFAT n'ont pas de MFT : le champ est nul ou sans signification.
  • Les items qui ne proviennent pas de répertoires NTFS (contenu d'archive, items réseau) ne portent pas de référence exploitable.

Voir aussi l'entrée de glossaire sur les références de fichier MFT et l'article sur les dossiers supprimés.

Autres items à reconnaître

Dossier racine (0x1F). L'octet 3 est un index de tri (libfwsi cite 0x50 pour Poste de travail, 0x58 pour Réseau, 0x60 pour la Corbeille), suivi d'un GUID de 16 octets. L'item Poste de travail de l'échantillon fait 20 octets : 14 00 1f 50 puis {20D04FE0-3AEA-1069-A2D8-08002B30309D} en ordre d'octets mixte. Microsoft liste les GUID de dossiers dans KNOWNFOLDERID ; les CLSID comme celui du Poste de travail proviennent de documentations shell plus anciennes et de tables communautaires.

Volume (0x2F). Une lettre de lecteur à l'offset 3 : 19 00 2f 45 3a 5c 00 correspond à E:\. La lettre est celle attribuée par Windows à ce moment-là, pas une identité de périphérique.

Réseau (0x4X). Des indicateurs à l'offset 3, puis un emplacement terminé par NUL à l'offset 5. L'item de partage de l'échantillon 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 se lit \\FILESRV01\Finance. libfwsi documente les indicateurs 0x80 (description présente) et 0x40 (commentaires présents).

Délégué (0x74). Sous Windows 7 et suivants, les dossiers du profil utilisateur sont souvent stockés sous forme d'item délégué de signature CFSF enveloppant un file entry classique. Un parseur qui l'ignore perd le nom de nombreux dossiers du profil.

Ce que les parseurs font de l'inconnu

Les extensions shell peuvent définir leurs propres items, et Microsoft en ajoute à chaque version (téléphones en MTP, fournisseurs cloud, résultats de recherche). Un parseur sérieux décode ce qu'il connaît et conserve le reste en hexadécimal. Le ShellBags Parser affiche l'item brut dans le panneau de détails de chaque entrée et se rabat sur la plus longue chaîne UTF-16 lisible pour les items variables. Son README indique que les périphériques MTP, les items de contenu ZIP (0x52) et les résultats de recherche ne sont pas encore entièrement décodés ; ShellBags Explorer couvre davantage de types, une raison de plus de recouper les entrées étranges avec lui (voir le comparatif d'outils).

Pour aller plus loin

Articles liés

Articles liés