断点&&单步执行

软件断点

INT3指令 – 0xCC【n为3的INT指令,一般的INT指令会是0xCDn,但是INT3被优待啦_
在调试器中对某一行设置断点时,调试器会先把这里的本来指令的第一个字节保存起来,然后写入一条INT3指令【因为INT3的长度为1个字节,所以在设置和取消断点的时候,也只需要保存和恢复一个字节】。这种替换是在启动调试时和调试过程中动态进行的。

  • 程序运行到断点时,程序指针指向的仍是INT3指令的位置,而不是它的下一条指令。为什么?
1. 调试器在落实断点的时候,不管所在位置的指令是几个字节,它都只替换一个字节。【因此,如果程序指针指向下一个指令位置,那么指向的可能是原来的多字节指令的第二个字节,不是一条完整的指令】
2. 因为有断点在,所以被调试程序在断点位置的那条指令还没有执行。【按照程序指针总是指向即将执行的那条指令的原则,应该把程序指针指向这条要执行的指令,也就是倒退回一个字节(INT3的长度),指向本来指令的起始地址】
“烫烫烫烫”

为什么会有“烫烫烫烫”的出现?

编译器在编译调试版本时,会用0xCC来填充刚刚分配的缓冲区,这样,如果因为缓冲区或堆栈溢出时,程序指针意外指向了这些区域,那么就会因为遇到INT3指令而马上中断到调试器。

其他用途:内存对齐

断点API

用户模式:

#include <Windows.h>
DebugBreak();

内核模式:

DbgBreakePoint();
DbgBreakePointWithStatus()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值