Share-devn/stealth_call

GitHub: Share-devn/stealth_call

一个 Windows x64 头文件库,通过间接系统调用与 VEH 反断点实现免 IAT、无 CRT、W^X 并绕过 AMSI/ETW 的内存级调用引擎。

Stars: 2 | Forks: 0

stealth_call

## 什么是这个? 一个仅适用于 Windows x64 的头文件库,允许你在不触碰 ntdll 导入、不向二进制文件留下字符串、且不触发常见告警(这些告警会让 EDR 失去理智)的情况下调用任意 NT 系统调用。 无 CRT、无 STL、无 IAT。整个项目编译后仅约 19KB,实质上没有任何 DLL 依赖。 旨在避免现有系统调用库的常见缺陷——明文字符串、已知的哈希常量、直接从非 ntdll 内存发起系统调用、像“我在做奇怪事情”一样尖叫的 IAT 导入、SEC_NO_CHANGE IOC 以及 CRT 膨胀。这里都不会出现。 ## 功能特性 **系统调用引擎** - 间接系统调用——存根跳转到 ntdll 自身的 `syscall; ret` 小工具,因此当执行系统调用指令时,RIP 始终位于 ntdll 内部。 - 每次调用独立生成存根——每一次调用都会构建一个全新的存根,包含随机填充、随机布局、经过 XOR 混淆的系统调用编号。绝不复用。 - W^X 强制保护——临时页面经历 RW → RX → RW 转换。绝不会分配 RWX 内存。 - 每次调用后立即清除存根。 - 从 `\KnownDlls\ntdll.dll` 节映射中提取系统调用(无需文件访问,ProcMon 不可见)。 - 在典型的 Win11 系统上解析 977 个系统调用。 **反断点** - 基于 VEH 的方法——如果调试器在目标函数上植入 0xCC,异常处理器会静默恢复原始字节,以单步方式执行指令,然后重新植入断点。调试器永远不知道它已被绕过。无任何时间窗口。 - 适用于任意 DLL 中的任意函数,不限于 ntdll。 **规避检测** - AMSI 绕过——修补 `AmsiScanBuffer` 使其返回 S_OK。 - ETW 绕过——修补 `EtwEventWrite` 使其返回成功。 - 所有修补均通过直接系统调用完成,而非 VirtualProtect。 - 全程使用 XOR 加密字符串——DLL 名称、路径等一切内容。解密在栈上完成,使用后立即清除。 - 自定义哈希算法(不是 FNV-1a,也不是 CRC32——无已知 YARA 特征)。 - 通过 PEB 遍历解析所有模块与函数——不使用 GetModuleHandle 或 GetProcAddress。 **代码质量** - 仅头文件库,将 `stealth/` 文件夹直接放入项目即可使用。 - 线程安全,依赖每线程临时页面与自旋锁。 - 退出时完整清理——释放临时页面、清零映射、移除 VEH。 - 钩子检测常见 EDR 跳板(jmp rel32、jmp [rip]、mov rax + jmp rax)。 ## 工作原理

flow

### 系统调用路径 1. `initialize()` 通过 `\KnownDlls` 打开 ntdll,解析 PE 导出并获取所有系统调用编号。 2. 在 ntdll 的 `.text` 段中扫描 `syscall; ret` 小工具——这是系统调用指令实际执行的位置。 3. 调用 `sc::invoke()` 时: - 按哈希查找系统调用项。 - 获取当前线程的临时页面(若不存在则分配,仅 RW)。 - `emit_stub()` 构建一个唯一的多态存根——前后插入随机填充指令,使用每调用一次变化的密钥对系统调用编号进行 XOR 混淆,并通过间接跳转指向 ntdll 的小工具。 - 将页面权限改为 RW → RX。 - 通过存根执行调用。 - 将权限改回 RX → RW。 - 立即清零存根内容。 在任何时刻都不存在 RWX 内存,`syscall` 指令绝不会在 ntdll 之外执行,系统调用编号也绝不会以明文形式存储。 ### VEH 中继 你调用 `tramp::invoke()` 并传入目标函数。若无断点——函数将以零额外开销正常运行。若调试器植入了 0xCC: 1. 触发 INT3 异常。 2. 我们的 VEH 处理器检查地址是否在查找表内(哈希查找,而非线性扫描)。 3. 从磁盘读取干净副本恢复原始字节。 4. 设置陷阱标志。 5. 继续执行——真实指令得以运行。 6. 单步异常触发。 7. 处理器将 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( 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( HASH_CI("user32.dll"), HASH("MessageBoxA"), (HWND)nullptr, (LPCSTR)"hello", (LPCSTR)"title", (UINT)MB_OK ); ``` ### AMSI / ETW ``` #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 —— 你可以随意使用它。
标签:19KB, AMSI绕过, Chrome扩展, DOM解析, EDR绕过, ETW绕过, KnownDlls, ROP, Shellcode, VEH反断点, Windows x64, W^X内存, 云资产清单, 代码混淆, 内存保护, 内核态调用, 动态存根生成, 反调试, 头文件库, 威胁检测, 安全编码, 技术调研, 数据展示, 无CRT, 无IAT, 无字符串明文, 最小化二进制, 每调用动态存根, 系统调用劫持, 系统调用提取, 红队, 逆向工程, 邮件钓鱼, 间接系统调用, 随机布局, 隐式调用, 零依赖, 高交互蜜罐