Artefactos de Windows · Lección 1 de 9
El Registro: subárboles, claves, marcas de tiempo LastWrite y registros de transacciones
12 min de lectura
El Registro de Windows es la base de datos jerárquica en la que Windows y las aplicaciones guardan su configuración y en la que, como efecto secundario, registran gran parte de la actividad del usuario y del sistema. La mayoría de las lecciones de este módulo examinan evidencia que contiene. Esta lección aborda los fundamentos: qué archivos contienen el Registro, cómo se corresponden con las claves que se ven en Regedit, cómo almacena el formato de archivo las claves y los valores, qué demuestra la marca de tiempo LastWrite de una clave y por qué un subárbol sin conexión debe leerse junto con sus registros de transacciones. Se aplica a Windows 10 y 11.
Subárboles y claves raíz
El Registro es un árbol de claves (similares a carpetas) que contienen valores (elementos de datos con nombre) y subclaves. En disco se divide en subárboles: archivos independientes, cada uno de los cuales se carga en un punto del árbol. Regedit muestra cinco claves raíz, pero solo dos son raíces reales: HKEY_LOCAL_MACHINE (HKLM) y HKEY_USERS (HKU). Las demás son vistas. HKEY_CURRENT_USER (HKCU) es un vínculo a HKU\<SID> del usuario que ha iniciado sesión, HKEY_CLASSES_ROOT combina HKLM\SOFTWARE\Classes con las clases del usuario, y HKEY_CURRENT_CONFIG apunta al subárbol SYSTEM. Un SID (identificador de seguridad), como S-1-5-21-…-1001, identifica una cuenta; la lección 2.2 aborda los SID.
HKLM\HARDWARE no tiene ningún archivo: es un subárbol volátil que Windows crea en memoria en cada arranque a partir del hardware detectado, por lo que nunca aparece en una imagen de disco ni en una recopilación de triaje. Amcache.hve utiliza el mismo formato de archivo, pero no se monta bajo ninguna clave raíz que muestre Regedit; la lección 2.3 lo aborda.
| Archivo de subárbol | Ruta en disco | Clave en el sistema en ejecución | Ejemplos de evidencia |
|---|---|---|---|
| SYSTEM | C:\Windows\System32\config\SYSTEM | HKLM\SYSTEM | Nombre del equipo, zona horaria, servicios, dispositivos USB, Shimcache, BAM |
| SOFTWARE | C:\Windows\System32\config\SOFTWARE | HKLM\SOFTWARE | Versión del sistema operativo y fecha de instalación, programas instalados, perfiles de red, ProfileList (SID a ruta del perfil), claves Run del equipo |
| SAM | C:\Windows\System32\config\SAM | HKLM\SAM | Cuentas locales, RID, último inicio de sesión, número de inicios de sesión, marcas de tiempo de cambio de contraseña |
| SECURITY | C:\Windows\System32\config\SECURITY | HKLM\SECURITY | Directiva de auditoría, secretos de LSA e inicios de sesión de dominio almacenados en caché (cifrados) |
| DEFAULT | C:\Windows\System32\config\DEFAULT | HKU\.DEFAULT | Configuración del perfil LocalSystem; rara vez es un elemento central |
| NTUSER.DAT | C:\Users\<user>\NTUSER.DAT | HKU\<SID>, que ese usuario ve como HKCU | RecentDocs, UserAssist, rutas escritas, MountPoints2, claves Run del usuario |
| UsrClass.dat | C:\Users\<user>\AppData\Local\Microsoft\Windows\UsrClass.dat | HKU\<SID>_Classes (HKCU\Software\Classes) | Shellbags, asociaciones de archivos y registros COM por usuario |
| Amcache.hve | C:\Windows\AppCompat\Programs\Amcache.hve | No visible en Regedit | Inventario de programas con hashes SHA-1 (lección 2.3) |
La carpeta config también contiene otros subárboles, como COMPONENTS y DRIVERS. Los subárboles de un usuario solo se cargan mientras ese usuario tiene una sesión iniciada.
CurrentControlSet en un subárbol sin conexión
Las guías citan rutas como HKLM\SYSTEM\CurrentControlSet\Services, pero CurrentControlSet es un vínculo que Windows crea durante el arranque; no existe en el archivo SYSTEM. El archivo contiene conjuntos numerados, normalmente ControlSet001 y, a veces, ControlSet002. Para saber cuál estaba en uso, lea SYSTEM\Select: su valor DWORD Current indica el número (1 significa ControlSet001). La mayoría de los analizadores resuelven esto automáticamente, pero cuando la respuesta deba ser una ruta exacta, compruebe Select e indique el conjunto de control real.
El formato de archivo regf
Todos los archivos de subárbol siguen la misma estructura, a menudo denominada regf por su firma. Todos los enteros están en formato little-endian.
Bloque base
El archivo comienza con un bloque base (cabecera) de 4.096 bytes:
| Desplazamiento | Tamaño | Campo |
|---|---|---|
| 0x00 | 4 | Firma regf |
| 0x04 | 4 | Número de secuencia primario |
| 0x08 | 4 | Número de secuencia secundario |
| 0x0C | 8 | Marca de tiempo de última escritura (FILETIME, UTC) |
| 0x14 | 4 + 4 | Versión principal (1), versión secundaria |
| 0x24 | 4 | Desplazamiento de la celda de la clave raíz |
| 0x28 | 4 | Tamaño de los datos de los bloques del subárbol |
| 0x1FC | 4 | Suma de comprobación (XOR de los primeros 508 bytes) |
Windows incrementa el número de secuencia primario antes de escribir en el archivo de subárbol y establece el número secundario en el mismo valor cuando finaliza la escritura. Si los dos números difieren, el subárbol está sucio: la última escritura en el archivo primario no se completó y los datos actuales pueden existir únicamente en los registros de transacciones.
Bloques de subárbol y celdas
Después del bloque base vienen los bloques de subárbol, cada uno de los cuales comienza con la firma hbin y tiene un tamaño múltiplo de 4.096 bytes. Un bloque se divide en celdas, cada una de las cuales comienza con un tamaño de 4 bytes con signo: un valor negativo significa que está asignada y uno positivo, que está libre. Los desplazamientos de las celdas son relativos al primer bloque, por lo que el desplazamiento en el archivo es el desplazamiento de la celda más 4.096.
Los principales tipos de celda son:
- nk (nodo de clave): una por clave: nombre, marca de tiempo LastWrite, desplazamiento de la clave principal, recuentos y listas de subclaves y valores, y el desplazamiento de su celda de seguridad.
- vk (clave de valor): una por valor: nombre, tipo de datos, tamaño de los datos y los propios datos (4 bytes o menos) o el desplazamiento de la celda de datos.
- Listas: listas de subclaves (firmas
lf,lh,liyri) y listas de valores (una matriz simple de desplazamientos); las celdasdbcontienen datos de gran tamaño divididos en segmentos. - sk (clave de seguridad): un descriptor de seguridad (propietario y permisos), compartido por muchas claves.
El tipo de datos de una celda vk indica cómo leer los bytes:
| Tipo | Número | Contenido |
|---|---|---|
| REG_SZ | 1 | Cadena UTF-16LE, normalmente terminada en un carácter nulo |
| REG_EXPAND_SZ | 2 | Cadena con variables como %SystemRoot% |
| REG_BINARY | 3 | Bytes sin procesar, a menudo una estructura con marcas de tiempo integradas |
| REG_DWORD | 4 | Entero de 32 bits en formato little-endian |
| REG_MULTI_SZ | 7 | Lista de cadenas, terminada por una cadena vacía |
| REG_QWORD | 11 | Entero de 64 bits en formato little-endian, a menudo un FILETIME |
Marcas de tiempo LastWrite
Cada celda nk contiene un FILETIME de 8 bytes: un recuento de intervalos de 100 nanosegundos desde 1601-01-01 00:00:00 UTC. Windows lo establece cuando se crea la clave y lo actualiza cada vez que se añade, modifica o elimina un valor de esa clave; añadir o eliminar una subclave directa normalmente también lo actualiza. De ello se derivan tres consecuencias:
- Solo las claves tienen marcas de tiempo. Los valores no tienen ninguna. Cuando un valor contiene una marca de tiempo (UserAssist, BAM, propiedades de dispositivos USB), esta forma parte de sus datos y tiene su propio significado.
- Indica cuándo, no qué. Una marca de tiempo LastWrite indica que algo en la clave cambió en ese momento, no qué valor cambió ni cómo. Si una clave tiene diez valores, cualquiera de ellos, o un valor que se haya eliminado desde entonces, podría explicar esa marca de tiempo.
- Solo refleja el cambio más reciente. Pueden conservarse versiones anteriores de la clave en las instantáneas de volumen (lección 2.9) o en los registros de transacciones.
LastWrite se almacena en UTC, independientemente de la zona horaria del sistema. Tenga precaución con los grupos de marcas de tiempo idénticas: las actualizaciones de Windows pueden reescribir muchas claves a la vez, y las marcas de tiempo LastWrite pueden alterarse deliberadamente (módulo 7).
Registros de transacciones y subárboles sucios
Junto a cada archivo de subárbol, Windows mantiene dos registros de transacciones con el mismo nombre más .LOG1 y .LOG2, por ejemplo, SYSTEM.LOG1, SYSTEM.LOG2, NTUSER.DAT.LOG1 y UsrClass.dat.LOG2. En el perfil del usuario son archivos ocultos. Windows 8.1 introdujo un nuevo formato de registro, utilizado por Windows 10 y 11, en el que cada entrada comienza con la firma HvLE y contiene las páginas modificadas con sus propios números de secuencia.
Desde ese cambio, Windows escribe las modificaciones primero en los registros y las vuelca al archivo de subárbol primario después, a veces mucho después. Por tanto, un subárbol copiado de un sistema en ejecución, como en una recopilación de triaje en vivo, suele estar sucio, y sus cambios más recientes (un nuevo valor Run, un dispositivo USB recién conectado) pueden existir únicamente en los registros. El archivo primario por sí solo ofrece un estado anterior.
Por este motivo:
- Una recopilación de triaje debe incluir
.LOG1y.LOG2para cada subárbol, recopilados al mismo tiempo que este. Una recopilación de triaje normalmente los conserva junto a cada subárbol en su ruta original. - Aplique los registros antes del análisis. Registry Explorer detecta un subárbol sucio y ofrece aplicar los registros a una copia limpia. RECmd aplica los registros que encuentra junto al subárbol. La biblioteca de Python yarp, de Maxim Suhanov, puede aplicar registros y recuperar datos. RegRipper analiza el archivo primario tal como está, por lo que primero debe aplicar los registros y ejecutarlo sobre la copia limpia.
- Aplique los registros a un archivo nuevo, nunca a su única copia, y documente qué registros utilizó.
Claves y valores eliminados
Cuando se elimina una clave o un valor, Windows marca sus celdas como libres (tamaño positivo), pero no necesariamente las sobrescribe. Hasta que se reutilice el espacio, las celdas nk, vk y de datos siguen siendo legibles, incluidos el nombre y la marca de tiempo LastWrite de la clave eliminada. Registry Explorer y yarp recuperan estas claves y valores. Una clave recuperada sin una clave principal válida se muestra como no asociada: su contenido es real, pero su ubicación original puede ser desconocida.
RegBack
C:\Windows\System32\config\RegBack contenía anteriormente copias de seguridad periódicas de los subárboles del sistema. Desde Windows 10 versión 1803, Windows ya no genera estas copias de forma predeterminada: la carpeta suele estar presente, pero vacía o con archivos de cero bytes. Microsoft documenta un valor, EnablePeriodicBackup, que vuelve a activar la copia de seguridad, por lo que debe comprobar los tamaños y las fechas de los archivos antes de descartar la carpeta.
Herramientas
Registry Explorer permite explorar subárboles, aplicar registros, mostrar celdas eliminadas y decodificar muchos valores. RECmd es su equivalente de línea de comandos; con un archivo por lotes (por ejemplo, Kroll_Batch.reb), extrae un conjunto definido de claves de muchos subárboles a CSV. RegRipper ejecuta complementos, cada uno de los cuales genera un informe sobre un artefacto. yarp resulta adecuado para el análisis y la recuperación mediante scripts. Utilice un editor hexadecimal cuando una respuesta exacta dependa de los bytes sin procesar.
Ejemplo resuelto: decodificación de una marca de tiempo LastWrite
En un NTUSER.DAT limpio, examina la clave Software\Microsoft\Windows\CurrentVersion\Run. Contiene dos valores, OneDrive y updater. El inicio de su celda nk muestra:
| Desplazamiento en la celda | Bytes | Significado |
|---|---|---|
| 0x00 | A8 FF FF FF | Tamaño de celda 0xFFFFFFA8 = −88: asignada, 88 bytes |
| 0x04 | 6E 6B | Firma nk |
| 0x06 | 20 00 | Indicadores 0x0020: nombre almacenado como ASCII |
| 0x08 | D0 BD 5D 65 9A B3 DC 01 | FILETIME de LastWrite |
Orden de bytes. Invierta los ocho bytes little-endian: 0x01DCB39A655DBDD0 = 134.179.564.621.250.000.
Unidades. Divida entre 10.000.000 (intervalos de 100-ns por segundo): 13.417.956.462,125 segundos desde 1601-01-01.
Época. Reste 11.644.473.600 segundos (de 1601-01-01 a 1970-01-01): tiempo Unix 1.773.482.862,125.
Fecha y hora. 1.773.482.862 ÷ 86.400 = 20.526 días, con un resto de 36.462 s. El día 20.526 después de 1970-01-01 es 2026-03-14; 36.462 s = 10 h 07 min 42 s. La marca de tiempo LastWrite es 2026-03-14T10:07:42.125Z.
Qué demuestra. Algo bajo la clave Run se añadió, cambió o eliminó a las 10:07:42Z, y este es el cambio de ese tipo más reciente.
Qué no demuestra. No demuestra que updater se añadiera entonces: OneDrive podría haber reescrito su propio valor, o podría haberse eliminado un tercer valor. No demuestra que el programa se ejecutara ni quién realizó el cambio. Para atribuirlo, compare con una copia anterior de la clave (instantánea de volumen o entradas de los registros), compruebe la $MFT y el diario USN en busca del archivo al que apunta updater, y busque evidencia de ejecución (lección 2.3).
Enfoque del examen: Prepárese para relacionar un artefacto con el archivo de subárbol correcto y su ruta en una recopilación de triaje, resolverCurrentControlSetmedianteSYSTEM\Selecte informar de la marca de tiempo LastWrite de una clave en UTC a partir de un subárbol cuyos registros deben aplicarse primero. Las preguntas pueden evaluar la regla de los números de secuencia para los subárboles sucios, el hecho de que los valores no tienen marcas de tiempo y qué puede y qué no puede respaldar una marca de tiempo LastWrite.
Puntos clave
- Los subárboles son archivos: SYSTEM, SOFTWARE, SAM, SECURITY y DEFAULT en
System32\config; NTUSER.DAT y UsrClass.dat en cada perfil.HKLM\HARDWAREse crea en memoria durante el arranque. - Sin conexión no existe
CurrentControlSet;SYSTEM\Select\Currentindica el ControlSet00n que debe utilizarse. - Los archivos regf comienzan con un bloque base de 4.096 bytes; si los números de secuencia primario y secundario son distintos, el subárbol está sucio. Los datos se almacenan en bloques
hbincomo celdas nk, vk, de lista y sk. - Solo las claves tienen un FILETIME de LastWrite (UTC); muestra cuándo cambió algo en la clave por última vez, no qué cambió.
- Recopile y aplique
.LOG1/.LOG2antes del análisis; los cambios recientes pueden existir únicamente en los registros. - Las claves y los valores eliminados suelen conservarse en celdas libres; las copias de RegBack no se generan de forma predeterminada desde Windows 10 versión 1803.