ps: 原本用小号发在新人交流投稿区的,无奈沉了 ,所以转到这里来发 .....
偶不是什么文艺青年 , 想不出强大华丽的词藻 , 只求写得 逻辑清楚 , 简洁明了, 希望对各位有用 ...
【文章作者】: 七色
【作者QQ号】: 952209657
【使用工具】: 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 -------------------------
【版权声明】: 本文系原创并发表于看雪, 转载请注明作者并保持文章的完整性并注明出处, 谢谢!!!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课