首页
社区
课程
招聘
[原创]为OllyDbg增添“内存硬件条件断点”功能(1)
发表于: 2011-10-21 06:31 44416

[原创]为OllyDbg增添“内存硬件条件断点”功能(1)

2011-10-21 06:31
44416

感谢OllyDbg的作者,写出了这么好的调试器,感谢cao_cong老师做的汉化,感谢众多插件作

者,我常用的是OllyDbg v1.1【汉化第二版】(一下简称OD)。API的参数总是通过堆栈

交换,局部变量也是安排在堆栈中,比如说一个数值在堆栈0012DACC位置出现了,追踪这些值的

一般做法是,查找到该位置上下较近的一个“返回到XXXX”,参考这个“xxxx”位置,不难定位

到哪句代码把0012DACC处的值写入的。当堆栈该处上下位置位置很远处找不到“返回到XXXX”

时,不得已,下内存断点吧:在OD的数据区右击鼠标,用菜单"转到-> 0012DACC,将堆

栈映射到数据区,在“0012DACC”处下内存写入断点,跑起OD,运气好的话,n次断下后,目

标出现了(心情激动),运气不好,由于在堆栈区下断,断下太频繁,人累的不行,目标却在10万

8千里之外。。。搞不好被调试代码出个“蓝屏”罢工了,只好放弃。可以设想:在0012DACC处

下断时设置一个条件“该处值为XXXX时断下,不是该值则继续跑”,这是一个好主意。可惜的是,

美中不足,OD没有这项功能。很长一段时间,我一直想也许新版本能增加这项功能,可是2.0版没

有增加。用罗聪的OllyMachine写脚本,几句代码可以搞定,但是效率不能令人满意。在OD上直

接动手吧,一是没有参考资料,二是对OD的敬畏之情,迟迟不能下手。前几天登陆论坛,一下子找

到了好东西,武汉科锐学员: angelqkm的《OllyDBG分析报告系列》,这么好的东西我竟

然没看见。也是因为个人一些状况,我已经5年多没登陆了,感谢看雪论坛保留了我的ID。经过一

周的努力,“为OllyDbg添加内存条件硬件断点功能”有了初步成果,现在准备贴出,请高手指

点。

我为OD增加的功能如下:在数据区下内存硬件断点(访问、写入)时,弹出一个对话框,输入该内

存处的数值作为断下条件,当条件满足时断下,不满足时继续跑。原理如下:由于硬件断点的原理

是通过设置调试寄存器dr0---dr7后,代码运行时触发中断,

代码断下,OD就把中断的一些信息报告出来,等待用户下一步的操作,用户按下F9后,代码再次

跑起来。好了如果OD不是简单的报告信息,而是报告之前先行判断一下这个断下是否是用户需要

的,如果是用户需要的就报告给用户,等待用户处理,不是用户需要的就不再报告信息,继续跑代

码,这就是条件硬件断点最好的实现方法。由于我一时没搞清OD的硬件断点异常处理的细节,就采

取了变通的做法:OD继续以自己的方式报告中断信息,等待用户处理时判断一下这个中断是否是用

户期望的,如果不是,就“替代用户按一下F9”,代码再次跑起来。这个变通做法从效率上讲,是

OD做了一些无用功,既然不是用户期望的中断理当直接处理现场跑代码,不需再做报告信息的工作

了。但是以上变通做法的效率比用OllyMachine写脚本,提高了很多。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 6
支持
分享
最新回复 (46)
雪    币: 2882
活跃值: (1279)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yjd
2
楼主这排版密密麻麻看起来费劲
2011-10-21 07:51
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
3
自己到手丰衣足食,静待楼主作品:)
不知道是不是插件方式呢?
2011-10-21 08:02
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
应该好好分一下段,密密麻麻看的眼累。
2011-10-21 08:09
0
雪    币: 549
活跃值: (42)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
对不起大家,排版太菜了,我也不会写插件,用的是直接在OD上面增加代码的方式
2011-10-21 08:53
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
6
改好了后,放出来吧~

我帮你写插件:)
2011-10-21 09:09
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
7
OD2已经增加此功能了
2011-10-21 09:35
0
雪    币: 549
活跃值: (42)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
先把附件放上来,回头再详细解释具体做法。用法:附件解压后放到你正在使用的OD所在文件夹直

接运行OD即可。本想把整个文件夹压缩后放上,但是附件太大帖子不接受按只好如此。照正常操作

在追踪代码时,在设置完内存硬件断点(访问、写入)时会弹出对话框,此时输入16进制数据例如

“23db5e6f"、" EF340068"等均是合法的16进制数,注意根据设置断点类型是字节、字、还是

