kissy 发表于 2008-4-2 10:06

三种方法脱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

下面的操作我就不讲了,大家应该知道怎么做了吧

a393269192 发表于 2008-4-2 11:00

~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~

qsl1007 发表于 2008-4-2 13:05

新手学习了,如果有原程序实际操作一下就好了!!

mycsy 发表于 2008-4-2 13:20

暴强~

这个壳 如果我用脚本脱不掉

基本上就没多大的勇气了~~

Fate 发表于 2008-4-2 13:22

在UnPacKcN上有看到过。

kissy 发表于 2008-4-2 15:35

还是手脱得好 脚本和几个版本脱壳机我从来没有成功过

文文 发表于 2008-4-2 18:07

完全不明白

chendidi 发表于 2008-4-3 20:10

说了那么多,还不如做教程出来的实在啊!

qqtwo 发表于 2008-4-3 22:06

我都是用脚本的 脱完以后修复一下绝对可以的

syxhdy 发表于 2008-4-4 08:17

就为了这壳烦了一通宵了..如果楼主可以提供下重点那是最好了
页: [1] 2 3
查看完整版本: 三种方法脱ACProtect V2.0的壳