采集调试信息
作用:为了获取到与调试有关的系统动作,内核部分会调用子系统公开的一系列函数,让调试器得到通知和处理的机会.
这些函数以DbgK开头.(不是Dbgkp,p代表内部过程).
消息常量
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{
DbgKmException = 0 ; // 异常
DbgKmCreateThreadApi = 1 ; // 创建线程
DbgKmCreateProcess = 2 ; // 创建进程
DbgKmExitThread = 3 ; // 线程退出
DbgKmExitProcess = 4 ; // 进程退出
DbgKmLoadDllApi = 5 ; // 映射DLL
DbgKmUnloadDllApi = 6 ; // 反映射DLL
DbgKmErrorReportApi = 7 ; // 内部错误
DbgKmMaxApiNumber = 8 ; // 这组常量的最大值
}DBGKM_APINUMBER;
进程和线程创建消息
在
PspUerThreadStartup(...)
{
DbgkCreateThread(...)
if(Debug_port)
{
//检查用户态时间,判断是否是第一个线程
DbgKpSendApiMessage();
}
}
进程和线程退出消息
PspExitThread --> DbgkExitThread -->(最后一个线程) DbgkExitProcess --> DbgkpSendApiMessage
模块映射和反映射消息
ZwMapViewOfSection --> DbgkMapViewOfSection --> DbgkpSendApiMessage
ZwMapViewOfSection --> DbgkUnmapViewOfSection --> DbgkpSendApiMessage
异常消息
KiDispatchException 分发异常 --> DbgForwardException --> DbgkpSendApiMessage
PS:所有消息都经过DbgkpSendApiMessage发出,通过HOOK DbgkpSendApiMessage函数监视消息,也许可以检测进程是否正在被调试.