双字,正确输入数值,不要加前后缀,16进制数以字母开头时,前面不加0,输入完按“确定”,

即完成添加条件设置,在弹出对话框时,直接按“取消”,就没有设置任何条件。为了区别原版我

用eXescope换了一下图标,这些图标均取自OD本身,不足之处欢迎提出宝贵意。
上传的附件:
2011-10-21 10:44
0
雪    币: 549
活跃值: (42)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
附件已经在第一篇帖子的回复中上传,请有兴趣者试用,不当之处望不惜赐教。顺便说一下,我本

人没受过计算机专业的系统教育,最好的也是最有价值的文凭是个计算机专业自学考

试专科文凭,也正是这个自学考试,BASIC、DOS、汇编语言等一系列的自学打下了一点基

础,我曾经为DOS中断下过功夫,但是无功而返,windows时代铺天盖地成了主流,win98是最

好的调试平台,可惜我没有看到罗云杉老师的的WIN32汇编教程,总是对窗口之类一头雾水,现

在,感谢看雪学院,给了我好多可以学习的东西,我想通过这篇帖子,一是叙述一下自己的做法,

如有不妥请高手大侠不惜赐教,更重要的我想给初学者提供一个样板,一个例子,如何开始调试,

当然这是解密的基本功,希望他们少走弯路,提高技能。由于我的专业知识不足,错误之处在所难

免,尤其是专业反方面欠缺一些,大家忍耐一下吧,但是我会尽一切可能,尽可能能的提供我认为

是较为“完美”的东西给大家,有时候叙述啰嗦,太菜了,请高手们见谅。言归正传,下面开工

了。

  具体做法如下:使用工具OD、道具window自带的NOTEPAD记事本,为了避免

混乱,将OD所在文件夹copy一个副本,将副本中的OD换个图标,这一步不是必需的,但是这么做

了为后续的工作提供了便利,这个副本OD称为OD1,如何改造这个OD1呢?最拿手的还是使用

OD,真是那句话“以子之矛,攻子之盾”,现在是以子之矛,打造此矛,使其更加锋利。

  运行OD,载入OD1,F9,使OD1跑起来,使用OD1,载入记事本,先别忙着F

9,我们不想调试记事本!要调试的是OD1,不要忘记。怎么会这么干?我想了:解密调试一个普

通软件,用OD载入,下断点、查API 、上百度查找API的用法等等,能用的功夫全都用

上,必然可以得到想要的东西,这个OD怎么弄?它本身是调试器,怎么调它?我没有别的办法,别

的也不会,就用OD来调试他自己吧,最初不知道行不行,但是试了一下竟然然成了,这要感谢OD

的作者,他没有拒绝调试,不像那个“XX游侠”,偶尔想开个玩笑查找个它本身的东西,他就说

“哼,大侠不吃这一套!",没有贬低的意思,我对这个东西十分佩服,该公司的系列产品我是大量

应用,当然都是免费的,该公司不因为免费就降低质量,而是兢兢业业,不断推陈出新,真是丽人

佩服呀。再说主题, 既然想给OD1增加条件硬件断点,当然需要在OD1的硬件断点设置部

分找到动手的地方。

  目前有两个OD在跑,电脑的任务栏内有两个图标,为啥要更改OD1的图标,现在

明白了吧。点OD,来到DO1的领空,点OD1,来到的是NOTEPAD的领空,后续的工作需要不停

的在这两个领空切换,如果图标一样很容易混淆。OD1在哪部分处理硬件断点设置问题?武汉科锐

angelqkm的《OllyDBG分析报告系列》提供线索了,

00451CE3   .  6A 03         push    3     ; BreakPoint_Flag
00451CE5   .  6A 01         push    1     ; BreakPoint_Len
00451CE7   .  8B4D B0       mov     ecx, dword ptr [ebp-50]       ; 
00451CEA   .  51            push    ecx                 ;  BreakPoint_Addr
00451CEB .  E8 A069FBFF   call    _Sethardwarebreakpoint    ; \_Sethardwarebreakpoint

当然了,找到这段就不错了,下断点,跟踪,还会找到另一处更好的好地方:

00408690 >/$  55            PUSH EBP
00408691  |.  8BEC          MOV EBP,ESP
00408693  |.  81C4 24FDFFFF ADD ESP,-2DC
00408699  |.  53            PUSH EBX
0040869A  |.  56            PUSH ESI
0040869B  |.  57            PUSH EDI
0040869C  |.  E8 F36F0A00   CALL OllyDBG.004AF694;此代码已经改写为接口了,调用
                                                    添加的代码
