第9章 用户态调试模型

采集调试信息
作用:为了获取到与调试有关的系统动作,内核部分会调用子系统公开的一系列函数,让调试器得到通知和处理的机会.

       这些函数以DbgK开头.(不是Dbgkp,p代表内部过程).

消息常量

代码
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;

 

 

进程和线程创建消息

    在
    PspUerThreadStartup(...)

    {

      DbgkCreateThread(...)

      if(Debug_port)

      {

        //检查用户态时间,判断是否是第一个线程

        DbgKpSendApiMessage();

      }  

    }

 

进程和线程退出消息

  PspExitThread --> DbgkExitThread -->(最后一个线程) DbgkExitProcess --> DbgkpSendApiMessage

 

模块映射和反映射消息 

  ZwMapViewOfSection --> DbgkMapViewOfSection -->  DbgkpSendApiMessage      

  ZwMapViewOfSection --> DbgkUnmapViewOfSection --> DbgkpSendApiMessage

异常消息

  KiDispatchException 分发异常 --> DbgForwardException --> DbgkpSendApiMessage

 

PS:所有消息都经过DbgkpSendApiMessage发出,通过HOOK DbgkpSendApiMessage函数监视消息,也许可以检测进程是否正在被调试.

 

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2010-01-04 08:02  鸿鹄  阅读(352)  评论(0编辑  收藏  举报