感谢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写脚本,提高了很多。

  • 标 题:OllyDBG条件内存硬件断点附件
  • 作 者:zclyj
  • 时 间:2011-10-21 10:44:33

先把附件放上来,回头再详细解释具体做法。用法:附件解压后放到你正在使用的OD所在文件夹直

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

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

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

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

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

用eXescope换了一下图标,这些图标均取自OD本身,不足之处欢迎提出宝贵意。

上传的附件 OllyDBG.zip

  • 标 题:为OllyDbg增添“内存硬件条件断点”功能(2)
  • 作 者:zclyj
  • 时 间:2011-10-21 14:44:14

附件已经在第一篇帖子的回复中上传,请有兴趣者试用,不当之处望不惜赐教。顺便说一下,我本

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

试专科文凭,也正是这个自学考试,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,让它只有

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


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

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

本功,否则一切都无从谈起。