调试断点原理之普通断点
来源:互联网 发布:老虎机js代码 编辑:程序博客网 时间:2024/05/03 05:11
以OD为调试器分析不同断点的区别:
普通断点原理:直接改写断点内存地址的第一个字节,替换为int3 (0xcc,软中断机制),并保存原始字节至OD维护的一张断点表处。程序运行到此处时会中断,抛出异常,OD通过捕获该异常,暂停程序运行至断点内存地址处(断点处指令仍未执行),当执行断点处指令时,并不是完全从内存中取指令,因为该断点内存中的第一个指令已经被改写为0xcc,因此,此时执行的指令是由断点表中保存的原始字节与后续的二进制数据自合而成。执行完断点处指令后,只要断点没有被删除,其内存中的第一个字节仍然是0xcc。当删除某个断点时,od会根据删除的断点地址在断点表中查找对应的原始字节,并恢复至对应的内存中。
如图:
利用od加载一个程序,将断点设置在0x40137d处。通过修改断点前后的代码,来查看断点内存数据改变情况:
红色的汇编为修改的指令,0x401377:从0x40137d内存地址中读取4个字节到寄存器eax,0x40137e:从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处的原始指令已被恢复。
- 调试断点原理之普通断点
- 断点调试原理
- java之断点调试
- Xcode之断点调试
- 调试断点的实现原理
- 调试器工作原理之二——实现断点
- 调试器工作原理之二——实现断点
- 调试器工作原理之二——实现断点
- 调试器工作原理之二——实现断点
- 调试器工作原理之二——实现断点
- 调试实战之数据断点
- Visual Studio调试之断点
- VS调试技巧之断点
- VC调试技巧之断点
- Java之断点调试小记
- eclipse 调试之异常断点
- Xcode之断点调试详解
- gdb调试之断点篇
- 欧拉函数
- 【大数据处理】键值对数据库Leveldb
- Android自定义Vview实现switch按钮
- 东西方思想之差异
- 字符串查找匹配算法的一种Java实现
- 调试断点原理之普通断点
- web中的一些技术
- 数据结构
- .net先弹出提示窗口 再跳转页面
- 《coredump问题原理探究》Linux x86版7.2节vector coredump例子
- adb常见问题及解决方法
- JDK中优先级队列PriorityQueue实现分析
- X264编码h264
- oracle表的查询学习笔记2