在本文中将介绍基于软断点的调试器的工作原理。本人是做Java开发的,由于对Python在安全方面感兴趣,特意对Python在构建调试器方面进行了研究与探索。
下面介绍的调试器原理是通用的。一般的调试器会提供三种类型的断点:软断点、硬件断点和内存断点。我重点对基于软断点的调试原理进行了研究。软断点是在调试应用程序时最为常用的断点。
软断点的实现是基于单字长指令的,该指令能中断进程的执行,并产生中断事件,该事件会被调试器捕获并处理。具体来说,若有一个汇编指令:
mov EAX, EBX
该指令在内存中的表示方式如下:
0X637666666 8BC4 MOV EAX, EBX
0X637666666是指令的地址,8BC4 是指令的操作码(双字节),MOV EAX, EBX是汇编指令。
若在此地址处设置了一个软断点,当CPU执行到此处时将停止执行。软断点的设置实质上是操作码的替换!!
在本例子中将会把双字节的操作码8BC4中的一个字节替换,如替换为CCC4。即设置软断点后内存状态如下:
0X637666666 CCC4 MOV EAX, EBX
软断点的设置流程如下图所示: