zero2504/Anti-Debugging

GitHub: zero2504/Anti-Debugging

通过创建辅助进程尝试附加调试主进程,以此检测外部调试器是否存在的 Windows 反调试技术方案。

Stars: 16 | Forks: 3

# 自调试世界的探险 本项目提出了一种通过自调试来检测调试器的有效方法。该技术利用 Windows API 将进程应用于自身,并识别潜在的调试器。如果外部调试器已经处于活动状态,自调试尝试将会失败,我们可以利用这种检测来揭示调试行为。 说实话,我不知道这是否可用于恶意软件开发,你可以尝试一下并告诉我结果。 ## 关于大型调试器的小故事 想象一下:我正在寻找反调试方法,偶然发现了一些关于 WinAPI 函数 `DebugActiveProcess` 的有趣文章。该函数允许调试器附加到一个活动进程并对其进行调试 [1]。 问题在哪?你无法调试你自己!好吧,这让 WinAPI 暂时出局了。但我不想使用像 `IsDebuggerPresent` 这样的标准 WinAPI——那有什么乐趣呢? 所以我研究了线程是否可以调试主进程。答案:不能!是因为我在进程中缺少权限(`SE_DEBUG_NAME`)吗?未必;没有它也能工作。不过,我在概念验证代码中还是分配了该权限——你可以自行决定是否使用它(很贴心吧?)。 但是等一下,如果我在我的进程内启动一个新进程呢?这是合法的还是简直是个天才之举?好吧,让我们来看看! ## 为什么进程无法调试自身 在 Windows 中,由于调试 API 的设计,进程无法调试自身。当进程对自己的 PID 调用 `DebugActiveProcess` 时,调用会失败,因为进程不能同时充当调试器和被调试者。操作系统强制执行这种分离,以保持稳定性并防止可能导致死锁或不一致状态的递归调试场景。这就像试图通过提自己的靴子把自己提起来一样——根本行不通! ## 实现辅助进程 既然进程无法调试自身,我们可以创建一个辅助进程来完成这些“脏活”。听起来是个好计划,对吧? ### 步骤 1. **主进程**:正常启动并检索自身的进程 ID (PID)。 2. **权限提升**:可选地使用 `AdjustTokenPrivileges` 启用调试权限。 3. **启动辅助进程**:使用 `CreateProcess` 启动程序的新实例,带上 `--debug` 标志并传递其 PID。 4. **辅助进程**:检查 `--debug` 标志并尝试使用 `DebugActiveProcess` 附加到主进程。 5. **调试操作**:辅助进程执行反调试检查并报告结果。 ##### 辅助进程附加到主进程: ``` if (DebugActiveProcess(targetPID)) { wprintf(L"[+] Attached to target process %d.\n", targetPID); // Perform debugging actions DebugActiveProcessStop(targetPID); } else { wprintf(L"[-] Failed to attach to target process. Error: %d\n", GetLastError()); ExitProcess(1); } ``` 如果一切顺利,辅助进程会附加到主进程,从此过上幸福的生活——直到运行结束。如果不顺利,好吧,会有错误消息,然后我们再试一次。或者我们先去喝杯咖啡。 ### 截图 **没有调试权限的进程执行**: 在这里,我们看到没有强大调试权限的进程是什么样子的。相当不起眼,不是吗? ![Screenshot 2024-11-15 153215](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/9df5c84eb9184436.png) **拥有那些不错权限的进程执行**: 现在我们已经激活了调试权限。感觉已经强大多了! ![Screenshot 2024-11-15 153615](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/e117658e19184437.png) **现在我们用调试器试试(天哪,我也很兴奋!哈哈):** 看哪!当外部调试器处于活动状态时,我们的小把戏失败了,我们就知道有情况。这几乎就像作弊——但是是以一种好的方式! ![Screenshot 2024-11-15 154244](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/62f9abd3d2184439.png) ## 总结 谁会想到反调试会是这样一场冒险?通过创建辅助进程,我们可以巧妙地规避进程无法调试自身这一事实。就像我们创造了一个双胞胎来为我们处理不愉快的任务。很聪明,对吧? 所以,下次你想智胜调试器时,请记住:有时你只需要一个小小的帮手就能成就伟业。 ## 参考资料: [1] https://learn.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-debugactiveprocess [2] https://learn.microsoft.com/en-us/windows/win32/secauthz/privilege-constants [3] https://github.com/LordNoteworthy/al-khaser/tree/master [4] https://0xpat.github.io/ [5] https://www.codeproject.com/Articles/30815/An-Anti-Reverse-Engineering-Guide [6] https://maldevacademy.com/ 老实说,有太多的内容和类似的技术总是大同小异。这些是你绝对应该查看的参考资料,因为有很多东西值得学习。 顺便说一句,如果你想在这个领域更上一层楼,我得说,我现在正在上 MalDev 课程,然后……哇。(非赞助,没有金钱往来——只有纯粹令人脑洞大开的知识,哈哈)。你学到了*好多*,我甚至还没学完一半,但我的大脑已经感觉像存储空间快不够用了。内容?绝对是一流的。向创作者致敬(给他们 shoutout!)——他们真的做得太棒了。
标签:Conpot, DebugActiveProcess, RedTeam, SE_DEBUG_NAME, Self-Debugging, SSH蜜罐, UML, WinAPI, Windows安全, 云资产清单, 代码保护, 反调试技术, 壳技术, 恶意代码分析, 端点可见性, 调试器检测, 进程注入, 逆向工程, 配置文件