Skip to content
KitploitKITPLOIT
工具漏洞利用博客
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
stealth_call — Header-only Windows x64 间接系统调用库。零 CRT、零 IAT、VEH 反断点、AMSI/ETW 绕过、W^X 内存、按调用动态存根。 | Kitploit
工具/GitHubGitHub/kitsune-de/stealth_call
防御工具漏洞利用恶意软件分析红队Payload 开发反机器人
GitHubkitsune-de/stealth_call

stealth_call

Header-only Windows x64 间接系统调用库。零 CRT、零 IAT、VEH 反断点、AMSI/ETW 绕过、W^X 内存、按调用动态存根。

查看仓库
6465个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

stealth_call


这是什么?

一个仅头文件的 Windows x64 库,让你无需触碰 ntdll 导入即可调用任意 NT 系统调用,无需在二进制文件中留下字符串,也不会出现那些让 EDR 抓狂的常见红旗特征。

无 CRT。无 STL。无 IAT。整个库编译后仅约 19KB,且完全没有 DLL 依赖。

设计初衷是规避现有系统调用库的常见缺陷——明文文本字符串、已知哈希常量、从非 ntdll 内存直接发起系统调用、暴露"我在做奇怪的事"的 IAT 导入、SEC_NO_CHANGE IOC、CRT 臃肿。这些在这里统统不存在。


特性

系统调用引擎

  • 间接系统调用——存根跳转到 ntdll 自身的 syscall; ret gadget,因此当 syscall 指令触发时 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 使其返回 SUCCESS
  • 所有修补均通过直接系统调用完成,而非 VirtualProtect
  • 所有字符串均经过 XOR 加密——DLL 名称、路径等。在栈上解密,使用后清除
  • 自定义哈希算法(非 FNV-1a,非 CRC32——无已知 YARA 签名)
  • 所有模块/函数解析均通过 PEB 遍历完成——不使用 GetModuleHandle,不使用 GetProcAddress

代码质量

  • 仅头文件,将 stealth/ 文件夹放入项目即可使用
  • 通过每线程临时页 + 自旋锁实现线程安全
  • 关闭时完整清理——临时页释放、映射清零、VEH 移除
  • 针对常见 EDR trampoline 的钩子检测(jmp rel32、jmp [rip]、mov rax + jmp rax)

工作原理

flow

系统调用路径

  1. initialize() 通过 \KnownDlls 节打开 ntdll,解析 PE 导出表,获取每个系统调用号
  2. 扫描 ntdll .text 段寻找 syscall; ret gadget——实际的 syscall 指令将在此处执行
  3. 当你调用 sc::invoke() 时:
    • 通过哈希查找系统调用条目
    • 获取调用线程的临时页(或分配一个,仅 RW)
    • emit_stub() 构建一个独特的变形存根——前后插入随机垃圾指令,使用每次调用独立的密钥对系统调用号进行 XOR 混淆,间接跳转到 ntdll gadget
    • 将页面从 RW 切换为 RX
    • 通过存根发起调用
    • 从 RX 切换回 RW
    • 将存根字节清零

在任何时刻都不存在 RWX 内存。在任何时刻 syscall 指令都不会在 ntdll 之外执行。在任何时刻系统调用号都不会以明文存储。

VEH Trampoline

你以目标函数调用 tramp::invoke()。如果没有断点——函数以零开销正常运行。如果调试器放置了 0xCC:

  1. INT3 异常触发
  2. 我们的 VEH 处理器检查该地址是否在我们的表中(哈希查找,而非线性扫描)
  3. 从磁盘读取的干净副本中恢复原始字节
  4. 设置陷阱标志(Trap Flag)
  5. 继续执行——真实指令运行
  6. 单步异常触发
  7. 处理器重新放回 0xCC

调试器的断点列表仍显示该断点为激活状态。只是该断点永远不会在我们的调用上触发。


构建

root@kitploit:~
cmake -B build -A x64
cmake --build build --config Release

需要 MSVC(VS 2019+)和 CMake 3.15+。输出约 19KB,零导入。


用法

系统调用

root@kitploit:~
#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
);

反断点

root@kitploit:~
#include "stealth/trampoline.hpp"

// 即使 x64dbg 在 MessageBoxA 上设置了断点也能正常工作
int ret = stealth::tramp::invoke<int>(
    HASH_CI("user32.dll"), HASH("MessageBoxA"),
    (HWND)nullptr, (LPCSTR)"hello", (LPCSTR)"title", (UINT)MB_OK
);

AMSI / ETW

root@kitploit:~
#include "stealth/bypass.hpp"

stealth::bypass::patch_etw();
stealth::bypass::patch_amsi();

清理

root@kitploit:~
stealth::tramp::shutdown();
stealth::sc::shutdown();

项目结构

root@kitploit:~
stealth/
  common.hpp      — 内存操作、自旋锁、static_map、PRNG、调试输出
  hash.hpp        — 编译期自定义哈希
  xorstr.hpp      — 编译期 XOR 字符串加密
  peb.hpp         — PEB 遍历、PE 导出解析器、钩子检测
  syscall.hpp     — 间接系统调用引擎、存根生成器、W^X、反转储
  trampoline.hpp  — 基于 VEH 的反断点
  bypass.hpp      — AMSI + ETW 修补

许可证

MIT——随你怎么用。

下载工具