Jian丶ylt 发表于 2015-11-16 00:58

手脱ACProtect V1.4X(有Stolen Code)

本帖最后由 Jian丶ylt 于 2015-11-16 01:03 编辑


1.载入PEID

    ACProtect V1.4X -> risco
   
首先需要说明的是,这个壳被偷取的代码非常多,如果去找的话会比较麻烦,所以我们换一种另类的方法,不脱壳也可以使用资源修改器对程序进行修改。先来看下被偷取的代码

0040A41E >/$55            push ebp
0040A41F|.8BEC          mov ebp,esp
0040A421|.6A FF         push -1
0040A423|.68 C8CB4000   push 跑跑排行.0040CBC8
0040A428|.68 A4A54000   push <jmp.&MSVCRT._except_handler3>      ;Entry address; SE handler installation
0040A42D|.64:A1 0000000>mov eax,dword ptr fs:
0040A433|.50            push eax
0040A434|.64:8925 00000>mov dword ptr fs:,esp
0040A43B|.83EC 68       sub esp,68
0040A43E|.53            push ebx
0040A43F|.56            push esi
0040A440|.57            push edi
0040A441|.8965 E8       mov ,esp
0040A444|.33DB          xor ebx,ebx
0040A446|.895D FC       mov ,ebx
0040A449|.6A 02         push 2
0040A44B|.FF15 BCC24000 call dword ptr ds:[<&MSVCRT.__set_app_ty>;msvcrt.__set_app_type
0040A451|.59            pop ecx
0040A452|.830D F0FF4000>or dword ptr ds:,FFFFFFFF
0040A459|.830D F4FF4000>or dword ptr ds:,FFFFFFFF
0040A460|.FF15 C0C24000 call dword ptr ds:[<&MSVCRT.__p__fmode>] ;msvcrt.__p__fmode
0040A466|.8B0D D0FF4000 mov ecx,dword ptr ds:
0040A46C|.8908          mov dword ptr ds:,ecx
0040A46E|.FF15 C4C24000 call dword ptr ds:[<&MSVCRT.__p__commode>;msvcrt.__p__commode
0040A474|.8B0D CCFF4000 mov ecx,dword ptr ds:
0040A47A|.8908          mov dword ptr ds:,ecx
0040A47C|.A1 C8C24000   mov eax,dword ptr ds:[<&MSVCRT._adjust_f>
0040A481|.8B00          mov eax,dword ptr ds:

2.载入OD,不勾选Int3异常,然后shift+F9运行一次,也就是最后一次异常,需要注意的是,这个壳对OD检测比较严格,所以可能需要多试几次才能成功。这个大家自己去摸索

3.最后一次异常的落脚点,落脚后堆栈窗口右键点SE句柄---数据窗口跟随,然后数据窗口下内存访问断点,然后shift+F9运行一次

0043D74D    CD 01         int 0x1                                  ; //F9落脚点
0043D74F    40            inc eax
0043D750    40            inc eax
0043D751    0BC0            or eax,eax
0043D753    75 05         jnz short 跑跑排行.0043D75A
0043D755    90            nop


0012FEC8   0043D731SE处理程序


0043D7310C245C8B            //数据窗口跟随

4.落脚后,在落脚点下F2断点,然后shift+F9运行一次

0043D731    8B5C24 0C       mov ebx,dword ptr ss:         ; //落脚点
0043D735    8383 B8000000 0>add dword ptr ds:,0x2
0043D73C    33C0            xor eax,eax
0043D73E    C3            retn
0043D73F    64:67:FF36 0000 push dword ptr fs:
0043D745    64:67:8926 0000 mov dword ptr fs:,esp
0043D74B    33C0            xor eax,eax

5.落脚后再次再落脚点下F2断点,然后shift+F9运行一次

0043D781    8B048E          mov eax,dword ptr ds:         ; //落脚点
0043D784    8B5C8E 04       mov ebx,dword ptr ds:
0043D788    2BC3            sub eax,ebx
0043D78A    C1C0 06         rol eax,0x6
0043D78D    03C2            add eax,edx
0043D78F    81F2 80657CA3   xor edx,0xA37C6580

6.然后来到这里,先清除所有断点(两个F2断点,一个内存访问断点),然后F4运行到retn位置

0043D795    89048E          mov dword ptr ds:,eax         ; //落脚点
0043D798    49            dec ecx
0043D799^ EB E1         jmp short 跑跑排行.0043D77C
0043D79B    61            popad
0043D79C    61            popad
0043D79D    C3            retn                                     ; //F4
0043D79E    0000            add byte ptr ds:,al
0043D7A0    0000            add byte ptr ds:,al

7.打开内存窗口在401000位置下内存断点然后shift+F9运行一次

Memory map, 条目 16
地址=00401000
大小=0000B000 (45056.)
属主=跑跑排行 00400000
区段=.text
包含=代码
类型=Imag 01001002
访问=R
初始访问=RWE

8.来到假的OEP

0040A483    A3 ECFF4000   mov dword ptr ds:,eax            ; //假的OEP
0040A488    E8 16010000   call 跑跑排行.0040A5A3
0040A48D    391D 90FE4000   cmp dword ptr ds:,ebx
0040A493    75 0C         jnz short 跑跑排行.0040A4A1
0040A495    68 A0A54000   push 跑跑排行.0040A5A0
0040A49A    FF15 CCC24000   call dword ptr ds:               ; msvcrt.__setusermatherr
0040A4A0    59            pop ecx
0040A4A1    E8 E8000000   call 跑跑排行.0040A58E
0040A4A6    68 1CF04000   push 跑跑排行.0040F01C
0040A4AB    68 18F04000   push 跑跑排行.0040F018

9.重新载入要脱壳的程序,入口点是一个pushad入栈,下一行使用ESP运行到最后一次异常,正常情况应该是第16次就跑飞了,15次是一个大跳转,所以我们运行到第14次就可以了

0042C000 >60            pushad                                 ; //入口点
0042C001    E8 01000000   call 跑跑排行.0042C007                     ; //ESP
0042C006- 79 83         jns short 跑跑排行.0042BF8B
0042C008    04 24         add al,0x24
0042C00A    06            push es
0042C00B    C3            retn
0042C00C    E8 01000000   call 跑跑排行.0042C012

10.程序落脚点应该是这个位置,我们在这个地方使用LoadPE+ImoprtREC进行脱壳,需要注意的是,使用ImoprtREC修复过程中,我们首先需要填入的地址应该是假的OEP地址0040A483-00400000也就是A483(这个原因大家都应该懂得),然后修复完成后先不急着转存,把OEP地址换成ESP最后一次异常落脚点的地址,也就是41E4D(减去00400000基址的地址)。然后再进行转存,其实这样是没有把壳脱掉的,不过已经达到我们的目的了,可以使用资源修改软件对程序进行修改破解了。所以再实在不好脱壳的时候考虑下这种方式也是蛮好的

00441E4D    64:A1 00000000mov eax,dword ptr fs:               ; //在这里脱壳
00441E53    8905 39CA4200   mov dword ptr ds:,eax         
00441E59    FF35 39CA4200   push dword ptr ds:
00441E5F    8F05 71CA4200   pop dword ptr ds:            
00441E65    FF35 71CA4200   push dword ptr ds:
00441E6B    891C24          mov dword ptr ss:,ebx
00441E6E    890424          mov dword ptr ss:,eax               















Jian丶ylt 发表于 2015-11-16 15:20

dotaSven 发表于 2015-11-16 15:17
我也是看的ximo脱壳教程,多谢楼主分享

我帖子里的例子都是拿的他的视频里的样品,自己对照一下就行

songxin 发表于 2015-11-16 02:13

感谢发布原创作品

一生情独醉 发表于 2015-11-16 08:55

感谢分享学习学习

FannyKong 发表于 2015-11-16 09:05

多谢楼主的分享!!!

kay_凯 发表于 2015-11-16 09:08

好多看不懂的样子。。。。

huank_dmy 发表于 2015-11-16 09:22

新学习,看不懂,只得慢慢磨了{:1_903:}

wax126 发表于 2015-11-16 09:32

虽然看不懂,支持下楼主

Ink 发表于 2015-11-16 14:10

上个程序样本

Jian丶ylt 发表于 2015-11-16 14:11

Ink 发表于 2015-11-16 14:10
上个程序样本

都是ximo脱壳教程里的样本

dotaSven 发表于 2015-11-16 15:17

我也是看的ximo脱壳教程,多谢楼主分享
页: [1] 2
查看完整版本: 手脱ACProtect V1.4X(有Stolen Code)