日期:2014-05-16  浏览次数:20576 次

【原创】OllyDBG 入门系列(五)-消息断点及 RUN 跟踪

标 题: 【原创】OllyDBG 入门系列(五)-消息断点及 RUN 跟踪
作 者: CCDebuger
时 间: 2006-02-19,16:02:46
链 接: http://bbs.pediy.com/showthread.php?t=21532

<!-- google_ad_section_start -->OllyDBG?入门系列(五)-消息断点及?RUN?跟踪

作者:CCDebuger

找了几十个不同语言编写的?crackme,发现只用消息断点的话有很多并不能真正到达我们要找的关键位置,想想还是把消息断点和?RUN?跟踪结合在一起讲,更有效一点。关于消息断点的更多内容大家可以参考?jingulong?兄的那篇《几种典型程序Button处理代码的定位》的文章,堪称经典之作。今天仍然选择?crackmes.cjb.net?镜像打包中的一个名称为?cycle?的?crackme。按照惯例,我们先运行一下这个程序看看:
/img/2012/07/01/08223718953.gif?
我们在选中的条目上点右键,再选择上图所示的菜单项,会来到下面这个窗口:
/img/2012/07/01/08223718955.gif?
从下拉菜单中选中那个?202?WM_LBUTTON_UP,再按确定按钮,我们的消息断点就设好了。现在我们还要做一件事,就是把?RUN?跟踪打开。有人可能要问,这个?RUN?跟踪是干什么的?简单的说,RUN?跟踪就是把被调试程序执行过的指令保存下来,让你可以查看被调试程序运行期间干了哪些事。RUN?跟踪会把地址、寄存器的内容、消息以及已知的操作数记录到?RUN?跟踪缓冲区中,你可以通过查看?RUN?跟踪的记录来了解程序执行了那些指令。在这还要注意一个缓冲区大小的问题,如果执行的指令太多,缓冲区满了的话,就会自动丢弃前面老的记录。我们可以在调试选项->跟踪中设置:
/img/2012/07/01/08223718957.gif?
我们可以看到?OllyDBG?把识别出的函数过程都在前面加了灰色条:
/img/2012/07/01/08223718959.gif?
这时我们点击菜单查看->内存,或者点击工具栏上那个“M”按钮(也可以按组合键?ALT+M),来到内存映射窗口:
/img/2012/07/01/08223718961.gif?
点一下?EP?段后面那个“>”符号,我们可以看到以下内容:
/img/2012/07/01/08223718963.gif
现在我们先不管,按?F9?键(或者按?CTR+F12?组合键跟踪步过)让程序运行,再点击菜单查看->RUN?跟踪,或者点击工具栏上的那个“…”符号,打开?RUN?跟踪的记录窗口看看:
/img/2012/07/01/08223718965.gif?
在地址?401082?处的那条指令上双击一下,来到以下位置:
/img/2012/07/01/08223718967.gif?
现在我们在地址?4010A6?处的那条指令上按?F2,删除所有其它的断点,点菜单调试->关闭?RUN?跟踪,现在我们就可以开始分析了:

004010E2?|.?8BFE?????????????MOV?EDI,ESI?????????????????????????????????????????;?用户名送?EDI
004010E4?|.?03F8?????????????ADD?EDI,EAX
004010E6?|.?FC???????????????CLD
004010E7?|.?F3:A4????????????REP?MOVS?BYTE?PTR?ES:[EDI],BYTE?PTR?DS:[ESI]
004010E9?|.?33C9?????????????XOR?ECX,ECX?????????????????????????????????????????;?清零,设循环计数器
004010EB?|.?BE?71214000??????MOV?ESI,cycle.00402171??????????????????????????????;?注册码送ESI
004010F0?|>?41???????????????INC?ECX
004010F1?|.?AC???????????????LODS?BYTE?PTR?DS:[ESI]??????????????????????????????;?取注册码的每个字符
004010F2?|.?0AC0?????????????OR?AL,AL????????????????????????????????????????????;?判断是否为空
004010F4?|.?74?0A????????????JE?SHORT?cycle.00401100?????????????????????????????;?没有则跳走
004010F6?|.?3C?7E????????????CMP?AL,7E???????????????????????????????????????????;?判断字符是否为非ASCII字符
004010F8?|.?7F?06????????????JG?SHORT?cycle.00401100?????????????????????????????;?非ASCII字符跳走
004010FA?|.?3C?30????????????CMP?AL,30???????????????????????????????????????????;?看是否小于30H,主要是判断是不是数字或字母等
004010FC?|.?72?02????????????JB?SHORT?cycle.00401100?????????????????????????????;?小于跳走
004010FE?|.^?EB?F0???????????JMP?SHORT?cycle.004010F0
00401100?|>?83F9?11??????????CMP?ECX,11??????????????????????????????????????????;?比较注册码位数,必须为十进制17位
00401103?|.?75?1A????????????JNZ?SHORT?cycle.0040111F
00401105?|.?E8?E7000000??????CALL?cycle.004011F1?????????????????????????????????;?关键,F7跟进去
0040