Skip to content

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.

Publicado el 8 min de lectura

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 claseItemContenido principalEvidencia
0x1FCarpeta raízÍndice de ordenación + GUID de carpeta conocidaRaíz del espacio de nombres: Mi PC, Red, Papelera, perfil del usuario, Acceso rápido / Inicio.
0x20–0x2FVolumenLetra de unidad (E:\), o un GUID para algunos tipos de dispositivoQué letra de unidad se recorrió. Crúcela con el historial USB.
0x30–0x3FFile entryTamaño, fecha de modificación FAT, atributos, nombre principal (8.3), bloques de extensiónNombre de carpeta, fechas, referencia MFT. Indicador 0x01 = directorio, 0x02 = archivo, 0x04 = nombres Unicode.
0x40–0x4FUbicación de redIndicadores, cadena de ubicación (\\servidor, \\servidor\recurso), descripción/comentarios opcionalesRutas UNC de recursos compartidos y servidores.
0x52Visto dentro de carpetas comprimidasNo documentado del todo en libfwsiNavegación dentro de archivos comprimidos.
0x61URICadena de URLSitios FTP y otras carpetas direccionadas por URI.
0x71Panel de controlGUID del appletCategorías y elementos del Panel de control abiertos.
0x74Delegado (carpeta de archivos del usuario)Firma CFSF que envuelve un file entryHabitual en carpetas del perfil en Windows 7+.
0x00VariableVaría: dispositivos MTP, resultados de búsqueda, otras extensiones de shellA 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.....
OffsetBytesCampoValor
0x0066 00Tamaño del item102 bytes
0x0231Tipo de claseFile entry, indicador de directorio (0x01), nombre principal ASCII
0x0400 00 00 00Tamaño del archivo0 (directorios)
0x082e 5d a0 55Modificación, fecha + hora FAT2026-09-14 10:45:00
0x0C10 00Atributos de archivoFILE_ATTRIBUTE_DIRECTORY (0x10)
0x0EFINANCE_2026\0Nombre principalNombre corto, con relleno hasta un offset par
0x1C4a 00Tamaño del bloque de extensión74 bytes
0x1E09 00Versión de la extensión9
0x2004 00 ef beFirma0xBEEF0004
0x242e 5d a0 55Creación (FAT)2026-09-14 10:45:00
0x282e 5d a0 55Acceso (FAT)2026-09-14 10:45:00
0x3024 00 00 00 00 00 01 00Referencia de archivo NTFSEntrada MFT 36, secuencia 1
0x4AUTF-16LENombre largofinance_2026
0x641c 00Offset del primer bloque de extensión0x1C

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ónVista enAñade
3Windows XP, 2003Fechas de creación y acceso, nombre largo
7Windows VistaReferencia de archivo NTFS (entrada MFT + secuencia)
8Windows 7, 2008, 8.0Campos adicionales antes del nombre largo
9Windows 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

Artículos relacionados

Artículos relacionados