004086A1  |.  90            NOP
为啥是个好地方,请看下文,408690是一个过程的入口,在此处F2设一断点,切换回到

NOTEPAD领空,来到数据窗口,选一位置例如01009010处,右键鼠标,设置硬件写入断点,你

发现了什么?在OD1的领空408690处断下了,观察CPU的各个寄存器,大有来头,例如:

EAX   01009010;什么东西似曾相识?就是刚才在NOTEPAD数据窗口设

置硬件断    点的地方

再观察堆栈窗口,此时的ESP指向一个返回地址参考价值不大,忽略,从ESP+ 4开始都是

好东西,过程参数呀!
0012CA88  |01009010       ;NOTEPAD数据区断点地址
0012CA8C  |00000004       ;断点长度4字节
0012CA90  |00000003        ;断点类型3,硬件写入断点,
这些好东西当然有用,要保存下来,为此在40869C处开口,
0040869C    CALL 004AF694

004AF694是什么地方,要去干嘛?大家心知肚明,我要在此处添加代码,记下堆栈中的3个数

据,我还有设法弹出一个窗口,输入01009010处应该断下的数值,并设法影响OD1,让它只有

这个数值时可以断下,其他数值继续跑,这不就实现硬件条件断点的功能了吗?

这个想法没错,当然实现这个想法还有一段路要走,大家要记住的是,我找到了一个好地方,”

“找到好地方”,定位到关键点,是从事解密工作不可缺少的一关,也是解密成功的关键,这是基

本功,否则一切都无从谈起。
2011-10-21 14:44
0
雪    币: 278
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我更加菜 表示完全没有看懂
2011-10-22 04:26
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
11
这个思路不错,可以考虑集成到其他插件中去
2011-10-22 21:46
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
12
学习一下,感谢分享 :)
2011-10-22 21:52
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错的想法, 直接DIY出来了
2011-10-23 02:08
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
14
等待插件
2011-10-23 08:11
0
雪    币: 210
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错,有了想法就离成功不远了
2011-10-25 18:01
0
雪    币: 549
活跃值: (42)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=热火朝天;1013207]不错,有了想法就离成功不远了[/QUOTE

不是已经把附件放在网上了,下载的不多呀!真不知道还有多少人在使用OD,为啥?我可是下了功夫搞出来的,插件办不到的事情,我办到了!!!
2011-10-26 15:57
0
雪    币: 549
活跃值: (42)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
17
感谢关注,但是,你知道这项功能在追踪过程中的作用吗?我期待着你的评价!!我感觉我做的工作插件解决不了的!!不恰当的比喻:插件给OD的手上放了一件工具,可以延伸OD的功能,我却给了OD一条小手,他和OD密不可分,它利用了OD能够被小手连通的部位。插件是隔着OD的衣服,我在OD的肌肉之内,差别仅仅如此。
2011-10-26 16:12
0
雪    币: 284
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
还真是没看太明白!!
2011-10-26 16:28
0
雪    币: 277
活跃值: (37)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
表示同LS和LLS,没看明白也没看到做好的文件。。
2011-10-28 14:44
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
20
首先感谢楼主提供这个功能,有时的确方便好多。只是和F4功能有些冲突,每次F4时都要弹出对话框,然后点击取消,才能继续。这样不太方便,运行脚本时尤其麻烦。
2011-11-4 20:10
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
21
直接修改OD原程序个人认为不是很好的办法,因为这种修改是不可还原的,一旦修改出现不可预知的问题就没法用了,而且无法与其他汉化版或增强修改版不能共同使用,所以我认为用插件实现这个功能,如果出问题了把插件禁用就可以了

不是否认作者的辛苦劳动,只是我个人的观点,没有任何针对作者的意思
2011-11-4 20:30
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
22
最好用插件的形式,而且要设置一个开关。需要时打开,不需要时关闭。不然有时很麻烦,比如用脚本调试时。
2011-11-5 10:11
0
雪    币: 163
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
OD的断点处理太不效率了..以前写过一个这样的..闪得人眼晕就给删了.
2011-11-6 20:00
0
雪    币: 414
活跃值: (10)
能力值: ( LV9,RANK:460 )
在线值:
发帖
回帖
粉丝
24
很有意义的工作。
2011-11-7 21:40
0
雪    币: 214
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
我喜欢看,喜欢做,不喜欢说.但我现在非要说一下,论坛里看了N多大牛写的东西,同时也喜欢他们分享的知识,但我非常非常喜欢楼主写东西的方式,写东西所使用的语言.写东西时的那份快乐.太......爱死你了.
2011-11-8 19:36
0
游客
登录 | 注册 方可回帖
返回
//