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

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

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

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

工具目录

分类

查看所有分类
Loading categories
antidbg — 一个隐蔽的、完全通过系统调用的 C/C++ 用户态反调试库,适用于 Windows,旨在保护软件免受逆向工程 | Kitploit
工具/GitHubGitHub/notrequiem/antidbg
防御工具静态分析动态分析 (沙盒)逆向工程恶意软件分析二进制分析反机器人
GitHubnotrequiem/antidbg

antidbg

一个隐蔽的、完全通过系统调用的 C/C++ 用户态反调试库,适用于 Windows,旨在保护软件免受逆向工程

查看仓库
32131362天前Kitploit 审核通过

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

AntiDBG

antidbg 是一个面向 Windows 的 x64 用户态反调试库,旨在保护软件免受调试。

请将该库视为反调试保护的基础,而非唯一的防御手段。

该库具有以下特点:

  • 非常易于使用(只需调用一个函数)。
  • 专为高性能和最低资源占用而设计(1% CPU 占用;<2MB 内存)。
  • 无任何外部依赖。
  • 完全采用 MIT 许可。
  • 符合 CFG 规范。

结构

威胁模型假设调试器可能以任意权限级别拦截受此保护系统守护的软件,权限级别越高,检测效果越弱。

本软件经过加固,可通过以下方式绕过简单的 CPL > 0 拦截:

  • 通过内联汇编进行系统调用,避免任何形式的 API 挂钩。
  • 为当前进程强制执行虚拟内存保护和注入缓解策略。
  • 通过检测和/或覆盖非合法的插桩回调,防止 RAX 中的系统调用欺骗。
  • 通过磁盘文件与内存对比,检测对受监控 .text 节区的任何形式的内联补丁。
  • 分析异常处理传递(VEH、SEH、LPTOP_LEVEL_EXCEPTION_FILTER)和软件断点。
  • 测试 PAGE_GUARD 重定向行为。
  • 将重要存根保护为不可写内存,随后在独立线程上使用硬件加速哈希对其进行监控。
  • 通过 TLS 回调 保护进程入口点免受调试器附加,并执行线程起始地址检查。
  • 在调试器入口点(如 DbgBreakPoint 和 DbgUiRemoteBreakin)创建陷阱,以使进程崩溃或返回。
  • 对调试器事件和进程冻结隐藏所有线程。确保线程优先级状态不受影响。
  • 保护启动后立即设置全局向量化处理程序。

如果执行检查的唯一方式是使用不可系统调用的导出函数,则会手动逆向工程并重建该函数,使其在保护线程的模块地址空间中运行。所有用户态内存结构均通过直接内存内省而非 API 进行遍历。

保护例程会显式地留下一些未受用户态挂钩保护的执行路径,作为内存蜜罐。它们用于状态比较并迷惑攻击者。

保护例程以伪随机方式运行。熵由纯基于硬件的 ASLR、栈行为以及少量数学运算决定;不调用内核、不使用用户态 API,也不由虚拟机监控程序发出有条件或无条件退出指令。

当检测到安全违规时,保护系统会通过调用 INT 29h 并传入 STATUS_SXS_EARLY_DEACTIVATION 使当前进程崩溃,绕过所有异常处理程序。在某些情况下,它还会向内核排队一个 APC 以终止当前进程。

检测项

位于本库的主入口点(abdg.c)中,按顺序说明。

以下为简要说明;特定检测项可能执行比此处所述更多的额外/子检查。

你可以在 antidebug\archived 文件夹中找到其他检测概念的更多源代码。

  • 1. 使用 kernel32 的导出函数读取 PEB 的 BeingDebugged 字段。
  • 2. 调用导出函数 IsRemoteDebuggerPresent,以查看目标进程是否正从其自身上下文之外被调试。
  • 3. 执行 INT 2D 软件中断,检查该指令后的字节是否被跳过,而非经由 EXCEPTION_BREAKPOINT 处理程序路由。
  • 4. 执行断点中断 INT 3D,然后观察异常是被拦截还是正常传递。
  • 5. 调用 ICE/0xF1,引发 EXCEPTION_SINGLE_STEP,并检查调试器是否会将此异常视为在 RFlags 寄存器中设置单步位执行指令所生成的正常异常。
  • 6. 通过设置 TF 标志并检查调试器是否将其从 中清除来探测栈段寄存器,因为调试器通常会在每个调试器事件传递后清除陷阱标志。

用法

  1. 守护模式:一个线程将在你的程序中启动并持续监控附加的调试器。如果任何时候检测到调试器,程序将记录该尝试(如果在调试模式下编译)并强制退出,同时阻止任何其他程序停止崩溃。

