> Windows Syscalls
ntoskrnl.exeT1134T1134.001T1134.002

NtOpenProcessTokenEx

Abre el token de acceso de un proceso permitiendo al llamante especificar atributos de handle como OBJ_INHERIT.

Prototipo

NTSTATUS NtOpenProcessTokenEx(
  HANDLE       ProcessHandle,
  ACCESS_MASK  DesiredAccess,
  ULONG        HandleAttributes,
  PHANDLE      TokenHandle
);

Argumentos

NameTypeDirDescription
ProcessHandleHANDLEinHandle al proceso cuyo token se abre. Requiere PROCESS_QUERY_(LIMITED_)INFORMATION.
DesiredAccessACCESS_MASKinDerechos de acceso al token — combinaciones de TOKEN_QUERY, TOKEN_DUPLICATE, TOKEN_ADJUST_PRIVILEGES, TOKEN_IMPERSONATE, etc.
HandleAttributesULONGinBanderas OBJECT_ATTRIBUTES como OBJ_INHERIT (0x2) o OBJ_KERNEL_HANDLE (0x200). A menudo 0.
TokenHandlePHANDLEoutRecibe el handle al token abierto en caso de éxito. Debe cerrarse con NtClose.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
Win10 15070x30win10-1507
Win10 16070x30win10-1607
Win10 17030x30win10-1703
Win10 17090x30win10-1709
Win10 18030x30win10-1803
Win10 18090x30win10-1809
Win10 19030x30win10-1903
Win10 19090x30win10-1909
Win10 20040x30win10-2004
Win10 20H20x30win10-20h2
Win10 21H10x30win10-21h1
Win10 21H20x30win10-21h2
Win10 22H20x30win10-22h2
Win11 21H20x30win11-21h2
Win11 22H20x30win11-22h2
Win11 23H20x30win11-23h2
Win11 24H20x30win11-24h2
Server 20160x30winserver-2016
Server 20190x30winserver-2019
Server 20220x30winserver-2022
Server 20250x30winserver-2025

Módulo del kernel

ntoskrnl.exeNtOpenProcessTokenEx

APIs relacionadas

OpenProcessTokenNtOpenProcessTokenNtOpenThreadTokenExNtDuplicateTokenNtFilterTokenNtAdjustPrivilegesToken

Stub del syscall

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

NtOpenProcessTokenEx es la primitiva canónica que `kernel32!OpenProcessToken` realmente invoca — `NtOpenProcessToken` es esencialmente un wrapper conservado por compatibilidad con NT 3.x. A diferencia de la forma heredada, su SSN ha permanecido **estable en `0x30`** desde Windows 10 1507 hasta Windows 11 24H2, lo que la convierte en objetivo predilecto para loaders con SSN codificado y stubs SysWhispers. El parámetro extra `HandleAttributes` permite solicitar handles heredables (`OBJ_INHERIT`) — útil para procesos hijos con parent-PID spoofing que necesitan heredar el token.

Uso común por malware

Mismo papel que NtOpenProcessToken en las cadenas de robo de token, pero preferido por loaders modernos por su SSN estable. El BOF `steal_token` de Cobalt Strike y el módulo `getsystem` de Sliver pasan por aquí. JuicyPotato / RoguePotato / PrintSpoofer negocian primero un token SYSTEM mediante coerción RPC, luego llaman a NtOpenProcessTokenEx sobre el proceso generado para obtener un handle duplicable, y por último NtDuplicateToken + CreateProcessWithTokenW para arrancar cmd.exe en contexto SYSTEM. La familia de bypass UAC Make-Me-Admin lo usa para clonar el gemelo elevado del token de IL medio.

Oportunidades de detección

Superficie de detección idéntica a NtOpenProcessToken: 4672 (Special Privileges Assigned, SeDebugPrivilege), 4663 (object access sobre Token), 4673 (Sensitive Privilege Use). Específicamente para LSASS, RunAsPPL fuerza la llamada a fallar con STATUS_ACCESS_DENIED salvo que el llamante también sea PPL — un evento de fallo de alta señal. ETW `Microsoft-Windows-Kernel-Audit-API-Calls` emite `PsOpenProcessToken` independientemente de la variante Nt invocada. Los EDR hookean comúnmente esta función en ntdll; los syscalls directos lo evaden pero la auditoría object-access en kernel persiste.

Ejemplos de syscalls directos

asmx64 direct stub (stable SSN 0x30)

; SSN 0x30 stable across Win10 1507 -> Win11 24H2.
NtOpenProcessTokenEx PROC
    mov  r10, rcx          ; ProcessHandle
    mov  eax, 30h          ; SSN
    syscall
    ret
NtOpenProcessTokenEx ENDP

cOpen elevated token for cross-session UAC clone (Make-Me-Admin)

// Locate the elevated split-token sibling of the current medium-IL process
// and ask for TOKEN_DUPLICATE so we can spawn a high-IL process with it.
HANDLE hElev = NULL, hTok = NULL;
// hElev = handle to a high-IL svchost / consent.exe we previously opened
NTSTATUS s = NtOpenProcessTokenEx(
    hElev,
    TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY,
    0,                       // HandleAttributes
    &hTok);
if (NT_SUCCESS(s)) {
    // Next: NtDuplicateToken(... TokenPrimary ...) -> CreateProcessWithTokenW
}

rustwindows-sys wrapper with naked-asm direct syscall

use std::arch::asm;
use windows_sys::Win32::Foundation::HANDLE;

#[unsafe(naked)]
pub unsafe extern "system" fn nt_open_process_token_ex(
    _process: HANDLE,
    _desired: u32,
    _handle_attrs: u32,
    _token_out: *mut HANDLE,
) -> i32 {
    asm!(
        "mov r10, rcx",
        "mov eax, 0x30",
        "syscall",
        "ret",
        options(noreturn),
    );
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20