> Windows Syscalls
ntoskrnl.exeT1055.012T1055T1106

NtResumeProcess

Decrementa el contador de suspensión de cada hilo de un proceso objetivo y reanuda los que llegan a cero.

Prototipo

NTSTATUS NtResumeProcess(
  HANDLE ProcessHandle
);

Argumentos

NameTypeDirDescription
ProcessHandleHANDLEinHandle al proceso a reanudar. Requiere PROCESS_SUSPEND_RESUME.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070x161win10-1507
Win10 16070x168win10-1607
Win10 17030x16Ewin10-1703
Win10 17090x171win10-1709
Win10 18030x173win10-1803
Win10 18090x174win10-1809
Win10 19030x175win10-1903
Win10 19090x175win10-1909
Win10 20040x17Bwin10-2004
Win10 20H20x17Bwin10-20h2
Win10 21H10x17Bwin10-21h1
Win10 21H20x17Dwin10-21h2
Win10 22H20x17Dwin10-22h2
Win11 21H20x185win11-21h2
Win11 22H20x188win11-22h2
Win11 23H20x188win11-23h2
Win11 24H20x18Awin11-24h2
Server 20160x168winserver-2016
Server 20190x174winserver-2019
Server 20220x183winserver-2022
Server 20250x18Awinserver-2025

Módulo del kernel

ntoskrnl.exeNtResumeProcess

APIs relacionadas

DebugActiveProcessStopResumeThreadNtResumeThreadNtSuspendProcessNtOpenProcess

Stub del syscall

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

NtResumeProcess es el espejo de NtSuspendProcess y está igualmente sin documentar. Itera el EPROCESS ThreadListHead llamando a KeResumeThread sobre cada entrada; los hilos cuyo contador de suspensión cae a cero vuelven a la ready queue del dispatcher. Como su contrapartida, el SSN deriva casi en cada release (0x161 → 0x18A en la ventana soportada) y, como ella, es el equivalente por proceso de ResumeThread sin obligar al llamador a enumerar hilos vía Toolhelp / NtGetNextThread.

Uso común por malware

Siempre aparece emparejado con NtSuspendProcess. Sus tres roles principales: (1) cerrar el bucle **Fork & Run** — tras inyectar y ejecutar lógica de post-explotación en un proceso sacrificable, el implant llama a NtResumeProcess sobre su propio helper si se suspendió entre heartbeats, o sobre el hilo BOF una vez listo el setup; (2) finalizar el **process hollowing** reviviendo el objetivo previamente suspendido tras colocar la imagen maliciosa y parchear el contexto de hilo; (3) descongelar los procesos de base de datos / EDR que un ransomware había suspendido antes de cifrar, una vez completada la pasada de cifrado, para que los servicios de la víctima reinicien limpios (cortesía en doble extorsión que hace depender la recuperación de la buena fe del operador).

Oportunidades de detección

Por sí solo NtResumeProcess es inofensivo — todo depurador y el runtime de Windows lo usan. La telemetría accionable es el *par*: NtSuspendProcess → escritura/inyección → NtResumeProcess desde el mismo llamador sobre el mismo objetivo en una ventana corta, especialmente cuando el objetivo es un candidato sacrificable (rundll32.exe, notepad.exe, RuntimeBroker.exe) recién spawneado por el mismo llamador. ETW `Microsoft-Windows-Kernel-Audit-API-Calls` expone invocaciones Resume cuando la audit policy lo habilita; combinar con Sysmon Event ID 10 (ProcessAccess) mostrando PROCESS_SUSPEND_RESUME solicitado sobre un proceso no hijo para una alerta de alto señal.

Ejemplos de syscalls directos

asmx64 direct stub (Win11 24H2)

; Direct syscall stub for NtResumeProcess (SSN 0x18A on 24H2/2025)
; SSN climbs every release — resolve dynamically across builds.
NtResumeProcess PROC
    mov  r10, rcx          ; syscall convention
    mov  eax, 18Ah         ; SSN
    syscall
    ret
NtResumeProcess ENDP

chollowing teardown

// Final step of a process-hollowing routine: after writing the malicious
// image, fixing the suspended thread's RIP and Rcx, we resume everything.
#include <windows.h>

typedef NTSTATUS (NTAPI *pNtResumeProcess)(HANDLE);

void FinishHollow(HANDLE hProcess, HANDLE hThread, CONTEXT *ctx) {
    SetThreadContext(hThread, ctx);

    pNtResumeProcess NtResumeProcess = (pNtResumeProcess)GetProcAddress(
        GetModuleHandleA("ntdll.dll"), "NtResumeProcess");
    NtResumeProcess(hProcess);
}

rustthaw frozen DBs

// Cargo: windows-sys = "0.59"
use windows_sys::Win32::Foundation::HANDLE;
use windows_sys::Win32::System::Threading::{OpenProcess, PROCESS_SUSPEND_RESUME};

extern "system" { fn NtResumeProcess(handle: HANDLE) -> i32; }

pub unsafe fn thaw(pids: &[u32]) {
    for &pid in pids {
        let h = OpenProcess(PROCESS_SUSPEND_RESUME, 0, pid);
        if !h.is_null() { NtResumeProcess(h); }
    }
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20