前两篇我们已经说过了进程的加载以及查看寄存器中的信息,这篇我们说一下如何处理调试事件。
首先回顾一下第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中各成员变量的命名方式我们不难看出这两者之间的对应关系。
例如:
阅读(1625) | 评论(0) | 转发(0) |