分类: Python/Ruby
2012-04-19 11:50:47
调试器具备的最基本的能力有:打开一个可执行文件并使之以自身子进程的形式运行起来的能力,以及附加一个现在进程的能力。
windows自带的调试API已经为我们提供了实现这两种功能的捷径。
在这里,我想说一下这两个能力实现的过程以及调用的API,关于每个使用到的API自己查MSDN。
一.打开一个可执行文件并使之以自身子程序的形式运行起来
1.获取可执行文件的目录
2.用CreatProcessA()创建一个新进程,运行该程序。参见MSDN中的CreatProcess函数
二.在现有的进程中附加一个进程
1.我们可以从资源管理器中获取某个正在运行中的进程的PID;
2.然后利用OpenProcess()获取该进程的句柄;
该函数的第一个参数设置为PROCESS_ALL_ACCESS(0x001F0FFF),第二个参数为False,第三个参数为标识着进程身份的PID值。
3.用DebugActiveProcess()实现进程的附加,将该进程附加到调试器自己的进程中;
该函数只有一个参数,就是要附加上的进程的PID值。
4.用WaitForDebugEvent()等待调试事件的发生,该API只有在有事件发生时才返回,否则不返回;
该函数的第一个参数是个结构体指针,指向的结构体为DEBUG_EVENT,第二个参数设置为INFINITE(0XFFFFFFFF)
5.用ContinueDebugEvent()恢复原进程的执行。
该函数的第一个参数和第二个参数的取值源于DEBUG_EVENT结构体中两个同名的成员变量,这两个成员变量的取值会在调试器补货时间的水煎作为调用参数的一部分而得到更新,第三个参数的取值将决定目标进程的下一个动作:DBG_CONTINUE(0x00010002)表示继续执行,DBG_EXECEPTION_NOT_HANDLED表示继续处理所捕获的异常事件。
6.用DebugActiveProcessStop()使调试器能够与被调试进程分离。
该函数只有一个参数,就是希望与调试器分离的进程的PID值。
如果在出错时想获取错误代码,可以使用GetLastError(),无参数。