
Header-only Windows x64 библиотека косвенных системных вызовов. Ноль CRT, ноль IAT, VEH anti-BP, обход AMSI/ETW, память W^X, динамические заглушки для каждого вызова.
Библиотека только с заголовочными файлами для Windows x64, которая позволяет вызывать любые NT-сисколы без обращения к импортам ntdll, без оставления строк в вашем бинарнике и без обычных красных флагов, от которых EDR сходят с ума.
Никакого CRT. Никакого STL. Никакого IAT. Всё компилируется примерно до ~19KB буквально с нулевыми зависимостями от DLL.
Создана для обхода типичных недостатков существующих библиотек сисколов — открытых строк, известных хэш-констант, прямых сисколов из памяти вне ntdll, IAT-импортов, кричащих «я делаю что-то странное», IOC SEC_NO_CHANGE, раздутого CRT. Ничего из этого здесь нет.
Движок сисколов
syscall; ret внутри ntdll, поэтому RIP всегда находится внутри ntdll в момент срабатывания инструкции syscall\KnownDlls\ntdll.dll (без обращения к файловой системе, невидимо для ProcMon)Анти-брейкпоинт
Обход
AmsiScanBuffer для возврата S_OKEtwEventWrite для возврата SUCCESSКачество кода
stealth/ в свой проект и работайте
initialize() открывает ntdll через section \KnownDlls, разбирает PE-экспорты, собирает все номера сисколов.text ntdll в поисках гаджета syscall; ret — именно отсюда будет выполняться фактическая инструкция syscallsc::invoke():
emit_stub() создаёт уникальный полиморфный стаб — случайные мусорные инструкции до/после, XOR-обфусцированный номер сискола с ключом для каждого вызова, косвенный jmp к гаджету ntdllНи в один момент не существует RWX-памяти. Ни в один момент инструкция syscall не выполняется за пределами ntdll. Ни в один момент номера сисколов не хранятся в открытом виде.
Вы вызываете tramp::invoke() с целевой функцией. Если брейкпоинта нет — функция просто выполняется как обычно с нулевыми накладными расходами. Если отладчик поставил 0xCC:
Список брейкпоинтов отладчика по-прежнему показывает его как активный. Брейкпоинт просто никогда не срабатывает на наших вызовах.
cmake -B build -A x64
cmake --build build --config Release
Требуется MSVC (VS 2019+) и CMake 3.15+. Результат — ~19KB с нулевыми импортами.
#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"
// работает, даже если в x64dbg стоит BP на 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 — операции с памятью, спинлок, static_map, PRNG, отладочный вывод
hash.hpp — кастомный хэш времени компиляции
xorstr.hpp — XOR-шифрование строк времени компиляции
peb.hpp — PEB walk, парсер PE-экспортов, детектирование хуков
syscall.hpp — движок косвенных сисколов, генератор стабов, W^X, анти-дамп
trampoline.hpp — анти-брейкпоинт на основе VEH
bypass.hpp — патчинг AMSI + ETW
MIT — делайте с ней что хотите.