> Windows Syscalls
ntoskrnl.exeT1112T1547.001T1106

NtRenameKey

Renombra una clave de registro existente en sitio — sin wrapper Win32, sólo accesible vía la API NT.

Prototipo

NTSTATUS NtRenameKey(
  HANDLE          KeyHandle,
  PUNICODE_STRING NewName
);

Argumentos

NameTypeDirDescription
KeyHandleHANDLEinHandle a la clave a renombrar, abierta con acceso KEY_WRITE.
NewNamePUNICODE_STRINGinNuevo nombre de hoja (no una ruta). No debe contener barra invertida y debe ser único entre sus hermanos.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070x158win10-1507
Win10 16070x15Fwin10-1607
Win10 17030x165win10-1703
Win10 17090x168win10-1709
Win10 18030x16Awin10-1803
Win10 18090x16Bwin10-1809
Win10 19030x16Cwin10-1903
Win10 19090x16Cwin10-1909
Win10 20040x172win10-2004
Win10 20H20x172win10-20h2
Win10 21H10x172win10-21h1
Win10 21H20x174win10-21h2
Win10 22H20x174win10-22h2
Win11 21H20x17Cwin11-21h2
Win11 22H20x17Fwin11-22h2
Win11 23H20x17Fwin11-23h2
Win11 24H20x181win11-24h2
Server 20160x15Fwinserver-2016
Server 20190x16Bwinserver-2019
Server 20220x17Awinserver-2022
Server 20250x181winserver-2025

Módulo del kernel

ntoskrnl.exeNtRenameKey

APIs relacionadas

NtSetValueKeyNtSaveKeyNtRestoreKeyRegRenameKey (no Win32 export — emulated)

Stub del syscall

4C 8B D1            mov r10, rcx
B8 81 01 00 00      mov eax, 0x181
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

NtRenameKey no está documentada en MSDN — Win32 no expone equivalente y Reflection.RegistryKey no puede alcanzarla. La operación es atómica dentro de CmRenameKey, que llama a CmpDuplicateKeyValueInformation sobre un KCB recién creado y luego desvincula el nombre anterior del HHIVE del padre. Bloqueos retenidos: HiveLock + bloqueo KCB del padre. Devuelve STATUS_OBJECT_NAME_COLLISION si ya existe un hermano con NewName.

Uso común por malware

Raro en ofensiva. El nicho plausible es la *evasión de allowlist*: esquemas de persistencia que rotan el nombre de un valor `Run` (o el nombre de una clave bajo `Image File Execution Options`) para vencer allowlists ingenuas del defensor que buscan nombres específicos. También sirve para renombrar temporalmente una clave relacionada con seguridad mientras se prepara otro cambio y luego revertir — aunque ese patrón se hace más limpio con NtSaveKey/NtRestoreKey. Señal honesta: la mayoría de informes públicos de rotación de registro usan NtSetValueKey para cambiar el nombre de un valor en lugar de NtRenameKey sobre la clave misma.

Oportunidades de detección

Ruido de fondo realmente bajo — casi nada legítimo invoca NtRenameKey. ETW Microsoft-Windows-Kernel-Registry emite un evento de tarea RenameKey. Sysmon Event 12 (RegistryEvent CreateKey/DeleteKey) no separa renombres limpiamente — aparece como DeleteKey sobre la ruta antigua seguido de CreateKey sobre la nueva con el mismo KCB. CmRegisterCallbackEx entrega RegNtPreRenameKey / RegNtPostRenameKey, el punto de hook más limpio. Un único RenameKey bajo HKLM\SYSTEM\CurrentControlSet\Services o HKLM\Software\Microsoft\Windows\CurrentVersion\Run debería investigarse siempre.

Ejemplos de syscalls directos

cRotate a Run subkey name

// Rotate the leaf name of HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Updater
// to evade trivial 'name == Updater' allowlists.
UNICODE_STRING newName;
RtlInitUnicodeString(&newName, L"WindowsUpdateHelper");
NTSTATUS st = NtRenameKey(hRunSubkey, &newName);
if (st == STATUS_OBJECT_NAME_COLLISION) {
    // sibling exists — pick a different rotated name
}

asmx64 direct stub (Win11 24H2 SSN 0x181)

NtRenameKey PROC
    mov  r10, rcx
    mov  eax, 181h
    syscall
    ret
NtRenameKey ENDP

rustntapi binding

// Cargo: ntapi = "0.4", widestring = "1"
let name = U16CString::from_str("WindowsUpdateHelper")?;
let mut us = UNICODE_STRING {
    Length: (name.len() * 2) as u16,
    MaximumLength: ((name.len() + 1) * 2) as u16,
    Buffer: name.as_ptr() as _,
};
let status = unsafe { NtRenameKey(h_key, &mut us) };

Mapeos MITRE ATT&CK

Last verified: 2026-05-20