-
-
花指令的手工清除及静态分析(看雪论坛精华五crackme篇反跟踪类型中
-
发表于:
2005-5-19 15:33
8894
-
花指令的手工清除及静态分析(看雪论坛精华五crackme篇反跟踪类型中
工具: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]
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!