Share-devn/stealth_call
GitHub: Share-devn/stealth_call
一个 Windows x64 头文件库,通过间接系统调用与 VEH 反断点实现免 IAT、无 CRT、W^X 并绕过 AMSI/ETW 的内存级调用引擎。
Stars: 2 | Forks: 0
## 什么是这个?
一个仅适用于 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)。
## 工作原理
### 系统调用路径
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, 无字符串明文, 最小化二进制, 每调用动态存根, 系统调用劫持, 系统调用提取, 红队, 逆向工程, 邮件钓鱼, 间接系统调用, 随机布局, 隐式调用, 零依赖, 高交互蜜罐