ebugger3

<!DOCTYPE html>

debugger3

debugger3

软断点:就是一个操作码xCC,计算机遇上了就会停下程序等待调试。

在这调用两个函数,读写内存的API ,ReadProcessMemory() ,WritePeocessMemory(),再写一个类bp_set ,用来设置断点:当检测到事件码1的时候,写入一个xCC。

好了,这样软断点机制就搞好了,接下来要处理目标程序。

1,用取得目标函数所在的位置 :函数 GetModuleHandle()

2,获取该函数的地址: GetProcessAddress()

再写一个类func_resolve来调用这两个API


为了能够给目标加个软断点,先创建一个目标,printf_loop.py

这是一个调用了time模块的程序,每隔两秒钟变量counter加1,用printf函数打印输出“Loop iteration counter的值 "


用任务管理器查到这个程序的PID值,然后就测试下我们的debugger的断点机制。有一个乱码在第二行,可能是冒号是中文输入法吧。。


失败了,上图我们设置的软断点没有出来。只是和上一次实验结果差不多。

bp_set方法里,添加代码,发现读取进程内存和写入进程内存函数API都出错了。

http://stackoverflow.com/questions/28681717/getprocaddress-return-value

找到出现跟我一样的问题的,据说是在64位下无效,,尝试了修改代码很久,也没有成功。

问题:到底如何在64位程序中,成功调用函数(无论是不是下面的两个API函数),得到printf函数的句柄和地址?

handle  = kernel32.GetModuleHandleA(dll)

address = kernel32.GetProcAddress(handle, function)



那就只能把问题先放着了。


(17年8月23日更新)准备好了虚拟机环境,


taskmgr打开任务管理器

运行printf_loop.py,找到该脚本运行的线程号。运行my_test.py,输入该线程号。


!找茬了两个钟头,书上的缩进真是坑。。。。。而且原版作者喜欢省略些代码,比如 self.exception 写成 ec ?完全不能相信(大神收下我的膝盖,,,,)


硬件断点:是用硬件(断点寄存器DR0~DR3)来操作的,但是断点寄存器是有限的,只有几个。