
Libreria di syscall indirette per Windows x64 solo header. Zero CRT, zero IAT, VEH anti-BP, bypass AMSI/ETW, memoria W^X, stub dinamici per chiamata.
Libreria header-only per Windows x64 che consente 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. L'intero progetto compila a circa 19KB con zero dipendenze DLL.
Costruita per evitare le trappole comuni delle librerie di syscall esistenti: stringhe in chiaro, costanti hash note, syscall diretta da memoria non ntdll, import IAT che urlano "sto facendo qualcosa di strano", IOC SEC_NO_CHANGE, ingombro CRT. Niente di tutto questo qui.
Motore Syscall
syscall; ret di ntdll, quindi RIP è sempre dentro ntdll quando viene eseguita l'istruzione syscall\KnownDlls\ntdll.dll (nessun accesso al filesystem, invisibile a ProcMon)Anti-Breakpoint
Evasion
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 e estrae ogni numero di syscall.text di ntdll alla ricerca di un gadget syscall; ret – da qui verrà eseguita l'effettiva istruzione syscallsc::invoke():
emit_stub() costruisce uno stub polimorfico unico – istruzioni junk casuali prima/dopo, numero di syscall offuscato con XOR e chiave per chiamata, jmp indiretto al gadget di ntdllIn nessun momento esiste memoria RWX. In nessun momento un'istruzione syscall viene eseguita al di fuori di ntdll. In nessun momento i numeri di syscall sono memorizzati in chiaro.
Chiami tramp::invoke() con la funzione target. Se non c'è breakpoint – la funzione viene eseguita normalmente con overhead zero. Se un debugger ha piazzato 0xCC:
La lista dei 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+. L'output è ~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"
// works even if x64dbg has a BP on 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 su memoria, spinlock, static_map, PRNG, debug output
hash.hpp — hash custom a tempo di compilazione
xorstr.hpp — crittografia XOR di stringhe a tempo di compilazione
peb.hpp — walk del PEB, parser export PE, rilevamento hook
syscall.hpp — motore syscall indiretto, generatore stub, W^X, anti-dump
trampoline.hpp — anti-breakpoint basato su VEH
bypass.hpp — patch AMSI + ETW
MIT – fai quello che vuoi con essa.