今天是我在15pb最后一天的课程,明天火车就要离开北京南下到广东去求职了。在这里祝愿20、21期的伙伴有一个好的前程,也祝愿15pb各位老师身体健康,事业红火。
本文不会讲异常分发流程,因为异常分发流程我想分为两篇文章来写,链接如下:
1. 从异常分发流程的实现看反用户调试器
2. 从异常分发流程的实现看反双机调试【有码】
由于本人水平有限,错误之处难免,请大神们不吝指正哈!




1. 以调试方式或者附加的方式启动程序,对应的API分别是:CreateProcess和DebugActiveProcess
2. WaitForDebugEvent以等待调试事件的到来
3. DispatchEvent,分发调试事件,这里面有各种handle



以调试方式启动进程在(3环):

具体分析DbgUiConnectToDbg:
总结下:
1. 创建一个一个调试内核对象,通过ZwCreateDebugObject
2. 放到主动调试进程的teb中,这个偏移是f24
具体分析下创建调试对象(0环):


把上面创建的调试对象,填充到被调试进程的EPROCESS的DebugPort字段(0环):

直接贴出以调试方式打开进程:

因为DbgUiConnectToDbg已经在上面分析过直接分析DbgUiDebugActiveProcess:

总结:
1. NtDebugActiveProcess,根据Teb中F24中中存放的句柄,找到调试对象,然后发送假的进程创建消息(因为这里是attach的进程,进程之前已经创建 了,所以这里发送的是假的)
2.DbgUiIssueRemoteBreakin,在被调试进程中创建一个线程,然后在线程中触发int3断点,这个也是附加调试调试器能段下程序的原因
NtDebugActiveProcess的函数简单分析:


总结:
1. DbgkpPostFakeProcessCreateMessages,主要发送进程创建、线程创建、模块加载的伪造消息
2. DbgkpSetProcessDebugObject,主要任务设置事件,以便调试线程从阻塞中返回获取调试信息
DbgUiIssueRemoteBreakin的函数的详细分析:


总结:
1. 在被调试线程中创建一个远程线程,这个远程线程函数DbgUiRiRemoteBreakin
2. 这个函数主要设置一个int3断点,以便产生int3断点

调用了DbgUIWaitStateChange等待调试对象被设置:

直接跳到内核去看,可以看到是直接等待DebugObject->EventsPresent 这个内核事件被触发

获取具体的调试信息DbgUiConvertStateChangeStructure这个结构体为PDEBUG_EVENT:

一大堆的switchcase匹配,各种调试事件,主要的任务就是填充WaitForDebugEvent中的第二个参数(LPDEBUG_EVENT)
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2018-4-7 12:07
被又出bug了编辑
,原因: