调试事件的收集

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

调试事件的收集

一、被调试程序发送的第一个事件 - INT 3 断点

  如果测试这个程序(一个简单的创建被调试进程的案例),会发现当调试程序被创建时,其发送的第一个事件是一个 INT3 的异常事件。

  该事件是紧跟在调试器与被调试程序建立链接之后(_NtDebugActiveProcess),调用_DbgUiIssueRemoteBreakin 函数来创建远程断点的。

  该断点是系统断点,与普通断点的区别是:系统断点不用用户处理,只要放行过去,系统就会自动恢复。

  

 

 

二、调试器如何接收被调试程序(WaitForDebugEvent

  前面我们已经讲过 被调试程序调试事件的派发,其流程是:在被调试程序的必经之路上设置"陷阱",然后根据不同情况包装 ApiMsg,生成Event事件,加入到DebugObject.EventLink中,之后将Event的signal设置为1,通知调试器有事件。

  现在我们来探究调试器如何接收调试事件,对于程序员来说,其调用 WaitForDebugEvent 来等待调试事件。

   WaitForDebugEvent 本质就是在内核中遍历 DEBUG_OBJECT.EventLink 这个链表,找到活动的事件。如果找到活动事件,其将该事件标志为"被阅读",之后退出遍历链表,将首次得到的活动事件的信息进行封装(转成三环的DebugEvent),转给程序代码来进行处理。

 

  

 

posted @ 2019-11-30 08:05  OneTrainee  阅读(357)  评论(0编辑  收藏  举报