第9章 用户态调试模型
采集调试信息
作用:为了获取到与调试有关的系统动作,内核部分会调用子系统公开的一系列函数,让调试器得到通知和处理的机会.
这些函数以DbgK开头.(不是Dbgkp,p代表内部过程).
消息常量
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
typedef enum _DBGKM_APINUMBER
{
DbgKmException = 0; //异常
DbgKmCreateThreadApi = 1; //创建线程
DbgKmCreateProcess = 2; //创建进程
DbgKmExitThread = 3; //线程退出
DbgKmExitProcess = 4; //进程退出
DbgKmLoadDllApi = 5; //映射DLL
DbgKmUnloadDllApi = 6; //反映射DLL
DbgKmErrorReportApi = 7; //内部错误
DbgKmMaxApiNumber = 8; //这组常量的最大值
}DBGKM_APINUMBER;
{
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函数监视消息,也许可以检测进程是否正在被调试.