《Python灰帽子》之构建自己的windows调试器3--实现调试事件处理例程

1668阅读 0评论2012-04-19 XylDll
分类:Python/Ruby

   前两篇我们已经说过了进程的加载以及查看寄存器中的信息,这篇我们说一下如何处理调试事件。
   首先回顾一下第1篇提到的函数WaitForDebugEvent()的调用方式,第一个参数是个结构体指针,指向的结构体为DEBUG_EVENT,第二个参数设置为INFINITE(0XFFFFFFFF),当有调试事件发生时,函数将以参数传值的形式返回一个更新过的DEBUG_EVENT结构体。我们可以以这个结构体中的信息作为我们进行事件处理的决策依据。
  
    typedef  struct  DEBUG_EVENT{
       DWORD   dwDebugEventCode;
       DWORD   dwProcessId;
       DWORD   dwThreadId;
       union{
           EXCEPTION_DEBUG_INFO    Exception;
           CREATE_THREAD_DEBUG_INFO  CreateThread;
           CREATE_PROCESS_DEBUG_INFO  CreateProcessInfo;
           EXIT_THREAD_DEBUG_INFO  ExitThread;
           EXIT_PROCESS_DEBUG_INFO  ExitProcess;
           LOAD_DLL_DEBUG_INFO LoadDll;
           UNLOAD_DLL_DEBUG_INFO  UnloadDLL;
           OUTPUT_DEBUG_STRING_INFO   DebugSting;
           RIP_INFO   RipInfo;
           }u;
    }
 
  其中dwDebugEventCode将是我们首要关注对象,他可以告诉我们函数WaitForDebugEvent()所捕获到的时间的确切类型,这个变量的值同时也决定了我们将以何种方式来诠释联合体u的形态和取值。
   
   通过检测dwDebugEventCode的值,我们可以将此事件的类型与联合体u中的某一成员对应起来,从联合体u中各成员变量的命名方式我们不难看出这两者之间的对应关系。
   例如:
上一篇:引用 static关键字总结
下一篇:程序编译的过程