python编写debugger调试器

<!DOCTYPE html>

python编写debugger调试器

python编写debugger调试器

http://blog.csdn.net/u012763794/article/details/52174275#t21

?what and why

是跟踪程序的程序,为了发现目标程序的错误

?How

通过调用一系列API实现对目标程序的附加,停止等等操作。debugger必须容易读写寄存器,并修改它们的值。debugger会一直循环,直到调试事件发生。

断点

调试器通常需要中断程序,操作系统提供的中断操作有两种,一种是硬件中断,一种是软件中断。

硬件中断来自于硬件,如键盘被按下,鼠标按下。

软件中断是一个指令,让操作系统停止应用程序,这个指令是 int 0x80(对应硬件平台i386、OS linux)

软断点:是一个单字节的指令,碰到该指令就停下来,把控制权交给调试器。

interrupt 3指令 = 0xcc(操作码)

黑盒调试器和白盒调试器区别:有没有程序源代码的区别。

黑盒调试器运行在什么样的权限下?

rin3 user模式 最小权限 exe文件运行的  ,(WINDBG、Ollydbg  运行在这个模式下)

rin0 kerner模式 最大权限 操作系统以及驱动等等(运行的 PYDBG)


用python写一个debugger调试器。

首先建立一个框架,一个主程序my_test.py(负责组织调用其他模块),一个定义变量的模块my_debugger_defines.py,还有一个bugger模块,my_debugger.py(定义了具体的实现)。将这三个模块放在同一个文件夹下。

运行my_test.py脚本。该脚本很简单,就是三行,第一行导入my_debugger模块,第二行使用该模块下的debugger函数,第三行,给这个函数导入位于某位置的函数作为参数。



debugger模块里,定义了一个类debugger,定义了两个方法,一个是初始化变量的方法,一个是加载进程的方法。第二个方法的具体实现调用了一个windowsAPI,用来加载一个程序。


如何调用windowsAPI?

1,首先你要有一本《windowsAPI》,可以根据功能查找API的名称和参数。

2,在Python中,你需要在开头的时候说明要使用的库:

kernel32 = windll.kernel32

前面是名字,后面是告诉计算机路径,在哪里找到它。在后面我们调用kernel32动态链接库中的函数的时候就可以直接用kernel32

这个称呼,计算机就会在给出的地址去调用kernel32了。

3,

class calculate():  #定义一个类

def _init_(self):  #定义一个特殊方法,初始化参数的。要调用的API的参数可以在这里初始化。

   pass

def add(self,plus):#定义一个方法

if kernel32.XXXXXXXXX(AA,BB,CC,DD) #给出API函数的名字,参数

print "success!" #调用成功,并打印出success.