论坛: 编程破解 标题: [转帖]三种方法脱ACProtectV2.0的壳 复制本贴地址    
作者: yongmin [yongmin]    论坛用户   登录
作者:bhcjl
转贴自:一蓑烟雨
【破文标题】三种方法脱ACProtect V2.0的壳
【破文作者】[PYG]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 E0D125C4    xor ebx,C425D1E0

继续F9.大概15次后,停在下面了
010127DF    896C24 10      mov dword ptr ss:[esp+10],ebp 15次后,再F9,程序就运行起来了,停在这里。F8单步向下走
010127E3    8D6C24 10        lea ebp,dword ptr ss:[esp+10]
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:[ebp-8]
010127EF    8965 E8          mov dword ptr ss:[ebp-18],esp
010127F2    50              push eax
010127F3    8B45 FC          mov eax,dword ptr ss:[ebp-4]
010127F6    C745 FC FFFFFFFF mov dword ptr ss:[ebp-4],-1
010127FD    8945 F8          mov dword ptr ss:[ebp-8],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 E0150001    push 原Calc.010015E0
0101247C    .  E8 47030000    call 原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打开内存镜像

01001000  00013000 (77824.)  加壳后Ca 01000000  后在这里F2下断                .text          code                           
01014000  00002000 (8192.)    加壳后Ca 01000000  先这里F2下断      .data          code,data                       
01016000  00009000 (36864.)  加壳后Ca 01000000          .rsrc          code,resources                 
0101F000  0001E000 (122880.)  加壳后Ca 01000000                    .perplex      code,imports                   
65D20000  00001000 (4096.)    USP10    65D20000 (自身)                          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 20100001    mov edi,dword ptr ds:[1001020]  ; KERNEL32.GetModuleHandleA
0101248A    FFD7            call edi
0101248C    66:8138 4D5A    cmp word ptr ds:[eax],5A4D
01012491    75 1F            jnz short 加壳后Ca.010124B2
01012493    8B48 3C          mov ecx,dword ptr ds:[eax+3C]
01012496    03C8            add ecx,eax
01012498    8139 50450000    cmp dword ptr ds:[ecx],4550
0101249E    75 12            jnz short 加壳后Ca.010124B2
010124A0    0FB741 18        movzx eax,word ptr ds:[ecx+18]
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:[ebp-1C],ebx
010124B5    EB 27            jmp short 加壳后Ca.010124DE
010124B7    83B9 84000000 0E cmp dword ptr ds:[ecx+84],0E
010124BE  ^ 76 F2            jbe short 加壳后Ca.010124B2
010124C0    33C0            xor eax,eax
010124C2    3999 F8000000    cmp dword ptr ds:[ecx+F8],ebx
010124C8    EB 0E            jmp short 加壳后Ca.010124D8
010124CA    8379 74 0E      cmp dword ptr ds:[ecx+74],0E
010124CE  ^ 76 E2            jbe short 加壳后Ca.010124B2
010124D0    33C0            xor eax,eax
010124D2    3999 E8000000    cmp dword ptr ds:[ecx+E8],ebx
010124D8    0F95C0          setne al
010124DB    8945 E4          mov dword ptr ss:[ebp-1C],eax
010124DE    895D FC          mov dword ptr ss:[ebp-4],ebx
010124E1    6A 02            push 2
010124E3    FF15 0C120001    call dword ptr ds:[100120C]      ; msvcrt.__set_app_type
010124E9    59              pop ecx
010124EA    830D 10500101 FF or dword ptr ds:[1015010],FFFFFF>; 三次内存镜像后停在这里。向上看
010124F1    830D 14500101 FF or dword ptr ds:[1015014],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 20100001    mov edi,dword ptr ds:[1001020]  ; KERNEL32.GetModuleHandleA
0101248A    FFD7            call edi
0101248C    66:8138 4D5A    cmp word ptr ds:[eax],5A4D
01012491    75 1F            jnz short 加壳后Ca.010124B2
01012493    8B48 3C          mov ecx,dword ptr ds:[eax+3C]
01012496    03C8            add ecx,eax
01012498    8139 50450000    cmp dword ptr ds:[ecx],4550
0101249E    75 12            jnz short 加壳后Ca.010124B2
010124A0    0FB741 18        movzx eax,word ptr ds:[ecx+18]
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:[ebp-1C],ebx
010124B5    EB 27            jmp short 加壳后Ca.010124DE
010124B7    83B9 84000000 0E cmp dword ptr ds:[ecx+84],0E
010124BE  ^ 76 F2            jbe short 加壳后Ca.010124B2
010124C0    33C0            xor eax,eax
010124C2    3999 F8000000    cmp dword ptr ds:[ecx+F8],ebx
010124C8    EB 0E            jmp short 加壳后Ca.010124D8
010124CA    8379 74 0E      cmp dword ptr ds:[ecx+74],0E
010124CE  ^ 76 E2            jbe short 加壳后Ca.010124B2
010124D0    33C0            xor eax,eax
010124D2    3999 E8000000    cmp dword ptr ds:[ecx+E8],ebx
010124D8    0F95C0          setne al
010124DB    8945 E4          mov dword ptr ss:[ebp-1C],eax
010124DE    895D FC          mov dword ptr ss:[ebp-4],ebx
010124E1    6A 02            push 2                          ; 看到下面了吧。我们向上看
010124E3    FF15 0C120001    call dword ptr ds:[100120C]      ; msvcrt.__set_app_type
010124E9    59              pop ecx

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


[此贴被 yongmin(yongmin) 在 04月01日10时41分 编辑过]

地主 发表时间: 08-04-01 10:35

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号