首页
社区
课程
招聘
对int3断点实现的一些疑惑
发表于: 2011-8-31 11:57 10944

对int3断点实现的一些疑惑

2011-8-31 11:57
10944
我知道OllyDbg的普通断点int3断点,就是将要下断的地址处指令第一个字节改为CC,然后运行到断点地址就会断下来,可是,他的具体实现我有些不太明白。
在断点地址中断后,按F9,程序会继续运行,而此时断点依然存在。按理说,在断点地址中断后,od会恢复断点地址处原来的字节,这样就等于取消了这个断点,才可能使程序继续从原来的地址运行下去。但是,为什么od能保存这个断点,而让程序继续运行下去呢?

如果写调试器的话,如何中断在这个CC断点,再F9,程序就会运行起来但原断点依旧存在,那么,这一步是如何实现的呢?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
改了是要有记录的,比如用链表。要不然你改了cc怎么恢复呢。
2011-8-31 12:06
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
  0XCC产生异常  OD捕获到了  就跳转到异常处理函数  异常处理函数  
异常处理函数就是 停止代码继续执行
F9  执行以前0XCC破坏掉的汇编指令(肯定要记录下以前的) 然后再跳回去
2011-8-31 12:32
0
雪    币: 33
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
改了要记录,但按F9就要恢复这个断点处的原指令然后从原指令处开始运行,那这个CC断点怎么恢复呢?
2011-8-31 12:53
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
OD1附加OD2,然后OD2对某程序附件,然后od2对某程序下F2,断下来,此时od1对OD2下断bp SetContextThread~,然后od2里F9,就可以看到某个过程鸟~
2011-8-31 12:56
0
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你可以单步过去,再把cc写回去啊。
2011-8-31 12:57
0
雪    币: 33
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
OD捕获到这个异常,是转到OD的异常处理函数吧,你的意思是,F9要记录下原断点处的指令,然后执行,再跳回去,那你的意思是这条指令不是在原来的断点处地址执行的?在其他地方执行了再跳回下一条指令处继续执行?
2011-8-31 12:59
0
雪    币: 33
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
他肯定不是单步再写回去的,如果指令是pushf,单步就会破坏原有指令执行的结果了
2011-8-31 13:01
0
雪    币: 33
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我跟了但是也找不到他具体怎么实现的,初学,一大堆汇编代码还是看不太懂的,你能简单给我说说这个过程吗?谢谢
2011-8-31 13:14
0
雪    币: 76
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
看雪里有很多科锐学员写的调试器, 开源的, 你可以下载来参考一下, 和OD原理一样的
2011-8-31 13:51
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
V大  方法很不错的说
2011-8-31 15:14
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
大多数调试器对当前的断点就是这么做的啊。先恢复当前eip下的指令,然后单步,单步后再把刚才的指令修改成0xcc,然后继续执行。

pushf我觉得是个特例,作为单字节指令,也可以特殊化处理。比如把下条指令变成CC,然后内部处理掉就是。

还可以想象下,假设pushf没有特殊化处理可能的结果是什么?
原来的pushf,栈中的word没有T标志,修改后的pushf,栈中的word多了个T标志。对客户程序有什么样的影响?客户会怎么样使用这个flag?好象没有。
2011-8-31 18:13
0
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我理解楼主的意思是先设了单步,改了tf位,然后压了栈,就相当于改了eflags。这样大不了你自己再把栈里的数据处理一下,反正就这么个特例。
2011-8-31 18:22
0
雪    币: 33
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢你的指导。我对pushf的处理感到有些棘手是因为看到ZProtect中使用了大量的pushf进行指令转移,担心不小心改变了标志位在脱壳的时候会带来一些麻烦。
2011-8-31 20:42
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
相互学习,你的问题也开启了我的思路,我以前真没想过断点处理时的pushf.
2011-8-31 22:03
0
雪    币: 76
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主,你的头像闪的我好难受,不回答了
2011-9-7 14:50
0
游客
登录 | 注册 方可回帖
返回