示例:

root@kitploit:~
#include "adbg.h"

int main() {
    StartDebugProtection();

    return 0;
}
  1. 单次运行模式:一个你可以随时调用的函数,用于检测是否有调试器附加到你的进程。

示例:

root@kitploit:~
#include "adbg.h"

int main() {
    if (isProgramBeingDebugged()) {
        printf("Debugger detected.\n");
    }
    else {
        printf("No debugger was detected.\n");
    }

    return 0;
}

构建

1. 二进制模式

要构建测试运行器可执行文件,请启用 -DBUILD_EXAMPLE=ON。这将编译 example/main.c 并将其链接到 antidebug,而不会用入口点污染核心库。

Visual Studio(图形界面)

  1. 在 Visual Studio 中打开仓库文件夹(或打开生成的 .sln 文件)。
  2. 选择你想要的配置(x64-Release 或 x64-Debug)。
  3. 将 antidebug_runner 设置为启动项目,然后点击 Build(或按 F5 运行)。

命令行(MSVC / Ninja / Clang)

从项目根目录:

root@kitploit:~
cmake -B build -S . -DBUILD_EXAMPLE=ON
cmake --build build --config Release

可执行文件将位于:

  • MSVC 多配置:build/Release/antidebug_runner.exe
  • Ninja 单配置:build/antidebug_runner.exe

关于调试构建的说明: 在调试模式下编译(--config Debug)会通过 core/debug.c 启用控制台/调试器诊断日志。发布模式会完全移除日志记录。


2. 库模式(静态或共享)

默认情况下,CMake 生成静态库(antidebug.lib 或 libantidebug.a)。要构建动态链接库(DLL),请传递 -DBUILD_SHARED_LIBS=ON。

选项 A:MSVC(cl.exe)

使用 Visual Studio 生成器:

root@kitploit:~
# Static Library (.lib)
cmake -B build -S . -A x64 -DBUILD_SHARED_LIBS=OFF
cmake --build build --config Release

# Dynamic Library (.dll + import .lib)
cmake -B build -S . -A x64 -DBUILD_SHARED_LIBS=ON
cmake --build build --config Release

选项 B:Clang-CL(集成 MSVC 的 LLVM)

使用 Ninja 配合 clang-cl:

root@kitploit:~
# Ensure clang-cl is in your PATH or run from the VS x64 Native Tools Command Prompt
cmake -B build -S . -G Ninja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build

选项 C:Clang(MinGW / LLVM-MinGW)

启动你的 64 位 LLVM-MinGW shell(x86_64-w64-mingw32-clang 在你的 PATH 中)并使用 Ninja:

root@kitploit:~
# Static Library (.a)
cmake -B build -S . -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build

# Shared Library (.dll)
cmake -B build -S . -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
cmake --build build

3. 通过 CMake 安装

要将编译好的库和头文件安装到本地前缀:

root@kitploit:~
cmake --install build --prefix "C:/local/antidebug"

这将生成:

root@kitploit:~
C:/local/antidebug/
├── bin/
│   └── antidebug.dll           (if BUILD_SHARED_LIBS=ON)
├── lib/
│   └── antidebug.lib           (or libantidebug.a)
└── include/
    └── antidebug/
        ├── adbg.h
        └── ...

法律与免责声明

对于你通过任何恶意使用本项目所造成的任何损害,我概不负责,也不承担任何责任。

BUILD 文档的生成由 AI 完成,如有任何问题请报告。

许可证:MIT

