03 调试事件的处理
Posted onetrainee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03 调试事件的处理相关的知识,希望对你有一定的参考价值。
【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】
问题:
1. 建立被调试程序时接收的第一个调试事件是什么?
2. 该事件在内核中的生成流程是什么?
3. 其初始化下断点时如何判断是否是被调试程序(而不是一般程序)?
4. 关于调试的内核函数中为何要发送虚假消息(**fake**)?
一、创建进程时的第一个调试事件
在这个例子中,简单地以调试模式打开 记事本.exe, 发现其首先会接收到一个异常事件。
当调试进程创建或附加被调试进程之后,其会在被调试进程中下一个int 3断点。
其函数的经过如下:(注:当函数太大时,可以通过 IDA的Cross Reference 函数来逆向推出被调试程序)
注意:在内核中进程的初始化一般都会调用 LdrpInitializeProcess,但不是每个进程都会被下断点。
如下图,其会检测 PEB+0x2处
二、 发送虚假消息
当某一进程以附加的形式调试时,其会调用 DebugActive 之类的函数。
在函数内部会发送假消息,为什么需要发送假消息呢?
因为该进程已经被创建,DLL模块也已经被加载了。
但调试器需要其DLL模块等被调试程序的信息,此时被调试进程需要发送虚假的消息,其实就是遍历TEB链表查找各种DLL模块。
那么这个可靠吗?
当然不可靠,我们之前就有一篇在R3层的隐藏TEB 利用C++实现模块隐藏(R3层断链)
以上是关于03 调试事件的处理的主要内容,如果未能解决你的问题,请参考以下文章