NtResumeThread
Verringert den Suspend-Count eines Threads; bei Wert null wird die Ausführung fortgesetzt.
Prototyp
NTSTATUS NtResumeThread( HANDLE ThreadHandle, PULONG PreviousSuspendCount );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| ThreadHandle | HANDLE | in | Handle auf den Thread mit THREAD_SUSPEND_RESUME-Zugriff. |
| PreviousSuspendCount | PULONG | out | Optional. Erhält den Suspend-Count vor dem Dekrement. Darf NULL sein. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0x52 | win10-1507 |
| Win10 1607 | 0x52 | win10-1607 |
| Win10 1703 | 0x52 | win10-1703 |
| Win10 1709 | 0x52 | win10-1709 |
| Win10 1803 | 0x52 | win10-1803 |
| Win10 1809 | 0x52 | win10-1809 |
| Win10 1903 | 0x52 | win10-1903 |
| Win10 1909 | 0x52 | win10-1909 |
| Win10 2004 | 0x52 | win10-2004 |
| Win10 20H2 | 0x52 | win10-20h2 |
| Win10 21H1 | 0x52 | win10-21h1 |
| Win10 21H2 | 0x52 | win10-21h2 |
| Win10 22H2 | 0x52 | win10-22h2 |
| Win11 21H2 | 0x52 | win11-21h2 |
| Win11 22H2 | 0x52 | win11-22h2 |
| Win11 23H2 | 0x52 | win11-23h2 |
| Win11 24H2 | 0x52 | win11-24h2 |
| Server 2016 | 0x52 | winserver-2016 |
| Server 2019 | 0x52 | winserver-2019 |
| Server 2022 | 0x52 | winserver-2022 |
| Server 2025 | 0x52 | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 52 00 00 00 mov eax, 0x52 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
Einfacher Wrapper über `KeResumeThread` — dekrementiert `KTHREAD.SuspendCount` und entfernt bei Erreichen von null den Suspend-APC, sodass der Scheduler den Thread wieder einplanen kann. SSN `0x52` ist über alle ausgelieferten Win10/11-Builds stabil. Ein Thread kann mehrfach suspendiert werden: Jeder `NtSuspendThread` erhöht den Zähler, jeder `NtResumeThread` muss ihn dekrementieren, damit der Thread tatsächlich läuft. Das Win32-`ResumeThread` liefert bei Fehler `(DWORD)-1` und bei Erfolg den vorherigen Zählerstand, was direkt auf `PreviousSuspendCount` abbildet.
Häufige Malware-Nutzung
Wird selten allein missbraucht — ist aber der *Trigger* jeder Injection-Technik mit `CREATE_SUSPENDED`. Process Hollowing (RunPE), Process Doppelgänging, Transacted Hollowing, EarlyBird-APC-Injection, Thread Hijacking und Thread-Stack-Spoofing enden alle mit einem `NtResumeThread`, der den platzierten Payload startet. Verteidiger behandeln daher die *Sequenz* `CreateProcess(SUSPENDED)` → unmap/write/queue-APC/set-context → `NtResumeThread` als kanonisches Muster, nicht das Resume isoliert.
Erkennungsmöglichkeiten
Es gibt kein Sysmon-Event für `NtResumeThread` selbst, und der Syscall ist viel zu häufig (jedes `CREATE_SUSPENDED` endet legitim mit einem), um direkt zu alarmieren. Erkennung liegt in der Korrelation: Sieht ein EDR `NtWriteVirtualMemory` oder `NtSetContextThread` gegen einen Thread, gefolgt von `NtResumeThread` aus einem Remote-Prozess, schlägt es einen hochkonfidenten Injection-Alarm. ETW Threat Intelligence emittiert `EtwTiLogSetContextThread`, wenn der Context eines Remote-Threads gepatcht wird — der typische Pivot vor dem Resume. Stack-Walk-Callbacks auf der ersten Usermode-Instruktion nach dem Resume können eine `StartAddress` in privatem RWX-Speicher offenlegen.
Direkte Syscall-Beispiele
asmx64 direct stub
; Direct syscall stub for NtResumeThread (SSN 0x52, stable across all Win10/11)
NtResumeThread PROC
mov r10, rcx ; syscall convention
mov eax, 52h ; SSN
syscall
ret
NtResumeThread ENDPcProcess Hollowing tail
// After unmapping the original image and writing the payload, resume the suspended
// primary thread to detonate the planted PE.
ULONG prev = 0;
NTSTATUS st = NtResumeThread(pi.hThread, &prev);
if (!NT_SUCCESS(st)) {
// Resume failed — clean up the hollowed process before EDR notices.
TerminateProcess(pi.hProcess, 0);
return st;
}rustHell's Gate indirect syscall
use std::arch::asm;
#[unsafe(naked)]
unsafe extern "system" fn nt_resume_thread_stub() {
// SSN 0x52 across every supported build.
asm!(
"mov r10, rcx",
"mov eax, 0x52",
"syscall",
"ret",
options(noreturn),
);
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20