下载工具
RFLAGS
  • 7. 利用基于前缀的指令流边界情况,检查 0xF3 0x64(反汇编为 PREFIX REP)是否强制跳过 0xF1。
  • 8. 检查在设置陷阱标志并调用 pushfd mov dword ptr [esp], 0x100 popfd nop 后,是否到达 nop 而非进入 EXCEPTION_SINGLE_STEP 处理程序。
  • 9. 引发 DBG_CONTROL_C 和 DBG_RIPEXCEPTION 事件,以查看异常是否被拦截而非经由 SEH 路由。
  • 10. 检查是否存在附加的调试对象句柄,使用 NtQueryInformationProcess 查询 ProcessDebugObjectHandle。
  • 11. 使用 NtQuerySystemInformation 查询 SystemKernelDebuggerInformation 以检测内核调试器的存在,并直接读取 KUSER_SHARED_DATA 内存页中的 KdDebuggerEnabled 字段。此外,检查内核定时器 ISR 是否异步滴答。
  • 12. 读取 NT 全局标志,检查 FLG_HEAP_ENABLE_TAIL_CHECK (0x10)、FLG_HEAP_ENABLE_FREE_CHECK (0x20) 和 FLG_HEAP_VALIDATE_PARAMETERS (0x40) 的掩码。
  • 13. 检查 ProcessDebugFlags,以推断调试是启用还是被抑制。
  • 14. 复制进程句柄,并检查调试器是否触碰句柄、继承句柄或重新打开/复制它们;我能否创建一个受保护的复制句柄,然后再次干净地复制它?
  • 15. 检查父进程链,以发现调试器启动器或可疑的祖先进程,如 vsjitdebugger、x64dbg 或类似进程。
  • 16. 不使用导出函数检查调试 PEB 字段,直接从基址(__readgsqword(0x60))偏移 *(BYTE*)((uintptr_t)peb + 2 处读取。
  • 17. 查询当前进程的 ProcessDebugPort。
  • 18. 通过检查线程调试寄存器(Dr0–Dr7)来检测硬件断点。
  • 19. 通过放置蜜罐并监控变化,检查虚拟内存是否被调试器命中。
  • 20. 对进程和窗口句柄执行两次无效句柄关闭测试,观察 ERROR_INVALID_WINDOW_HANDLE 和 EXCEPTION_INVALID_HANDLE 是否未被拦截。
  • 21. 检查调试对象是否被调试器拦截,以及是否发生句柄剥离。
  • 22. 尝试以某种方式打开进程,以揭示访问是否被调试器过滤或重定向。
  • 23. 检查标记为 HANDLE_FLAG_PROTECT_FROM_CLOSE 的互斥体句柄是否可以被直接关闭。
  • 24. 使用 SysDbgGetTriageDump 调用 NtSystemDebugControl,并检查内核调试器是否阻止该调用,或欺骗该调用但不触碰我们的内存缓冲区。
  • 25. 检查对我们自身栈的内存读取是否被插桩或拦截。
  • 26. 检查进程是否位于调试器创建的非白名单作业对象中。
  • 27. 使用内存断点式访问测试,如果监视点处于活动状态,通常预期会出现页保护或故障行为。
  • 28. 触发页异常断点场景,并检查异常链是否正确传递 STATUS_GUARD_PAGE_VIOLATION。
  • 29. 测量执行时间,以检测单步执行、断点或动态二进制插桩/JIT 重编译引入的开销。
  • 30. 通过枚举与调试器工具关联的窗口/类/标题,搜索调试器窗口或 UI 痕迹。
  • 31. 检查调试器是否清除先前设置的 DR7 中的 LBR/BTF 位以执行其自身的单步执行,从而导致 ExceptionInformation 数组为空;或者,如果调试器决定保留 LBR 启用但仍拦截由 icebp 引发的 EXCEPTION_SINGLE_STEP,则检查是否检测到内核态分支地址。
  • 32. 直接遍历堆,检查 0xABABABAB 和 0xFEEEFEEE 魔数值。实际上与第 12 项相同,但使用可挂钩的 Heap API。
  • 33. 通过检查先前共享的页面是否被调试器触碰,来检查虚拟内存中是否发生了 写时复制。
  • 34. 发送控制台事件(CTRL_C_EVENT),并检查调试器是否拦截它并将其传递更改为我们的控制处理程序,或引发 DBG_CONTROL_C。
  • 35. 检查进程是否因注入尝试而被外部挂起;检测任何指向我们进程的外部 NtResumeProcess 调用。
  • 36. 以不同的 SE_DEBUG_PRIVILEGE 权限级别调用 NtSetDebugFilterState,并检查内核调试器是否错误地处理访问。
  • 37. 分析设备对象,同时检查内核调试器是否拦截文件读取。
  • 38. 让线程与内核调试器和内核本身竞争读取 ContextFlags 结构;检查 DEBUG_REGISTERS 是否被剥离/Dr0 是否未被设置。
  • 39. 通过创建并映射一个极大的虚拟节区视图来冻结某些调试器;检测对 NtMapViewOfSection 的调用是否被篡改。
  • 40. 检查未实现的系统调用(常见于模拟器中)。
  • 41. 在四个连续的 NOP 上从 DR0 到 DR3 设置四个硬件执行断点,并通过 VEH 统计由此产生的 EXCEPTION_SINGLE_STEP 传递次数。
  • 42. 通过 OutputDebugString 在旧版 Windows XP/2000 上的副作用,以及调试器可拦截的 DBG_PRINTEXCEPTION_{C,WIDE_C} 异常,测试调试器的参与。
  • 43. 检查我们自身磁盘映像的第一个字节是否为 0xCC,并利用 Windows 加载器的文件句柄行为,即在调试器下 LoadLibrary 可能使文件保持非独占可访问状态。