NtSetInformationProcess
Modifie une classe d'état au niveau processus — auto-nettoyage anti-debug, enregistrement de plages CET, installation de politiques ACG/CIG, callbacks d'instrumentation.
Prototype
NTSTATUS NtSetInformationProcess( HANDLE ProcessHandle, PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength );
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| ProcessHandle | HANDLE | in | Handle vers le processus cible. L'accès requis dépend de la classe ; de nombreuses classes exigent PROCESS_SET_INFORMATION ou plus. |
| ProcessInformationClass | PROCESSINFOCLASS | in | Classe modifiable. Notables : ProcessDebugFlags=31, ProcessInstrumentationCallback=40, ProcessSignaturePolicy=44, ProcessDynamicEnforcedCetCompatibleRanges=80, ProcessRaiseUMExceptionOnInvalidHandleClose, ProcessThreadStackAllocation. |
| ProcessInformation | PVOID | in | Buffer d'entrée dont le format dépend de la classe. Certaines classes acceptent un seul ULONG/HANDLE, d'autres un descripteur structuré. |
| ProcessInformationLength | ULONG | in | Taille en octets du buffer ProcessInformation. |
IDs de syscalls par version de Windows
| Version 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 |
Module noyau
APIs liées
Stub du 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
Notes non documentées
SSN 0x1C depuis Windows 10 1507 — appairé au 0x19 de NtQueryInformationProcess, c'est l'un des rares slots de contrôle de processus que Microsoft a explicitement gelés. Le côté écriture est nettement plus privilégié que le côté lecture : de nombreuses classes (ProcessAccessToken, ProcessSignaturePolicy, ProcessHandleTracing) exigent PROCESS_SET_INFORMATION + des privilèges spécifiques (SeDebugPrivilege, SeTcbPrivilege) et plusieurs refusent de s'appliquer une fois qu'une DLL non-système a été chargée. Certaines classes sont *one-shot* — une fois que ProcessSignaturePolicy active MicrosoftSignedOnly, le noyau ne permet pas de le désactiver.
Usage courant par les malwares
Trois classes d'abus à forte valeur. (1) Auto-anti-debug : écrire ProcessDebugFlags (31) avec la valeur 1 efface silencieusement le flag NoDebugInherit suivi par le noyau et désactive l'héritage debug pour les processus enfants — aussi largement utilisé comme écriture-leurre pour brouiller les heuristiques AV. (2) Contournement ACG / CIG : ProcessSignaturePolicy (44) peut être interrogé pour détecter l'application de CIG, et ProcessDynamicEnforcedCetCompatibleRanges (80) est utilisé par les frameworks d'évasion EDR pour enregistrer les régions de shellcode de l'attaquant comme « compatibles CET » afin que l'indirect-branch tracking n'avorte pas à la première exécution. (3) Détournement d'instrumentation : ProcessInstrumentationCallback (40) installe une fonction appelée par le noyau à chaque retour de syscall — un attaquant qui le contrôle obtient un point d'étranglement userland sur *tous* les syscalls du processus cible, parfait pour la détection de hooking/unhooking (et célèbre comme technique de unhook contre les patches user-mode des EDR).
Opportunités de détection
Les appels set-information sont bien plus rares que les requêtes — tout appelant légitime devrait être auditable. Les classes à fort signal (31, 40, 44, 80) n'apparaissent presque jamais dans du logiciel bénin. ETW Microsoft-Windows-Threat-Intelligence expose EtwTiLogSetProcessInfo pour un sous-ensemble de classes ; le reste doit être observé via des événements TI ou de l'instrumentation noyau. Defender for Endpoint alerte spécifiquement sur les écritures ProcessInstrumentationCallback provenant de processus non-système. Les écritures « compat range » CET (classe 80) sont particulièrement suspectes depuis tout appelant non image-backed — elles n'ont essentiellement aucun consommateur légitime hors composants runtime de Microsoft.
Exemples de syscalls directs
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 ENDPMappings MITRE ATT&CK
Last verified: 2026-05-20