NtLoadKey2
Carga una colmena de registro en el árbol de configuración mediante un envoltorio de 2 banderas sobre NtLoadKey.
Prototipo
NTSTATUS NtLoadKey2( POBJECT_ATTRIBUTES TargetKey, POBJECT_ATTRIBUTES SourceFile, ULONG Flags );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| TargetKey | POBJECT_ATTRIBUTES | in | Atributos de objeto que describen la clave de punto de montaje (p. ej. \Registry\User\TempHive). |
| SourceFile | POBJECT_ATTRIBUTES | in | Atributos de objeto que apuntan al archivo de colmena en disco (ruta NT, p. ej. \??\C:\Windows\System32\config\SAM). |
| Flags | ULONG | in | REG_NO_LAZY_FLUSH (0x4) es el valor canónico; otros bits son ignorados en gran medida por el wrapper de 2 argumentos. |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0xF7 | win10-1507 |
| Win10 1607 | 0xFC | win10-1607 |
| Win10 1703 | 0x100 | win10-1703 |
| Win10 1709 | 0x101 | win10-1709 |
| Win10 1803 | 0x102 | win10-1803 |
| Win10 1809 | 0x102 | win10-1809 |
| Win10 1903 | 0x103 | win10-1903 |
| Win10 1909 | 0x103 | win10-1909 |
| Win10 2004 | 0x108 | win10-2004 |
| Win10 20H2 | 0x108 | win10-20h2 |
| Win10 21H1 | 0x108 | win10-21h1 |
| Win10 21H2 | 0x109 | win10-21h2 |
| Win10 22H2 | 0x109 | win10-22h2 |
| Win11 21H2 | 0x10E | win11-21h2 |
| Win11 22H2 | 0x10F | win11-22h2 |
| Win11 23H2 | 0x10F | win11-23h2 |
| Win11 24H2 | 0x111 | win11-24h2 |
| Server 2016 | 0xFC | winserver-2016 |
| Server 2019 | 0x102 | winserver-2019 |
| Server 2022 | 0x10D | winserver-2022 |
| Server 2025 | 0x111 | winserver-2025 |
Módulo del kernel
APIs relacionadas
Stub del syscall
4C 8B D1 mov r10, rcx B8 11 01 00 00 mov eax, 0x111 F6 04 25 08 03 FE 7F 01 test byte ptr [0x7FFE0308], 1 75 03 jne short +3 0F 05 syscall C3 ret CD 2E int 2Eh C3 ret
Notas no documentadas
`NtLoadKey2` es un envoltorio fino y obsoleto introducido en Windows 2000 / XP que reenvía a la misma ruta de kernel que `NtLoadKey`/`NtLoadKeyEx` (`CmLoadKey` dentro de `ntoskrnl.exe`). Solo acepta el argumento `Flags` legado y carece de los parámetros modernos `TrustClassKey`, `Event`, `TokenHandle` e `IoPriority` de `NtLoadKeyEx`. Microsoft lo considera reemplazado, pero el export sigue presente en todas las ntdll enviadas hasta 24H2 incluida, y el SSN aún mapea a un handler real — exactamente el tipo de rincón obsoleto-pero-invocable que los atacantes prefieren porque hooks y reglas EDR suelen olvidarlo.
Uso común por malware
Tradecraft de dump de credenciales offline: atacantes al estilo `secretsdump` copian una colmena víctima (SAM, SYSTEM, SECURITY) vía VSS / NTFS crudo, luego la montan bajo una clave arbitraria con `NtLoadKey`/`NtLoadKey2` para enumerarla con las APIs habituales `RegOpenKeyEx` / `NtOpenKey` sin parsear ellos mismos el formato binario. `NtLoadKey2` se invoca cuando un operador sustituye deliberadamente el evidente `RegLoadKeyW` (que va por `NtLoadKeyEx`) por la variante más antigua para esquivar listas de hooks ingenuas. Requiere `SeRestorePrivilege` y `SeBackupPrivilege` — es decir, administrador local.
Oportunidades de detección
Cualquier llamada a `NtLoadKey*` desde un binario no-Microsoft es de alta señal porque los consumidores legítimos se reducen a `regedit.exe`, `reg.exe`, `appidcertstorecheck.exe`, el cargador de perfil de usuario y un puñado de herramientas de imagen. Sysmon Event ID 12/13/14 (Registry) **no** se dispara para cargas de colmena — el kernel solo emite vía el provider ETW `Microsoft-Windows-Kernel-Registry` (event ID 9 = HiveLoaded). EDRs que rastrean la habilitación de `SeRestorePrivilege` seguida de aperturas de `\??\...\config\SAM` detectan el patrón canónico de dump SAM; la apertura del archivo suele ser mejor disparador que el propio syscall.
Ejemplos de syscalls directos
asmx64 direct stub (Win11 24H2)
; Direct syscall stub for NtLoadKey2 (SSN 0x111 on Win11 24H2)
NtLoadKey2 PROC
mov r10, rcx ; TargetKey
mov eax, 111h ; SSN — drifts per build
syscall
ret
NtLoadKey2 ENDPcMount an offline SAM hive grabbed via VSS
// Requires SeRestorePrivilege + SeBackupPrivilege enabled on the caller.
#include <windows.h>
#include <winternl.h>
typedef NTSTATUS (NTAPI *pNtLoadKey2)(POBJECT_ATTRIBUTES, POBJECT_ATTRIBUTES, ULONG);
NTSTATUS MountHive(LPCWSTR ntMountPath, LPCWSTR ntHiveFile) {
UNICODE_STRING uMount, uFile;
OBJECT_ATTRIBUTES oaMount, oaFile;
RtlInitUnicodeString(&uMount, ntMountPath); // e.g. L"\\REGISTRY\\USER\\OfflineSAM"
RtlInitUnicodeString(&uFile, ntHiveFile); // e.g. L"\\??\\C:\\temp\\SAM_copy"
InitializeObjectAttributes(&oaMount, &uMount, OBJ_CASE_INSENSITIVE, NULL, NULL);
InitializeObjectAttributes(&oaFile, &uFile, OBJ_CASE_INSENSITIVE, NULL, NULL);
pNtLoadKey2 fn = (pNtLoadKey2)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtLoadKey2");
return fn(&oaMount, &oaFile, 0x4 /* REG_NO_LAZY_FLUSH */);
}Mapeos MITRE ATT&CK
Last verified: 2026-05-20