C++如何检测程序是否被调试器附加_C++使用IsDebuggerPresent防止反汇编【防御】-C++

isdebuggerpresent不可靠,仅检测peb->beingdebugged字节,易被patch、peb篡改或单步异常绕过;需结合ntglobalflag检查和异常触发等多维度组合检测。

IsDebuggerPresent 函数能可靠检测调试器吗

IsDebuggerPresent 是 Windows API 提供的最轻量级检测方式,但它只检查当前进程是否正被用户模式调试器(如 Visual Studio、x64dbg)附加。它不检测内核调试器(WinDbg + kd)、反汇编器静态分析,也不防 Patch 或内存断点绕过。返回 TRUE 仅表示 PEB->BeingDebugged 字节为 1,这个字节可被直接修改或隐藏。

为什么单纯调用 IsDebuggerPresent 容易被绕过

攻击者常用以下手段快速失效该检测:

  • 启动后立即 patch IsDebuggerPresent 的返回值(改 ret 指令为 mov eax, 0; ret)
  • 在入口点前 hook ntdll.dll 中的 LdrInitializeThunk,篡改 PEB 结构
  • 使用 SetThreadContext 修改 EFLAGS.TF 位触发单步异常,再恢复执行——IsDebuggerPresent 不感知这种“无调试器的单步”
  • 通过 NtQueryInformationProcess 查询 ProcessBasicInformation,比对 PEB->BeingDebugged 和 PEB->NtGlobalFlag(若含 FLG_HEAP_ENABLE_TAIL_CHECK 等调试标志则可疑)

更实用的组合检测写法(Windows x64)

不要只依赖单一信号。下面这段代码同时检查三处低层痕迹,且避免直接调用易被 IAT Hook 的函数:

bool IsDebuggerAttached() {
    // 1. 基础 PEB 检查(inline asm 避免导入表暴露)
    unsigned char being_debugged = 0;
    __asm {
        mov rax, gs:[60h]   // PEB base on x64
        mov being_debugged, byte ptr [rax+2]
    }
    if (being_debugged) return true;

    // 2. 检查 NtGlobalFlag(常被调试器设置)
    unsigned long nt_global_flag = 0;
    __asm {
        mov rax, gs:[60h]
        mov nt_global_flag, dword ptr [rax+bch]  // offset 0xbc on x64
    }
    if (nt_global_flag & 0x70) return true;  // FLG_HEAP_ENABLE_TAIL_CHECK | FLG_ENABLE_CSRDEBUG | FLG_KERNEL_STACK_TRACE

    // 3. 尝试触发异常看是否被接管(慎用,可能影响稳定)
    __try {
        __debugbreak();  // 若被调试器捕获,后续代码可能不执行;但需配合 SEH 处理
    } __except(EXCEPTION_EXECUTE_HANDLER) {
        return true;
    }
    return false;
}

注意:__debugbreak() 在 Release 模式下不会中断,但若进程已被调试,SEH 会进入 except 块——这步有误报风险,建议仅在关键校验点启用。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何检测程序是否被调试器附加_C++使用IsDebuggerPresent防止反汇编【防御】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4027407+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4027407+
  • 本周更新: 0+
  • 最后更新: 2026-03-16