首页
社区
课程
招聘
花指令的手工清除及静态分析(看雪论坛精华五crackme篇反跟踪类型中
2005-5-19 15:33 8584

花指令的手工清除及静态分析(看雪论坛精华五crackme篇反跟踪类型中

2005-5-19 15:33
8584
工具:OllyDbg v1.10 2005.3汉化修正版;W32dsm89黄金版中文版;UEDIT32
操作系统:windowsXP
破解难度:初级
要求:使用静态修改,使 CrackMe_CRC32.exe 直接运行后就能显示出成功的字样。

这是本人的第一篇关于破解的文章,只因汇编功底太差,好多东西都看不懂,前段时间因为花指令而转辗征战,终有所悟,恰好有此crackme,便结合起来,将花指令的手工清除及静态分析与各位初学者共同交流,不当之处,还请各位朋友指正。

1.用fi查一下,有壳,为FSG V1.1。
2.先用OllyDbg脱壳。加载程序,进入后断在这!

00405000   BB D0014000     mov ebx,PCrackMe.004001D0
00405005   BF 00104000     mov edi,PCrackMe.00401000
0040500A    BE 00404000     mov esi,PCrackMe.00404000

......................
.....................
..............
F8一直到下面(中间如果发现有跳回去的,在其下面适当位置设断,然后F9)。

004050DA    FF37            push dword ptr ds:[edi]
004050DC    AF              scas dword ptr es:[edi]
004050DD    EB 09           jmp short PCrackMe.004050E8
004050DF    FE0F            dec byte ptr ds:[edi]
004050E1    0F84 19BFFFFF   je PCrackMe.00401000   注意此句

注意4050E1句,je 401000已经跳离405XXX的地址范围,实际上,只要此处条件成立,成功跳转后再F9程序就会运行。说明OEP就是401000。

重新加载程序,F2在004050E1设断点。F9运行,程序在此中断,F2去掉断点,下命令:g 401000

因为花指令的缘故,401000处的指令看不清:
00401000 90 db 90
00401001 90 nop
00401002 90 nop
00401003 90 nop
00401004 90 nop
00401005 90 nop
00401006 90 nop
00401007 90 nop
00401008 90 nop
00401009 90 nop
0040100A 90 nop
0040100B 90 nop
0040100C 90 nop
0040100D 90 nop
0040100E 90 nop
0040100F 90 nop
00401010 90 nop
00401011 90 nop
00401012 90 nop
00401013 90 nop
00401014 61 db 61 ; CHAR 'a'
00401015 EB db EB
00401016 02 db 02
00401017 9A db 9A

不用管它,直接脱壳。在OllyDbg代码区点右键,选“脱壳在当前调试的进程”,出现的窗口中不用管,点“脱壳之”按钮,保存。试一下,程序能正常用行,脱壳前2K,脱壳后25K。

OllyDbg到此谢幕,以下用静态修改。

用W32dsm89反汇编,串式参考灰度。到程序入口点:

//******************** Program Entry Point ********
:00401000 90         nop
..............一串90。
:00401013 90         nop
:00401014 61         popad
:00401015 EB02        jmp 00401019
:00401017 9AE86A00E8EA01   call 01EA:E8006AE8
:0040101E 0000        add byte ptr [eax], al
:00401020 7403        je 00401025
:00401022 7501        jne 00401025
:00401024 E8A39C3540     call 4075ACCC
:00401029 00E8        add al, ch
:0040102B B000        mov al, 00
:0040102D 0000        add byte ptr [eax], al
:0040102F EB02        jmp 00401033
:00401031 9AE8A900000000   call 0000:0000A9E8
:00401038 7412        je 0040104C
:0040103A 7403        je 0040103F
:0040103C 7501        jne 0040103F
:0040103E E88D054130     call 308115D0
:00401043 40         inc eax
:00401044 00B910000000    add byte ptr [ecx+00000010], bh
:0040104A EB0F        jmp 0040105B

此处花指令多,无法看出程序的本来面目。关于花指令的手工清除要在此?嗦几句。前段日子,为花指令焦头烂额,经过摸索,有点体会,写下来与和我一样的初学者共享。

结合上面程序来说。

如果在程序中遇到跳转跳到句子中间的,那肯定是花指令了。如:

:00401015 EB02        jmp 00401019   直接跳到401019,但下句从17开始1D结束,那么401017,401018就不会执行到,故此两字                        节属多余,可以90掉。
:00401017 9AE86A00E8EA01   call 01EA:E8006AE8 此句可将9AE8手工改成9090。

还有下面:

:00401020 7403        je 00401025
:00401022 7501        jne 00401025  此两句相当于JMP 401025,故401024为多余,可90掉。
:00401024 E8A39C3540     call 4075ACCC  此处E8可改为90,这样一来,上面两句就显得多余,只要程序执行到401020,不论是否有                       跳转,必然会到401025,故此,上面两句也可90掉。

在这个程序的后面,我们还可遇到多处以上两种花指令,要批量修改,我们可以用UEDIT32的查找替换功能。

用UEDIT32打开文件,查找EB029AE8,替换为EB029090,查找74037501E8,替换为9090909090。
其它的花指令手工清除也如上法。代码可能会变化,但只要找到规律就好办了。

替换掉以上花指令后,重新反汇编,现在是不是容易看多了:

:00401015 EB02      jmp 00401019
:00401017 90       nop
:00401018 90       nop

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401015(U)
|
:00401019 6A00      push 00000000

* Reference To: kernel32.GetModuleHandleA, Ord:016Fh
|
:0040101B E8EA010000   Call 0040120A
:00401020 90 nop
:00401021 90 nop
:00401022 90 nop
:00401023 90 nop
:00401024 90 nop
:00401025 A39C354000   mov dword ptr [0040359C], eax
:0040102A E8B0000000   call 004010DF
:0040102F EB02      jmp 00401033
:00401031 90       nop
:00401032 90             nop

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040102F(U)
|
:00401033 A900000000    test eax, 00000000
:00401038 7412          je 0040104C
:0040103A 90 nop
:0040103B 90 nop
:0040103C 90 nop
:0040103D 90 nop
:0040103E 90 nop
:0040103F 8D0541304000  lea eax, dword ptr [00403041]
:00401045 B910000000    mov ecx, 00000010
:0040104A EB0F          jmp 0040105B

看看串式参考,还是灰的,没有字串,看来程序花得有点厉害。
只好用UEDIT32找一下提示的字串。
用UEDIT32打开文件,查找程序窗口上显示的“Congratulations,Cracked by ZMWorm[CCG]”。
字串在3019处找到。在W32dsm89中,找到3019(注意不是3019的标号,而是当光标放在汇编代码上时,W32dsm89下面的状态栏上显示的@offset后面的数字。)
找到3018时汇编代码如下:

:00403018 00436F     add byte ptr [ebx+6F], al
:0040301B 6E       outsb
:0040301C 677261     jb 00403080
:0040301F 7475      je 00403096
:00403021 6C       insb
:00403022 61       popad
:00403023 7469      je 0040308E
:00403025 6F       outsd
:00403026 6E       outsb
:00403027 732C      jnb 00403055
.....................

此处显然应该是字符串,但是却显示是一段代码。不过无所谓,我们只需要的是汇编代码前面标号:403019,这就是字符串的起始地址(403018为00,不是字符串的起始地址,第一个字母是C,即43)。

在W32dsm89查找文本“403019”,只找到一处:

:00401050 8D0519304000   lea eax, dword ptr [00403019]
:00401056 B940000000    mov ecx, 00000040

再往下就是调用MessageBoxA函数去显示对话框了。

我们要往上找:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040102F(U)
|
:00401033 A900000000    test eax, 00000000
:00401038 7412       je 0040104C    注意这一句
:0040103A 90        nop
:0040103B 90        nop
:0040103C 90        nop
:0040103D 90        nop
:0040103E 90        nop
:0040103F 8D0541304000   lea eax, dword ptr [00403041]
:00401045 B910000000    mov ecx, 00000010
:0040104A EB0F       jmp 0040105B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401038(C)
|
:0040104C EB02       jmp 00401050
:0040104E 90        nop
:0040104F 90        nop

程序在401038时,如果条件成立,就将去显示我们看到的提示,若不成立呢?

至此分析完毕。有两种方法可修改,将401038句的7412改为7512或改为9090。
 
[EMAIL=fuqucode@163.com]fuqucode@163.com[/EMAIL]

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
打赏
分享
最新回复 (1)
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2005-5-20 08:54
2
0
支持,加油 !
游客
登录 | 注册 方可回帖
返回