NtSetInformationProcess
Modifica una clase de estado a nivel de proceso — auto-limpieza anti-debug, registro de rangos CET, instalación de políticas ACG/CIG, callbacks de instrumentación.
Prototipo
NTSTATUS NtSetInformationProcess( HANDLE ProcessHandle, PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| ProcessHandle | HANDLE | in | Handle al proceso objetivo. El acceso requerido depende de la clase; muchas clases exigen PROCESS_SET_INFORMATION o superior. |
| ProcessInformationClass | PROCESSINFOCLASS | in | Clase modificable. Notables: ProcessDebugFlags=31, ProcessInstrumentationCallback=40, ProcessSignaturePolicy=44, ProcessDynamicEnforcedCetCompatibleRanges=80, ProcessRaiseUMExceptionOnInvalidHandleClose, ProcessThreadStackAllocation. |
| ProcessInformation | PVOID | in | Buffer de entrada cuyo formato depende de la clase. Algunas clases aceptan un solo ULONG/HANDLE, otras un descriptor estructurado. |
| ProcessInformationLength | ULONG | in | Tamaño en bytes del buffer ProcessInformation. |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x1C | win10-1507 |
| Win10 1607 | 0x1C | win10-1607 |
| Win10 1703 | 0x1C | win10-1703 |
| Win10 1709 | 0x1C | win10-1709 |
| Win10 1803 | 0x1C | win10-1803 |
| Win10 1809 | 0x1C | win10-1809 |
| Win10 1903 | 0x1C | win10-1903 |
| Win10 1909 | 0x1C | win10-1909 |
| Win10 2004 | 0x1C | win10-2004 |
| Win10 20H2 | 0x1C | win10-20h2 |
| Win10 21H1 | 0x1C | win10-21h1 |
| Win10 21H2 | 0x1C | win10-21h2 |
| Win10 22H2 | 0x1C | win10-22h2 |
| Win11 21H2 | 0x1C | win11-21h2 |
| Win11 22H2 | 0x1C | win11-22h2 |
| Win11 23H2 | 0x1C | win11-23h2 |
| Win11 24H2 | 0x1C | win11-24h2 |
| Server 2016 | 0x1C | winserver-2016 |
| Server 2019 | 0x1C | winserver-2019 |
| Server 2022 | 0x1C | winserver-2022 |
| Server 2025 | 0x1C | winserver-2025 |
Módulo del kernel
APIs relacionadas
Stub del syscall
4C 8B D1 mov r10, rcx B8 1C 00 00 00 mov eax, 0x1C 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
SSN 0x1C desde Windows 10 1507 — emparejado con el 0x19 de NtQueryInformationProcess, es uno de los pocos slots de control de proceso que Microsoft ha congelado explícitamente. El lado de escritura es mucho más privilegiado que el de lectura: muchas clases (ProcessAccessToken, ProcessSignaturePolicy, ProcessHandleTracing) exigen PROCESS_SET_INFORMATION + privilegios específicos (SeDebugPrivilege, SeTcbPrivilege) y varias se niegan a aplicarse una vez que el proceso ha cargado una DLL no de sistema. Algunas clases son *one-shot* — una vez que ProcessSignaturePolicy habilita MicrosoftSignedOnly, el kernel no permite desactivarlo.
Uso común por malware
Tres clases de abuso de alto valor. (1) Auto-anti-debug: escribir ProcessDebugFlags (31) con valor 1 borra silenciosamente el flag NoDebugInherit rastreado por el kernel y desactiva la herencia de depuración en procesos hijos — también ampliamente usado como escritura señuelo para confundir heurísticas AV. (2) Bypass de ACG / CIG: ProcessSignaturePolicy (44) puede consultarse para detectar el cumplimiento de CIG, y ProcessDynamicEnforcedCetCompatibleRanges (80) lo usan frameworks de evasión de EDR para registrar regiones de shellcode del atacante como 'compatibles con CET' para que el indirect-branch tracking no aborte en la primera ejecución. (3) Secuestro de instrumentación: ProcessInstrumentationCallback (40) instala una función llamada por el kernel en cada retorno de syscall — un atacante que lo controle obtiene un cuello de botella en modo usuario sobre *todos* los syscalls del proceso objetivo, perfecto para hookeo y detección de unhooking (y conocido como técnica de unhook contra parches de modo usuario de EDR).
Oportunidades de detección
Las llamadas set-information son mucho más raras que las queries — todo llamador legítimo debería ser auditable. Las clases de alta señal (31, 40, 44, 80) casi nunca aparecen en software benigno. ETW Microsoft-Windows-Threat-Intelligence expone EtwTiLogSetProcessInfo para un subconjunto de clases; el resto debe observarse vía eventos TI o instrumentación de kernel. Defender for Endpoint alerta específicamente sobre escrituras de ProcessInstrumentationCallback desde procesos no de sistema. Las escrituras de 'compat range' CET (clase 80) son particularmente sospechosas desde cualquier llamador no respaldado por imagen — esencialmente no tienen consumidores legítimos fuera de los componentes runtime de Microsoft.
Ejemplos de syscalls directos
cSelf-anti-debug: clear ProcessDebugFlags
// Setting ProcessDebugFlags=1 turns OFF NoDebugInherit, which paradoxically
// causes later NtQueryInformationProcess(ProcessDebugFlags) reads to return 1
// (i.e. 'no debugger ever attached'). Used to defeat naive anti-debug detectors.
ULONG debugFlags = 1;
NtSetInformationProcess(NtCurrentProcess(),
ProcessDebugFlags, // 31
&debugFlags, sizeof(debugFlags));cProcessInstrumentationCallback unhook hook
// Install a callback that fires on every syscall return. The kernel jumps to it
// with RAX = original RIP, R10 = original return address. Used both offensively
// (unhook EDR ntdll patches) and by EDRs themselves (Defender once shipped one).
typedef struct _PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION {
ULONG Version; // 0
ULONG Reserved;
PVOID Callback; // function to call on every syscall return
} PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION;
PROCESS_INSTRUMENTATION_CALLBACK_INFORMATION info = {
.Version = 0, .Reserved = 0, .Callback = MyCallback
};
NtSetInformationProcess(NtCurrentProcess(),
ProcessInstrumentationCallback, // 40
&info, sizeof(info));asmx64 stub (stable across builds)
; SSN 0x1C — stable Win10 1507 .. Win11 24H2.
NtSetInformationProcess PROC
mov r10, rcx
mov eax, 1Ch
syscall
ret
NtSetInformationProcess ENDPMapeos MITRE ATT&CK
Last verified: 2026-05-20