> Windows Syscalls
ntoskrnl.exeT1112T1070.001T1070.009

NtDeleteKey

Löscht einen Registrierungsschlüssel beim Schließen des Handles — wird verwendet, um Persistenz und Audit-Key-Artefakte nach Ausführung zu beseitigen.

Prototyp

NTSTATUS NtDeleteKey(
  HANDLE KeyHandle
);

Argumente

NameTypeDirDescription
KeyHandleHANDLEinZuvor mit DELETE-Recht (oder KEY_ALL_ACCESS) geöffnetes Handle.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070xC5win10-1507
Win10 16070xC8win10-1607
Win10 17030xCBwin10-1703
Win10 17090xCCwin10-1709
Win10 18030xCDwin10-1803
Win10 18090xCEwin10-1809
Win10 19030xCFwin10-1903
Win10 19090xCFwin10-1909
Win10 20040xD3win10-2004
Win10 20H20xD3win10-20h2
Win10 21H10xD3win10-21h1
Win10 21H20xD4win10-21h2
Win10 22H20xD4win10-22h2
Win11 21H20xD9win11-21h2
Win11 22H20xDAwin11-22h2
Win11 23H20xDAwin11-23h2
Win11 24H20xDCwin11-24h2
Server 20160xC8winserver-2016
Server 20190xCEwinserver-2019
Server 20220xD8winserver-2022
Server 20250xDCwinserver-2025

Kernel-Modul

ntoskrnl.exeNtDeleteKey

Verwandte APIs

RegDeleteKeyWRegDeleteKeyExWRegDeleteTreeWNtDeleteValueKeyNtEnumerateKeyNtClose

Syscall-Stub

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

Einargumentiger Syscall, aber mit subtiler Semantik: der Key wird zur Löschung *markiert* und erst beim Schließen des Handles tatsächlich entfernt — gleichzeitige Leser behalten Zugriff, bis sie ihre Handles freigeben. Der Key muss **Leaf** sein (keine Subkeys), sonst liefert der Aufruf `STATUS_CANNOT_DELETE`; Defense-Evasion-Tools, die einen Baum aufräumen, müssen depth-first rekursieren, abwechselnd `NtEnumerateKey` und `NtDeleteKey` von unten nach oben. Die SSN driftet über Builds spürbar (0xC5 auf 1507 → 0xDC auf 24H2), dynamische Auflösung ist Pflicht.

Häufige Malware-Nutzung

Reine **Defense Evasion (T1112 + T1070)**. Zwei wiederkehrende Muster. (1) **Persistenz-Cleanup nach Ausführung**: Sobald die Payload abgesetzt ist oder der Autorun nicht mehr gebraucht wird, entfernt das Implant seinen eigenen Run-/RunOnce-/IFEO-/Scheduled-Task-Cache-Footprint, um die forensische Rekonstruktion zu sabotieren. Self-Destruct-Stubs feuern typischerweise `NtDeleteKey` auf `\Registry\Machine\Software\Microsoft\Windows\CurrentVersion\Run\<implant>` und auf den zuvor gesetzten COM-CLSID-Hijack-Key. (2) **Indirekte Event-Log-Manipulation (T1070.001)**: Während der kanonische Angriff `wevtutil cl` oder ein EventLog-Service-Stop ist, nullen mehrere Stealer (LummaC2-Varianten, Atomic Stealer Win-Port) stattdessen die Audit-Subscription-Keys unter `\Registry\Machine\System\CurrentControlSet\Services\EventLog\Security\Channels\*` via NtDeleteKey und brechen so nachfolgendes Logging, ohne das auffällige Event-ID 1102 (Audit Log Cleared) auszulösen.

Erkennungs­möglichkeiten

Microsoft-Windows-Kernel-Registry-ETW emittiert ein Delete-Event mit vollem Pfad und PID. Sysmon Event ID 12 mit type=DeleteKey ist der direkte Catch. Entscheidend: ein EDR, der `CmRegisterCallbackEx` registriert, erhält `RegNtPreDeleteKey`- und `RegNtPostDeleteKey`-Benachrichtigungen auch dann, wenn User-Mode-Hooks per direktem Syscall umgangen werden — Kernel-Callbacks sehen die Operation post-dispatch. Hochwertige Hunts: Löschung jedes Pfades unter `\Microsoft\Windows\CurrentVersion\Run*`, `\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\*`, `\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\*` oder `\Services\EventLog\*`. Defender's Tamper Protection markiert Writes/Deletes auf AV-relevanten Registry-Bäumen; Korrelation mit dem ursprünglichen CreateKey/SetValue desselben SHA-256-Image-Hashs liefert einen End-to-End-Graphen Staging→Cleanup.

Direkte Syscall-Beispiele

cRemove our own Run-key persistence entry

// Open the value's parent key with DELETE access, then NtDeleteKey on the leaf.
UNICODE_STRING name;
RtlInitUnicodeString(&name,
    L"\\Registry\\Machine\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\Updater");

OBJECT_ATTRIBUTES oa;
InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);

HANDLE hKey = NULL;
if (NT_SUCCESS(NtOpenKey(&hKey, DELETE, &oa))) {
    NtDeleteKey(hKey);     // marks for deletion
    NtClose(hKey);          // actually deletes
}

asmDirect stub (SSN 0xDC, Win11 24H2)

; SSN drifts heavily; resolve dynamically before targeting multiple builds.
NtDeleteKey PROC
    mov  r10, rcx
    mov  eax, 0DCh         ; Win11 24H2
    syscall
    ret
NtDeleteKey ENDP

rustDepth-first key-tree wipe helper

use ntapi::ntregapi::{NtDeleteKey, NtEnumerateKey, NtOpenKey, KEY_BASIC_INFORMATION};
use winapi::shared::ntdef::HANDLE;

pub unsafe fn delete_tree(h_root: HANDLE) {
    let mut buf = vec![0u8; 0x400];
    let mut len = 0u32;
    loop {
        let s = NtEnumerateKey(
            h_root, 0,
            0 /* KeyBasicInformation */,
            buf.as_mut_ptr() as *mut _, buf.len() as u32, &mut len);
        if s != 0 { break; }
        let bi = &*(buf.as_ptr() as *const KEY_BASIC_INFORMATION);
        // open subkey here, recurse, then delete the leaf
    }
    NtDeleteKey(h_root);
}

MITRE ATT&CK-Mappings

Last verified: 2026-05-20