Win32自带了一些API函数,提供了相当于一般调试器的大部分功能,这些函数统称为Win32调试API,可以获得被调试的程序的底层信息,可以对被调试的程序进行任意修改。
调试事件
发生调试事件,系统将通知调试器来处理这个事件,调试器利用WaitForDebugEvent函数获取目标进程的相关环境信息。
WaitForDebugEvent收到调试事件时,调试事件的信息会被写入DEBUG_EVENT结构。
dwDebugEventCode 标记所发生的调试事件的类型。
创建并跟踪进程
CreateProcess创建进程时,当设置dwCreateFlags为DEBUG_PROCESS时,调试器会收到目标进程及其创建的所有子进程发生的所有调试事件信息。如果设置为DEBUG_ONLY_THIS_PROCESS,则只会收到目标进程的调试事件。
调试循环体
WaitForDebugEvent函数只能使用在创建的或捆绑的进程中的某个线程上。
处理调试事件
追踪EXCEPTION_DEBUG_EVENT。
以调试的方式创建一个进程时,会产生一个EXCEPTION_BREAKPOINT异常,这应该是第一个也是必定会遇到的异常。
线程环境
进程都有一个最初的主线程,通过主线程可以创建在同一地址空间中运行的其他线程。进程不执行代码,执行代码的是线程。所有线程分享相同的地址空间和系统资源,但是各自有不同的执行环境。Windows分配给每个线程一小段时间片,时间段结束后,将冻结当前线程并切换到下一个最高优先级的线程。线程信息保存到CONTEXT中,恢复运行也是从CONTEXT结构获取原来的信息。
调用GetThreadContext函数,线程可能会被调度。应该先利用SuspendThread函数暂停一个线程,当设置好环境后,再利用ResumeThread函数来恢复它。检查函数的返回值确定线程是否执行,为0恢复执行,不为0线程暂停,0xffffffff函数调用失败。SetThreadContext函数同样。