Willkommen — direkte Syscalls 101
Warum direkte Syscalls wichtig sind, was ein SSN ist und wie Hell's Gate sie zur Laufzeit auflöst.
Wenn ein Windows-Prozess VirtualAllocEx aufruft, läuft der Aufruf durch kernel32.dll, dann durch NtAllocateVirtualMemory in ntdll.dll, das eine syscall-Instruktion mit der System Service Number (SSN) in eax ausführt. Der Kernel liest eax, sucht die Routine in der KiServiceTable und dispatcht.
EDR-Produkte hooken üblicherweise die User-Mode-Exporte von ntdll. Ein direkter Syscall umgeht diesen Hook, indem die syscall-Instruktion aus dem eigenen Code mit der richtigen SSN ausgeführt wird.
NtAllocateVirtualMemory:
mov r10, rcx
mov eax, 0x18 ; SSN ab Win10 1909
syscall
ret
Der Haken: Die SSN ändert sich zwischen Windows-Builds. Drei gängige Ansätze:
- Hardcodiert pro Build — fragil.
- Hell's Gate — zur Laufzeit die ersten Bytes von
ntdll!NtAllocateVirtualMemorylesen und die SSN aus demmov eax, imm32extrahieren. - Halo's Gate — Fallback, wenn
ntdllselbst gehookt ist: über Nachbar-Syscalls die fehlende SSN herleiten.
In der Syscall-Referenz sehen Sie die SSNs pro Build für jeden dokumentierten Nt*-Aufruf.