灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2810回复:0

另类方式实现爆破

楼主#
更多 发布于: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 -------------------------

喜欢0 评分0
游客

返回顶部