调试断点原理之普通断点

来源:互联网 发布:老虎机js代码 编辑:程序博客网 时间:2024/05/03 05:11

OD为调试器分析不同断点的区别:

普通断点原理:直接改写断点内存地址的第一个字节,替换为int3 (0xcc,软中断机制),并保存原始字节至OD维护的一张断点表处。程序运行到此处时会中断,抛出异常,OD通过捕获该异常,暂停程序运行至断点内存地址处(断点处指令仍未执行),当执行断点处指令时,并不是完全从内存中取指令,因为该断点内存中的第一个指令已经被改写为0xcc,因此,此时执行的指令是由断点表中保存的原始字节与后续的二进制数据自合而成。执行完断点处指令后,只要断点没有被删除,其内存中的第一个字节仍然是0xcc。当删除某个断点时,od会根据删除的断点地址在断点表中查找对应的原始字节,并恢复至对应的内存中。

如图:

 

利用od加载一个程序,将断点设置在0x40137d处。通过修改断点前后的代码,来查看断点内存数据改变情况:

 

红色的汇编为修改的指令,0x401377:从0x40137d内存地址中读取4个字节到寄存器eax0x40137e:从0x40137d内存地址中读取4个字节到寄存器ecx,单步执行完0x401377处指令时,查看eax寄存器的值。如图:

 

Eax=0x7d0d8bcc(小端对齐)。正常情况下,应该0x7d0d8b50.即添加断点后,断点处的第一个字节0x50被覆写为0xcc。虽然od上显示的0x40137d处为:0x50,但是实际上,其内存地址数据已经改变。继续单步执行完断点处指令,push eax,然后单步执行0x40137e处指令(我们改写的测试指令),首先将eax值入栈,如图:


然后从0x40137d内存地址中读取4个字节到寄存器ecx,如图:

 

即断点执行前后,断点内存中的数据使用是被覆盖的0xcc

此时,我们将0x40137d处断点删除,并改写即将执行的指令,从0x40137d内存地址中读取4个字节到寄存器edx,如下图,0x401385处,eip=0x401385

 

单步执行0x401385处指令,查看寄存器edx值,如图:

 

Edx=0x7d0d8b50. 0x40137d处的原始指令已被恢复。


0 0
原创粉丝点击