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);
}
```
如果一切顺利,辅助进程会附加到主进程,从此过上幸福的生活——直到运行结束。如果不顺利,好吧,会有错误消息,然后我们再试一次。或者我们先去喝杯咖啡。
### 截图
**没有调试权限的进程执行**:
在这里,我们看到没有强大调试权限的进程是什么样子的。相当不起眼,不是吗?

**拥有那些不错权限的进程执行**:
现在我们已经激活了调试权限。感觉已经强大多了!

**现在我们用调试器试试(天哪,我也很兴奋!哈哈):**
看哪!当外部调试器处于活动状态时,我们的小把戏失败了,我们就知道有情况。这几乎就像作弊——但是是以一种好的方式!

## 总结
谁会想到反调试会是这样一场冒险?通过创建辅助进程,我们可以巧妙地规避进程无法调试自身这一事实。就像我们创造了一个双胞胎来为我们处理不愉快的任务。很聪明,对吧?
所以,下次你想智胜调试器时,请记住:有时你只需要一个小小的帮手就能成就伟业。
## 参考资料:
[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安全, 云资产清单, 代码保护, 反调试技术, 壳技术, 恶意代码分析, 端点可见性, 调试器检测, 进程注入, 逆向工程, 配置文件