三种方法脱ACProtect V2.0的壳
【破文标题】三种方法脱ACProtect V2.0的壳【破文作者】bhcjl
------------------------------------------------------------------------
【破解过程】今天看到一个加了ACProtect V2.0 -> risco* Sign.By.fly *的壳的小软件,研究了半天,参考了不少大侠的脱壳方法,发现有三种方法可以搞定,当然,还有其他的好方法,希望各位高手多指点。
第一种方法:
1.用OD载入加壳程序,发现停在下面这里
01001000 加> 68 00F00101 push 加壳后Ca.0101F000 ; 停在这里
01001005 68 0B100001 push 加壳后Ca.0100100B ESP定律
0100100A C3 retn
0100100B C3 retn
我们F8向下走一步,看(下图)寄存器窗口
EAX 00000000
ECX 00010101
EDX FFFFFFFF
EBX 7FFDF000
ESP 0006FFC0 这里变红,这里右键--数据窗口中跟随
EBP 0006FFF0
ESI 00000000
EDI 00000000
EIP 01001005 加壳后Ca.01001005
这时看左下数据窗口
0006FFC0 0101F000 加壳后Ca.0101F000 右键-断点-设置硬件访问断点-WORD
0006FFC4 77E889D5 返回到 KERNEL32.77E889D5
好,我们设置好断点后,F9运行程序。
0101F000 60 pushad ; F9一次后停在这里
0101F001 81F3 E0D125C4xor ebx,C425D1E0
继续F9.大概15次后,停在下面了
010127DF 896C24 10 mov dword ptr ss:,ebp 15次后,再F9,程序就运行起来了,停在这里。F8单步向下走
010127E3 8D6C24 10 lea ebp,dword ptr ss:
010127E7 2BE0 sub esp,eax
010127E9 53 push ebx
010127EA 56 push esi
010127EB 57 push edi
010127EC 8B45 F8 mov eax,dword ptr ss:
010127EF 8965 E8 mov dword ptr ss:,esp
010127F2 50 push eax
010127F3 8B45 FC mov eax,dword ptr ss:
010127F6 C745 FC FFFFFFFF mov dword ptr ss:,-1
010127FD 8945 F8 mov dword ptr ss:,eax
01012800 C3 retn
F8向下走,来到下面这里
01012467 56 push esi
01012468 53 push ebx
01012469 E8 20FCFFFF call 加壳后Ca.0101208E
0101246E 5B pop ebx
0101246F 5F pop edi
01012470 5E pop esi
01012471 5D pop ebp
01012472 C2 0800 retn 8 这上面的不管
01012475 E5 DF in eax,0DF 被偷了一行代码。
01012477 68 E0150001 push 加壳后Ca.010015E0
0101247C E8 47030000 call 加壳后Ca.010127C8
01012481 33DB xor ebx,ebx ; 来到这里
看上面的,懂各类语言的朋友就知道,这是C++类的语言写的,学脱壳要对各类语言的入口要非常清楚。
好,我们找一个这类的程序看看。看下面。和上面对比发现被偷了一行代码
01012475 原> $ 6A 70 push 70 ; 这是原程序入口
01012477. 68 E0150001push 原Calc.010015E0
0101247C. E8 47030000call 原Calc.010127C8
01012481. 33DB xor ebx,ebx
01012483. 53 push ebx ; /pModule => NULL
好,我们把push 70,这一行代码复制一下,在01012475处汇编一下。改好后的代码如下
01012475 6A 70 push 70 这是我们修复后的。用OD在这里右键-此处新建EIP
01012477 68 E0150001 push 加壳后Ca.010015E0
0101247C E8 47030000 call 加壳后Ca.010127C8
01012481 33DB xor ebx,ebx ; 来到这里
01012483 53 push ebx
好,新建EIP后,我们就可以脱壳了,打开LordPE,找到这个进程,右键-修正镜像大小,然后,完整转存后退出LordPE
.下面再打开ImportREC.修复一下即可,这里不多说了。运行一下程序,发现可以运行,再查一下壳,是Microsoft Visual C++ 7.0 Method2编写的
第二种方法:
用OD载入程序后,ALT+M打开内存镜像
0100100000013000 (77824.)加壳后Ca 01000000 后在这里F2下断 .text code
0101400000002000 (8192.)加壳后Ca 01000000 先这里F2下断 .data code,data
0101600000009000 (36864.)加壳后Ca 01000000 .rsrc code,resources
0101F0000001E000 (122880.) 加壳后Ca 01000000 .perplex code,imports
65D2000000001000 (4096.)USP1065D20000 (自身) PE header
我们ALT+M打开内存镜像后在01014000区段右键-设置访问中断,(也就是F2下断),然后SHIFT+F9运行,停下后,再在01001000区段F2下断,再次SHIFT+F9运行,停下后。再次在区段01014000这里F2下断。然后SHIFT+F9运行,停在下面了
01012475 E5 DF in eax,0DF ; 这里被偷了代码。
01012477 68 E0150001 push 加壳后Ca.010015E0
0101247C E8 47030000 call 加壳后Ca.010127C8
01012481 33DB xor ebx,ebx
01012483 53 push ebx
01012484 8B3D 20100001mov edi,dword ptr ds:; KERNEL32.GetModuleHandleA
0101248A FFD7 call edi
0101248C 66:8138 4D5A cmp word ptr ds:,5A4D
01012491 75 1F jnz short 加壳后Ca.010124B2
01012493 8B48 3C mov ecx,dword ptr ds:
01012496 03C8 add ecx,eax
01012498 8139 50450000cmp dword ptr ds:,4550
0101249E 75 12 jnz short 加壳后Ca.010124B2
010124A0 0FB741 18 movzx eax,word ptr ds:
010124A4 3D 0B010000 cmp eax,10B
010124A9 74 1F je short 加壳后Ca.010124CA
010124AB 3D 0B020000 cmp eax,20B
010124B0 74 05 je short 加壳后Ca.010124B7
010124B2 895D E4 mov dword ptr ss:,ebx
010124B5 EB 27 jmp short 加壳后Ca.010124DE
010124B7 83B9 84000000 0E cmp dword ptr ds:,0E
010124BE^ 76 F2 jbe short 加壳后Ca.010124B2
010124C0 33C0 xor eax,eax
010124C2 3999 F8000000cmp dword ptr ds:,ebx
010124C8 EB 0E jmp short 加壳后Ca.010124D8
010124CA 8379 74 0E cmp dword ptr ds:,0E
010124CE^ 76 E2 jbe short 加壳后Ca.010124B2
010124D0 33C0 xor eax,eax
010124D2 3999 E8000000cmp dword ptr ds:,ebx
010124D8 0F95C0 setne al
010124DB 8945 E4 mov dword ptr ss:,eax
010124DE 895D FC mov dword ptr ss:,ebx
010124E1 6A 02 push 2
010124E3 FF15 0C120001call dword ptr ds: ; msvcrt.__set_app_type
010124E9 59 pop ecx
010124EA 830D 10500101 FF or dword ptr ds:,FFFFFF>; 三次内存镜像后停在这里。向上看
010124F1 830D 14500101 FF or dword ptr ds:,FFFFFF>
下面的操作用第一种方法,这里不多说了。
第三种方法:
OD载入后,F9运行程序,程序出来后,点暂停键,或者按F12,这时点查看--执行模块。打开可执行模块。用鼠标在第二行主程序模块右键点--CPU中查看代码。然后在底下的“命令”里输入"bpx abc".这里abc是随便输的。
然后在“模块间调用”中输入set_app_type。找到后,双击一下来到下面
01012475 E5 DF in eax,0DF ; 又来到这里了,被偷的代码处
01012477 68 E0150001 push 加壳后Ca.010015E0
0101247C E8 47030000 call 加壳后Ca.010127C8
01012481 33DB xor ebx,ebx
01012483 53 push ebx
01012484 8B3D 20100001mov edi,dword ptr ds:; KERNEL32.GetModuleHandleA
0101248A FFD7 call edi
0101248C 66:8138 4D5A cmp word ptr ds:,5A4D
01012491 75 1F jnz short 加壳后Ca.010124B2
01012493 8B48 3C mov ecx,dword ptr ds:
01012496 03C8 add ecx,eax
01012498 8139 50450000cmp dword ptr ds:,4550
0101249E 75 12 jnz short 加壳后Ca.010124B2
010124A0 0FB741 18 movzx eax,word ptr ds:
010124A4 3D 0B010000 cmp eax,10B
010124A9 74 1F je short 加壳后Ca.010124CA
010124AB 3D 0B020000 cmp eax,20B
010124B0 74 05 je short 加壳后Ca.010124B7
010124B2 895D E4 mov dword ptr ss:,ebx
010124B5 EB 27 jmp short 加壳后Ca.010124DE
010124B7 83B9 84000000 0E cmp dword ptr ds:,0E
010124BE^ 76 F2 jbe short 加壳后Ca.010124B2
010124C0 33C0 xor eax,eax
010124C2 3999 F8000000cmp dword ptr ds:,ebx
010124C8 EB 0E jmp short 加壳后Ca.010124D8
010124CA 8379 74 0E cmp dword ptr ds:,0E
010124CE^ 76 E2 jbe short 加壳后Ca.010124B2
010124D0 33C0 xor eax,eax
010124D2 3999 E8000000cmp dword ptr ds:,ebx
010124D8 0F95C0 setne al
010124DB 8945 E4 mov dword ptr ss:,eax
010124DE 895D FC mov dword ptr ss:,ebx
010124E1 6A 02 push 2 ; 看到下面了吧。我们向上看
010124E3 FF15 0C120001call dword ptr ds: ; msvcrt.__set_app_type
010124E9 59 pop ecx
下面的操作我就不讲了,大家应该知道怎么做了吧 ~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~ 新手学习了,如果有原程序实际操作一下就好了!! 暴强~
这个壳 如果我用脚本脱不掉
基本上就没多大的勇气了~~ 在UnPacKcN上有看到过。 还是手脱得好 脚本和几个版本脱壳机我从来没有成功过 完全不明白 说了那么多,还不如做教程出来的实在啊! 我都是用脚本的 脱完以后修复一下绝对可以的 就为了这壳烦了一通宵了..如果楼主可以提供下重点那是最好了