断点工作原理

一、 F2断点
OD中的F2断点是int 3中断,也就是机器码0xCC指令。中断对应着中断处理函数,一旦系统执行到int3指令,这个指令将在处理器上产生硬件中断STATUS_BREAKPOINT以用于调试,为了响应STATUS_BREAKPOINT,处理器将执行3号中断向量函数。
要在被调试进程中的某个地址设定一个断点,调试器需要做两件事:

1. 修改断点地址所在内存的保护模式,保存目标地址的数据
2. 将目标地址上的第一个字节替换为int 3指令,目标地址原来的值以及断点编号信息都将被保存在调试器内存中。

然后,当调试器向操作系统请求开始运行进程时(通过前一篇文章中提到的PTRACE_CONT),进程最终一定会碰到int 3指令。此时进程停止,操作系统将发送一个信号。这时就是调试器再次出马的时候了,接收到一个其子进程(或被跟踪进程)停止的信号,然后调试器要做下面几件事:

1. 在目标地址上用原来的指令替换掉int 3
2. 将被跟踪进程中的指令指针向后递减1(因为现在指令指针指向的是已经执行过的int3之后的下一条指令)
3. 由于进程此时仍然是停止的,用户可以同被调试进程进行某种形式的交互。这里调试器可以让用户查看变量的值,检查调用栈等等
4. 当用户希望进程继续运行时,调试器负责将断点再次加到目标地址上(由于在第一步中断点已经被移除了),除非用户希望取消断点。

二、 条件断点
设置方法:

在当前行按[Shift+F2]键->条件断点(这个不太好用,因为程序BUG偶尔失效)。
在当前行按[Shift+F4]键->条件记录断点(只要设置上条件语句和按什么条件生效就可以了)。

条件语句(如):
EAX == 00401000                      ; 当EAX的值为00401000时。
[EAX] == 05201314                    ; 比如EAX的值为00401000,而地址00401000处所指向的值等于5201314时,即EAX的值表示为指针。

[[EAX]] == 05201314                  ; 比如EAX的值为00401000,地址00401000处所指向的值为00402000,而地址00402000处所指向的值等于5201314时,即EAX的值表示为指针的指针。
EAX == 05201314 && EBX == 0x05201314 ; 当EAX的值等于5201314(十进制),并且EBX的值等于5201314(十六进制)时。
[EBP+8] == WM_COMMAND                ; 
[[EBP+8]] == 05201314                ; 
byte ptr[EAX] == 'y'                 ; 
[EAX] == "coderui"                   ; 比如EAX的值为00401000,而地址00401000处所指向的字符串为“coderui”时,即EAX的值表示为指针。
[[EAX+4]+4] == WM_LBUTTONUP          ;

三、 内存断点
由于内存不会被执行,因此不能在内存使用int 3 断点,当需要对一段内存设置断点时,需要先修改该内存的属性。例如下读写断点时,OD会修改断点处的读写属性,当程序对此段内存进行读写的时候就会产生读写异常,OD捕捉此异常并分析,可以知道程序运行在何处,然后在对应的代码位置下断点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值