NtSetInformationProcess
Verändert eine Klasse von Prozesszustand — Anti-Debug-Selbstbereinigung, CET-Range-Registrierung, ACG/CIG-Policy-Installation, Instrumentation-Callbacks.
Prototyp
NTSTATUS NtSetInformationProcess( HANDLE ProcessHandle, PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| ProcessHandle | HANDLE | in | Handle auf den Zielprozess. Erforderlicher Zugriff hängt von der Klasse ab; viele Klassen erfordern PROCESS_SET_INFORMATION oder höher. |
| ProcessInformationClass | PROCESSINFOCLASS | in | Setzbare Klasse. Bemerkenswert: ProcessDebugFlags=31, ProcessInstrumentationCallback=40, ProcessSignaturePolicy=44, ProcessDynamicEnforcedCetCompatibleRanges=80, ProcessRaiseUMExceptionOnInvalidHandleClose, ProcessThreadStackAllocation. |
| ProcessInformation | PVOID | in | Eingabepuffer, dessen Layout von der Klasse abhängt. Einige Klassen akzeptieren ein einzelnes ULONG/HANDLE, andere einen strukturierten Deskriptor. |
| ProcessInformationLength | ULONG | in | Größe des ProcessInformation-Puffers in Bytes. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | 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 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
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
Undokumentierte Hinweise
SSN 0x1C seit Windows 10 1507 — gepaart mit NtQueryInformationProcess' 0x19 ist dies einer der wenigen Process-Control-Slots, die Microsoft explizit eingefroren hat. Die Schreibseite ist deutlich privilegierter als die Leseseite: viele Klassen (ProcessAccessToken, ProcessSignaturePolicy, ProcessHandleTracing) erfordern PROCESS_SET_INFORMATION + spezifische Privilegien (SeDebugPrivilege, SeTcbPrivilege), und mehrere weigern sich anzuwenden, sobald der Prozess eine Nicht-System-DLL geladen hat. Manche Klassen sind *one-shot* — sobald ProcessSignaturePolicy MicrosoftSignedOnly aktiviert, lässt der Kernel keine Rücknahme zu.
Häufige Malware-Nutzung
Drei missbrauchsstarke Klassen. (1) Selbst-Anti-Debug: ein Schreiben auf ProcessDebugFlags (31) mit Wert 1 löscht still das vom Kernel verfolgte NoDebugInherit-Flag und deaktiviert die Debug-Vererbung an Kindprozesse — auch weit verbreitet als Dummy-Schreiben, um AV-Heuristiken zu verwirren. (2) ACG-/CIG-Bypass: ProcessSignaturePolicy (44) kann abgefragt werden, um CIG-Erzwingung zu erkennen, und ProcessDynamicEnforcedCetCompatibleRanges (80) wird von EDR-Evasion-Frameworks genutzt, um Shellcode-Regionen des Angreifers als „CET-kompatibel“ zu registrieren, damit Indirect-Branch-Tracking bei der ersten Ausführung nicht abbricht. (3) Instrumentation-Hijack: ProcessInstrumentationCallback (40) installiert eine Funktion, die der Kernel bei jedem Syscall-Return aufruft — ein Angreifer mit Kontrolle darüber erhält einen Userland-Engpass für *alle* Syscalls im Zielprozess, ideal zum Hooken und zur Unhook-Erkennung (und berüchtigt als Unhook-Technik gegen EDR-User-Mode-Patches).
Erkennungsmöglichkeiten
Set-Information-Aufrufe sind weit seltener als Queries — jeder legitime Aufrufer sollte prüfbar sein. Die signalstarken Klassen (31, 40, 44, 80) tauchen in gutartiger Software praktisch nie auf. Microsoft-Windows-Threat-Intelligence ETW exponiert EtwTiLogSetProcessInfo für eine Teilmenge der Klassen; der Rest muss über TI-Events oder Kernel-Instrumentation beobachtet werden. Defender for Endpoint alarmiert speziell auf ProcessInstrumentationCallback-Schreibvorgänge aus Nicht-System-Prozessen. CET-„Compat-Range“-Schreibvorgänge (Klasse 80) sind aus jedem nicht-image-backed Aufrufer besonders verdächtig — es gibt praktisch keine legitimen Konsumenten außerhalb von Microsofts eigenen Runtime-Komponenten.
Direkte Syscall-Beispiele
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 ENDPMITRE ATT&CK-Mappings
Last verified: 2026-05-20