
Header-only Windows x64 libreria di syscall indirette. Zero CRT, zero IAT, VEH anti-BP, bypass AMSI/ETW, memoria W^X, stub dinamici per chiamata.
Libreria header-only per Windows x64 che ti permette di invocare qualsiasi syscall NT senza toccare gli import di ntdll, senza lasciare stringhe nel binario e senza i soliti campanelli d'allarme che fanno impazzire gli EDR.
Niente CRT. Niente STL. Niente IAT. Il tutto si compila in circa 19KB con zero dipendenze DLL.
Progettata per evitare le insidie comuni delle librerie syscall esistenti — stringhe in chiaro, costanti hash note, syscall dirette da memoria non-ntdll, import IAT che gridano "sto facendo qualcosa di strano", IOC SEC_NO_CHANGE, gonfiore CRT. Niente di tutto questo qui.
Motore Syscall
syscall; ret di ntdll stesso, quindi RIP è sempre dentro ntdll quando l'istruzione syscall viene eseguita\KnownDlls\ntdll.dll (nessun accesso al filesystem, invisibile a ProcMon)Anti-Breakpoint
Evasione
AmsiScanBuffer per restituire S_OKEtwEventWrite per restituire SUCCESSQualità del Codice
stealth/ nel tuo progetto e via
initialize() apre ntdll tramite la sezione \KnownDlls, analizza gli export PE, cattura ogni numero syscall.text di ntdll per un gadget syscall; ret — è da qui che verrà eseguita l'istruzione syscall vera e propriasc::invoke():
emit_stub() costruisce uno stub polimorfico unico — istruzioni junk casuali prima/dopo, numero syscall offuscato XOR con chiave per-call, jmp indiretto al gadget di ntdllIn nessun momento esiste memoria RWX. In nessun momento un'istruzione syscall viene eseguita fuori da ntdll. In nessun momento i numeri syscall sono memorizzati in chiaro.
Chiami tramp::invoke() con la funzione target. Se non c'è breakpoint — la funzione viene eseguita normalmente con zero overhead. Se un debugger ha piazzato 0xCC:
La lista breakpoint del debugger mostra ancora il breakpoint come attivo. Il breakpoint semplicemente non scatta mai sulle nostre chiamate.
cmake -B build -A x64
cmake --build build --config Release
Richiede MSVC (VS 2019+) e CMake 3.15+. Output di ~19KB con zero import.
#include "stealth/syscall.hpp"
stealth::sc::initialize();
PVOID base = nullptr;
SIZE_T size = 0x1000;
NTSTATUS status = stealth::sc::invoke<NTSTATUS>(
HASH("NtAllocateVirtualMemory"),
NtCurrentProcess(), &base, (ULONG_PTR)0, &size,
(ULONG)(MEM_COMMIT | MEM_RESERVE), (ULONG)PAGE_READWRITE
);
#include "stealth/trampoline.hpp"
// funziona anche se x64dbg ha un BP su MessageBoxA
int ret = stealth::tramp::invoke<int>(
HASH_CI("user32.dll"), HASH("MessageBoxA"),
(HWND)nullptr, (LPCSTR)"hello", (LPCSTR)"title", (UINT)MB_OK
);
#include "stealth/bypass.hpp"
stealth::bypass::patch_etw();
stealth::bypass::patch_amsi();
stealth::tramp::shutdown();
stealth::sc::shutdown();
stealth/
common.hpp — operazioni memoria, spinlock, static_map, PRNG, output debug
hash.hpp — hash personalizzato a tempo di compilazione
xorstr.hpp — crittografia stringhe XOR a tempo di compilazione
peb.hpp — PEB walk, parser export PE, rilevamento hook
syscall.hpp — motore syscall indirette, generatore stub, W^X, anti-dump
trampoline.hpp — anti-breakpoint basato su VEH
bypass.hpp — patching AMSI + ETW
MIT — fai quello che vuoi con essa.