Formato de los shell items: dentro de un ShellBag
Los shell items de los valores BagMRU byte a byte: tipos de clase, items file entry, bloque 0xBEEF0004, referencias MFT e items de red, para analistas.
TL;DR. Cada valor numerado de una clave BagMRU es una ITEMIDLIST con un único shell item: un tamaño de 2 bytes, un byte de tipo de clase en el offset 2 y un cuerpo específico del tipo. 0x1F es una carpeta raíz (un GUID como Mi PC), 0x2X un volumen, 0x3X un «file entry» (carpeta o archivo, con el nombre 8.3 y una fecha de modificación), 0x4X una ubicación de red, 0x71 un elemento del Panel de control, 0x74 un delegado. La mayoría de items file entry terminan con un bloque de extensión 0xBEEF0004 que añade las fechas de creación y acceso, el número de entrada MFT y de secuencia de NTFS, y el nombre largo. Microsoft no documenta el formato; la referencia es libfwsi de libyal.
No hace falta decodificar shell items a mano para usar los ShellBags. Sí hace falta saber qué pueden contener los bytes y qué no, porque eso delimita lo que puede afirmar. Este artículo recorre un item con estructura real tomado de la muestra del sitio y el puñado de estructuras que contienen evidencia.
ITEMIDLIST en un párrafo
El shell de Windows direcciona objetos (carpetas, unidades, applets del Panel de control, dispositivos) con listas de identificadores. Microsoft documenta el contenedor: una ITEMIDLIST es una secuencia de estructuras SHITEMID, cada una con un tamaño cb de 2 bytes, terminada por un elemento de longitud cero. El contenido de cada item es privado de la carpeta shell que lo creó. La especificación comunitaria que llena ese vacío es el Windows Shell Item format de libyal (libfwsi). Los mismos items aparecen en los archivos LNK (la LinkTargetIDList de MS-SHLLINK) y en las Jump Lists, así que este conocimiento es transferible.
En un valor BagMRU, la lista contiene un único item: el componente de ruta de esa clave. La ruta completa sale de recorrer el árbol de claves, no de un solo valor.
Tipos de clase
El byte en el offset 2 identifica el item. libfwsi agrupa volúmenes, file entries e items de red por el nibble alto (class_type & 0x70):
| Tipo de clase | Item | Contenido principal | Evidencia |
|---|---|---|---|
0x1F | Carpeta raíz | Índice de ordenación + GUID de carpeta conocida | Raíz del espacio de nombres: Mi PC, Red, Papelera, perfil del usuario, Acceso rápido / Inicio. |
0x20–0x2F | Volumen | Letra de unidad (E:\), o un GUID para algunos tipos de dispositivo | Qué letra de unidad se recorrió. Crúcela con el historial USB. |
0x30–0x3F | File entry | Tamaño, fecha de modificación FAT, atributos, nombre principal (8.3), bloques de extensión | Nombre de carpeta, fechas, referencia MFT. Indicador 0x01 = directorio, 0x02 = archivo, 0x04 = nombres Unicode. |
0x40–0x4F | Ubicación de red | Indicadores, cadena de ubicación (\\servidor, \\servidor\recurso), descripción/comentarios opcionales | Rutas UNC de recursos compartidos y servidores. |
0x52 | Visto dentro de carpetas comprimidas | No documentado del todo en libfwsi | Navegación dentro de archivos comprimidos. |
0x61 | URI | Cadena de URL | Sitios FTP y otras carpetas direccionadas por URI. |
0x71 | Panel de control | GUID del applet | Categorías y elementos del Panel de control abiertos. |
0x74 | Delegado (carpeta de archivos del usuario) | Firma CFSF que envuelve un file entry | Habitual en carpetas del perfil en Windows 7+. |
0x00 | Variable | Varía: dispositivos MTP, resultados de búsqueda, otras extensiones de shell | A menudo solo se puede extraer un nombre legible. |
Un item file entry, byte a byte
Esta es la carpeta finance_2026 de la muestra de ShellBags Parser. Los datos son sintéticos (historia ficticia) pero construidos con la estructura real:
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.....
| Offset | Bytes | Campo | Valor |
|---|---|---|---|
| 0x00 | 66 00 | Tamaño del item | 102 bytes |
| 0x02 | 31 | Tipo de clase | File entry, indicador de directorio (0x01), nombre principal ASCII |
| 0x04 | 00 00 00 00 | Tamaño del archivo | 0 (directorios) |
| 0x08 | 2e 5d a0 55 | Modificación, fecha + hora FAT | 2026-09-14 10:45:00 |
| 0x0C | 10 00 | Atributos de archivo | FILE_ATTRIBUTE_DIRECTORY (0x10) |
| 0x0E | FINANCE_2026\0 | Nombre principal | Nombre corto, con relleno hasta un offset par |
| 0x1C | 4a 00 | Tamaño del bloque de extensión | 74 bytes |
| 0x1E | 09 00 | Versión de la extensión | 9 |
| 0x20 | 04 00 ef be | Firma | 0xBEEF0004 |
| 0x24 | 2e 5d a0 55 | Creación (FAT) | 2026-09-14 10:45:00 |
| 0x28 | 2e 5d a0 55 | Acceso (FAT) | 2026-09-14 10:45:00 |
| 0x30 | 24 00 00 00 00 00 01 00 | Referencia de archivo NTFS | Entrada MFT 36, secuencia 1 |
| 0x4A | UTF-16LE | Nombre largo | finance_2026 |
| 0x64 | 1c 00 | Offset del primer bloque de extensión | 0x1C |
Decodificación de los valores FAT: la palabra de fecha 0x5D2E contiene el año desde 1980 en los bits 9 a 15 (46 → 2026), el mes en los bits 5 a 8 (9) y el día en los bits 0 a 4 (14). La palabra de hora 0x55A0 contiene la hora en los bits 11 a 15 (10), el minuto en los bits 5 a 10 (45) y los segundos/2 en los bits 0 a 4. Microsoft documenta la misma estructura para DosDateTimeToFileTime. Véase marca de tiempo FAT para las implicaciones en la precisión.
El bloque de extensión 0xBEEF0004
Los bloques de extensión siguen al cuerpo del item. Cada uno empieza con un tamaño de 2 bytes, una versión de 2 bytes y una firma de 4 bytes. La extensión file entry, con firma 0xBEEF0004, es la que importa para los ShellBags. Según libfwsi:
| Versión | Vista en | Añade |
|---|---|---|
| 3 | Windows XP, 2003 | Fechas de creación y acceso, nombre largo |
| 7 | Windows Vista | Referencia de archivo NTFS (entrada MFT + secuencia) |
| 8 | Windows 7, 2008, 8.0 | Campos adicionales antes del nombre largo |
| 9 | Windows 8.1, 10 (conjunto de pruebas de libfwsi; compruebe usted mismo los items de Windows 11) | Campos adicionales antes del nombre largo |
La versión es en sí una pista: una entrada con un bloque de versión 3 se creó con código de la época de XP, lo que importa cuando un perfil se ha migrado. Los campos que cambian entre versiones están antes del nombre largo, por eso un parser tiene que conocer la versión para encontrar el nombre. ShellBags Parser muestra la versión en el detalle de la entrada.
La referencia de archivo MFT
A partir de la versión 7, el offset 20 del bloque (0x30 en el ejemplo) contiene una referencia de archivo NTFS de 8 bytes: un número de entrada MFT de 48 bits y un número de secuencia de 16 bits, la estructura que Microsoft documenta como MFT_SEGMENT_REFERENCE. Es el campo menos aprovechado de los ShellBags:
- Filtre la $MFT o el diario USN por la entrada 36: si el número de secuencia allí es mayor, la carpeta se borró y el registro se reutilizó.
- Las carpetas en volúmenes FAT/exFAT no tienen MFT, así que el campo es cero o no tiene sentido.
- Los items que no proceden de directorios NTFS (contenido de archivos comprimidos, items de red) no llevan una referencia útil.
Más en la entrada del glosario sobre referencias de archivo MFT y en el artículo sobre carpetas borradas.
Otros items que conviene reconocer
Carpeta raíz (0x1F). El byte 3 es un índice de ordenación (libfwsi cita 0x50 para Mi PC, 0x58 para Red y 0x60 para la Papelera), seguido de un GUID de 16 bytes. El item Mi PC de la muestra ocupa 20 bytes: 14 00 1f 50 y luego {20D04FE0-3AEA-1069-A2D8-08002B30309D} en orden de bytes mixto. Microsoft lista los GUID de carpetas en KNOWNFOLDERID; los CLSID como el de Mi PC proceden de documentación del shell más antigua y de tablas comunitarias.
Volumen (0x2F). Una letra de unidad en el offset 3: 19 00 2f 45 3a 5c 00 es E:\. La letra es la que Windows asignó en ese momento, no una identidad de dispositivo.
Red (0x4X). Indicadores en el offset 3 y luego una ubicación terminada en NUL en el offset 5. El item de recurso compartido de la muestra 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 lee \\FILESRV01\Finance. libfwsi documenta los indicadores 0x80 (hay descripción) y 0x40 (hay comentarios).
Delegado (0x74). En Windows 7 y posteriores, las carpetas del perfil de usuario se guardan a menudo como item delegado con la firma CFSF, que envuelve un file entry normal. Un parser que lo ignore pierde los nombres de muchas carpetas del perfil.
Qué hacen los parsers con lo desconocido
Las extensiones de shell pueden definir sus propios items, y Microsoft añade nuevos en cada versión (teléfonos por MTP, proveedores en la nube, resultados de búsqueda). Un parser cuidadoso decodifica lo que conoce y conserva el resto en hexadecimal. ShellBags Parser muestra el item en bruto en el panel de detalles de cada entrada y, para los items variables, recurre a la cadena UTF-16 legible más larga. Su README indica que los dispositivos MTP, los items de contenido ZIP (0x52) y los resultados de búsqueda aún no se decodifican del todo; ShellBags Explorer cubre más tipos, una razón más para contrastar con él las entradas extrañas (véase la comparativa de herramientas).
Más lecturas
- libfwsi: Windows Shell Item format
- Kaitai Struct: Windows shell items
- Microsoft: ITEMIDLIST, SHITEMID