> Windows Syscalls
Retour au blog

Bienvenue — syscalls directs 101

Pourquoi les syscalls directs comptent, ce qu'est un SSN, et comment Hell's Gate les résout au runtime.

Publié le 2026-05-20·1 min de lectureintrosyscallsntdll

Quand un processus Windows appelle VirtualAllocEx, l'appel transite par kernel32.dll, puis par NtAllocateVirtualMemory dans ntdll.dll, qui exécute une instruction syscall avec le System Service Number (SSN) chargé dans eax. Le noyau lit eax, cherche la routine dans KiServiceTable, et dispatch.

Les produits EDR hookent généralement les exports user-mode de ntdll. Un syscall direct contourne ce hook en émettant l'instruction syscall depuis votre propre code avec le bon SSN.

NtAllocateVirtualMemory:
    mov r10, rcx
    mov eax, 0x18      ; SSN sur Win10 1909+
    syscall
    ret

Le point délicat : le SSN change entre les builds de Windows. Trois solutions courantes :

  1. Codé en dur par build — fragile.
  2. Hell's Gate — au runtime, lire les premiers octets de ntdll!NtAllocateVirtualMemory et extraire le SSN du mov eax, imm32.
  3. Halo's Gate — fallback quand ntdll lui-même est hooké : parcourir les syscalls voisins pour déduire le SSN manquant.

Parcourez la référence des syscalls pour voir les SSN par build de chaque appel Nt* documenté.