Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
调试对象的构建
一、从感性角度来理解调试器与被调试程序建立的连接
1)调试程序与被调试程序通过什么来建立连接的呢?
答:DEBUG_OBJECT。
2)这 DEBUG_OBJECT 是什么呢?
答:可以认为其是两个程序之间的中转站,它不是调试器,也不是被调试程序的内核对象。
刚开始学习时,老搞不懂 DEBUG_OBJECT 到底是调试器对象还是被调试程序对象。
但现在再来看,其根本不是同一类对象,前面那个是进程对象,而DEBUG_OBJECT是调试对象。
当被调试程序出现异常时,其被调试程序不会发往调试器,而是发往调试对象DEBUG_OBJECT,由它负责代为发送到调试器来进行处理。
二、调试的构建
1)如何构建调试程序与被调试程序的呢?
答:分为两种情况。
1》创建调试进程,CreateProcess中修改Flag标志位。 一个简单的创建被调试进程的案例
2》附加的形式,使用 DebugActiveProcess函数。
三、DebugActiveProcess函数的逆向分析
(这部分一共有六七个函数,太庞大了,我就直接贴出问题吧)
1. 你对调试程序与被调试程序的链接存在哪些误区之前?
2. 查看 _DbgUiConnectToDbg(ntdll.dll) 反汇编代码。
1)指出哪个部分是创建 DEBUG_OBJECT 对象。
2)指出哪个部分是将该 DEBUG_OBJECT 对象放入 TEB+0xF24h 处的。
3. 搜索 WRK,来查找 DEBUG_OBJECT 的结构体的结构,并认真阅读里面的内容。
4. 查看 _DbgUiDebugActiveProcess(ntdll.dll) 反汇编代码
1)指出哪一部分是将 DEBUG_OBJECT 与 被调试程序建立联系。
2)指出哪一部分是下系统断点。
5. 查看 _NtDebugActiveProcess(ntoskrnl.exe) 反汇编代码
1)指出哪一部分是检测自身(自己不能调试自己)。
2)指出哪一部分是检测被调试程序是否是系统进程。
3)指出哪一部分是将被 DEBUG_OBJECT 与 被调试程序建立联系
6.查看 DbgkpSetProcessDebugObject(ntoskernl.exe) 反汇编代码
快速找出哪一部分是 将DEBUG_OBJECT 填入 EPROCESS.DebugPort中。