管理员
|
楼主#
更多
发布于:2013-03-15 11:08
| | | | 【使用工具】: ollyice(1.10), odbgScript.dll(1.82) , logTrace.osc 【系统版本】: xp sp3【发帖背景】: 做调试都是体力活啊,有木有? 如果遇害到大量的垃圾代码你会怎么做? 硬着头皮一层层分析 ? 关键是如何在这一大堆的代码里面将程序的流程梳理出来,有人提议runTrace 事实上 runTrace 远远没有达到我们的要求,于是偶写了这个 od脚本. 家里断着网,手头上实在没有什么软件来搞, 于是从看雪 CrackMe 2007中随意挑选了几个 CrackMe来试刀 ,各位也可以结合原文的分析来做比较 只是为了演示自己写的logTrace脚本的用法,关键在于思路,请各位原作者匆喷.... 简单说一下, 运行脚本之后,程序所执行的控制语句 ( jcc call retn retf 等等) 将会被顺序记录到 odScript的log窗口之中, 方便我们对流程进行回顾和分析 . 爆破一: aalloverred 之 KGM1Tal--------------------------------------------------------------------------------首先我们下一断点 bp 77D2436E ;77D2436E | user32.GetDlgItem这是getDlgTextA要调用到的,这不是一个常用断点,可以防止程序检测 新建一个脚本,KGM1Tal.osc ,内容如下: KGM1Tal.osc: -------------------- push 0 call logTrace #inc "logTrace.osc" ---------------------程序断下来以后,运行这个脚本,打开脚本运行记录,我们从最后面开始观察 ,注意这里 ----------------------- 4013A9 $RESULT_1: jnz short 004013B0 ; 这是最后一个跳转 4013AB ... 4013AB $RESULT_1: jmp 004014F5 ; 调用 MessageBox 用来显示注册失败, --------------------- 我们需要修改这个跳转,使注册成功,接下来,来修改一下我们的脚本 KGM1Tal.osc: -------------------- rtu go 4013A9 asm 4013A9,"je short 004013B0" push 0 call logTrace #inc "logTrace.osc" --------------------- 看一下新跑出来的流程 --------------------- 4013A9 $RESULT_1: je short 004013B0 ;这个跳转已经修正了 4013B0 ... 4013B0 $RESULT_1: jmp 00401480 401480 ... 401480 $RESULT_1: call 00401510 401510 ... 401517 $RESULT_1: jnz short 004014F5 ;再次跳转 4014F5 ... ;调用 MessageBox 用来显示注册失败, 401503 $RESULT_1: call <jmp.;user32.MessageBoxA> ---------------------我们再次修正脚本,添加一行 asm 401517,"je short 004014F5" 跑出流程看一下 很明显,程序又做了两次循环,至于是不是校验我们不做分析,在这里我们只关注流程,下面是两个可疑跳转 --------------------- 401406 $RESULT_1: jbe short 0040140A 40140A ... 40141D $RESULT_1: jnz 004014F5 ---------------------<C-F2> 我们重新载入,ctrl+f 输入 jcc 004014F5,我们来查一下共有几个跳转到注册失败的节点 ; 004013C6 /0F85 29010000 jnz KGM1Tal.004014F5 ; 0040141D /0F85 D2000000 jnz KGM1Tal.004014F5 ; 0040144B /0F85 A4000000 jnz KGM1Tal.004014F5 ; 00401475 /75 7E jnz short KGM1Tal.004014F5 ; 004014DD /75 16 jnz short KGM1Tal.004014F5 ; 00401517 ^\75 DC jnz short KGM1Tal.004014F5 将这几个跳转都反过来,脚本如下 --------------------- rtu go 4013A9 asm 4013A9,"je short 004013B0" ;asm 004013C6 ,"jz 004014F5" ; asm 0040141D , "jz 004014F5" asm 0040144B , " jz 004014F5" asm 00401475 , "jz short 004014F5" asm 004014DD , "jz short 004014F5" asm 00401517 ,"jz short 004014F5" push 0 call logTrace #inc "logTrace.osc" ---------------------结果还是失败,这里我就不帖出来了,大家可能已经注意到004013C6处的跳转,无论是 jz或者 jnz都会跳转到失败的处理流程中去.那么,怎么办呢,改一下我们的脚本,asm 004013C6 ,"jmp short 004013CC",重新载入,跑起来 ,程序弹出 Great Job! 爆破二:深海游侠 之 crackme1 -------------------------------------------------------------------------------- 这一个程序注册失败,是没有提示的,和前一个例子同样的断点,记录流程,首先我们不输入任何字串,记录下流程 1.txt , 再随便输入几个字串,记录下流程2.txt打开beyond Compare,比较两个流程记录, 2.txt 中间多了几个步骤,很显然就是用来校验的. --------------------- 4015CC ... 4015D6 $RESULT_1: jnz short 0040164A 4015D8 ... 4015DB $RESULT_1: jg short 0040164A 4015DD ... 4015E1 $RESULT_1: jle short 00401637 4015E3 ... 4015FB $RESULT_1: jle short 00401600 401600 ... 401603 $RESULT_1: jge short 0040160E 401605 ... 401611 $RESULT_1: jle short 00401625 401613 ... 401616 $RESULT_1: jge short 00401625 401618 ... 40162C $RESULT_1: jnz short 0040164A 40164A ... ;如果注册失败都会跳转到这里 ---------------------ctrl+f 查找 jcc 0040164A 我们查到如下几个跳转,在流程中要注意这几个地址 ; 004015CA . /7C 7E jl short 0040164A ; 004015D6 . /75 72 jnz short 0040164A ; 004015DB . /7F 6D jg short 0040164A ; 0040162C . /75 1C jnz short 0040164A 和上例同样的情况,我们发现单纯的将某处判断反转是行不通的, 此处的 0040162C 执行了多次判断 ,我们将它nop掉 最终的脚本是这样的 --------------------- asm 0040162C ,"nop" asm 0040162d ,"nop" rtu push 0 call logTrace #inc "logTrace.osc" ---------------------重新载入,断下来之后,运行脚本,程序提示 well done crack! 写本文的目的并不是讲如何爆破某个程序,而是简短讲一下这个脚本的用法,正所谓,授人以鱼不如授人以渔,如果有兴趣可以试着做一下! 由于odbgScript 插件自己的问题.脚本之中仍然存在未处理的bug,有跑飞的危险,所以请不要过于相信这个脚本跑出来的结果.在多线程的程序中,建议将其它线程先手动挂起,再运行脚本. 写在最后: 发了这篇, 就不打算再发文了, 去写cm , 找坛里人来切磋 !!!! ---------------------End -------------------------
| | | | |
|