
Biblioteca de syscall indireta para Windows x64 apenas com cabeçalhos. Sem CRT, sem IAT, VEH anti-BP, bypass de AMSI/ETW, memória W^X, stubs dinâmicos por chamada.
Biblioteca apenas de cabeçalho para Windows x64 que permite invocar qualquer chamada de sistema NT sem tocar em importações ntdll, sem deixar strings no seu binário e sem as bandeiras vermelhas habituais que fazem os EDRs perderem a cabeça.
Sem CRT. Sem STL. Sem IAT. A coisa toda compila para ~19KB com literalmente zero dependências de DLL.
Construída para evitar as armadilhas comuns das bibliotecas de syscall existentes — strings em texto simples, constantes de hash conhecidas, chamada direta de syscall de memória não-ntdll, importações IAT que gritam "estou fazendo algo estranho", IOC SEC_NO_CHANGE, inchaço CRT. Nada disso aqui.
Syscall Engine
syscall; ret do próprio ntdll, então RIP está sempre dentro de ntdll quando a instrução de syscall é disparada\KnownDlls\ntdll.dll (sem acesso ao sistema de arquivos, invisível para ProcMon)Anti-Breakpoint
Evasion
AmsiScanBuffer para retornar S_OKEtwEventWrite para retornar SUCCESSCode Quality
stealth/ no seu projeto e pronto
initialize() abre ntdll através da seção \KnownDlls, analisa exportações PE, captura cada número de syscall.text do ntdll por um gadget syscall; ret — é daqui que a instrução de syscall real executarásc::invoke():
emit_stub() constrói um stub polimórfico único — instruções de lixo aleatórias antes/depois, número de syscall ofuscado com XOR com uma chave por chamada, jmp indireto para o gadget ntdllEm nenhum momento existe memória RWX. Em nenhum momento uma instrução syscall executa fora de ntdll. Em nenhum momento números de syscall são armazenados em texto simples.
Você chama tramp::invoke() com a função alvo. Se não houver breakpoint — a função simplesmente executa normalmente com zero overhead. Se um depurador colocou 0xCC:
A lista de breakpoints do depurador ainda mostra como ativo. O breakpoint simplesmente nunca dispara em nossas chamadas.
cmake -B build -A x64
cmake --build build --config Release
Requer MSVC (VS 2019+) e CMake 3.15+. A saída é ~19KB com zero importações.
#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 — memory ops, spinlock, static_map, PRNG, debug output
hash.hpp — compile-time custom hash
xorstr.hpp — compile-time XOR string encryption
peb.hpp — PEB walk, PE export parser, hook detection
syscall.hpp — indirect syscall engine, stub generator, W^X, anti-dump
trampoline.hpp — VEH-based anti-breakpoint
bypass.hpp — AMSI + ETW patching
MIT — faça o que quiser com isso.