手脱ASProtect v1.23 RC1(有Stolen Code)之以壳解壳

1.载入PEID

ASProtect v1.23 RC1

2.载入OD,不勾选内存访问异常,其他异常全部勾选

00401000 >  68 01C06D00     push SoWorker.006DC001                   ; //入口点
00401005    E8 01000000     call SoWorker.0040100B
0040100A    C3              retn
0040100B    C3              retn
0040100C    74 23           je short SoWorker.00401031
0040100E    C039 74         sar byte ptr ds:[ecx],74
00401011    0FD19CA4 0599E0>psrlw mm3,qword ptr ss:[esp+CFE09905]
00401019    AA              stos byte ptr es:[edi]
 

3.最后一次异常法运行到最后一次,应该是第26次,第27次跑飞

00C339EC    3100            xor dword ptr ds:[eax],eax               ; //最后一次异常法落脚点
00C339EE    64:8F05 0000000>pop dword ptr fs:[0]
00C339F5    58              pop eax
00C339F6    833D B07EC300 0>cmp dword ptr ds:[C37EB0],0
00C339FD    74 14           je short 00C33A13
00C339FF    6A 0C           push 0C
00C33A01    B9 B07EC300     mov ecx,0C37EB0
00C33A06    8D45 F8         lea eax,dword ptr ss:[ebp-8]
00C33A09    BA 04000000     mov edx,4
00C33A0E    E8 2DD1FFFF     call 00C30B40
00C33A13    FF75 FC         push dword ptr ss:[ebp-4]
00C33A16    FF75 F8         push dword ptr ss:[ebp-8]
00C33A19    8B45 F4         mov eax,dword ptr ss:[ebp-C]
00C33A1C    8338 00         cmp dword ptr ds:[eax],0
00C33A1F    74 02           je short 00C33A23
00C33A21    FF30            push dword ptr ds:[eax]
00C33A23    FF75 F0         push dword ptr ss:[ebp-10]
00C33A26    FF75 EC         push dword ptr ss:[ebp-14]
00C33A29    C3              retn                                     ; //运行到最近的retn
00C33A2A    5F              pop edi
 

4.先记录假的OEP,运行到最近的retn处(不能使用F4,用F2,SHIFT+F9,F2)后打开内存窗口在00401000处下断然后shift+F9运行一次来到假的OEP

004F27CF    FF15 9CC25200   call dword ptr ds:[52C29C]               ; //假的OEP
004F27D5    33D2            xor edx,edx
004F27D7    8AD4            mov dl,ah
004F27D9    8915 34306900   mov dword ptr ds:[693034],edx
004F27DF    8BC8            mov ecx,eax
004F27E1    81E1 FF000000   and ecx,0FF
004F27E7    890D 30306900   mov dword ptr ds:[693030],ecx
004F27ED    C1E1 08         shl ecx,8
004F27F0    03CA            add ecx,edx
004F27F2    890D 2C306900   mov dword ptr ds:[69302C],ecx
 

5.重新载入程序,运行步骤1-3,让程序落在最近的retn处,此时查看堆栈窗口,在命令行下硬件断点,地址填堆栈窗口第四行(程序名下的第二行)的地址或者是值都可以,上一个教程是使用的值,这个教程使用下地址,下硬件断点”hr 0012ff68”,然后shift+F9运行一次

0012FF5C   00C45340
0012FF60   00400000  SoWorker.00400000
0012FF64   E3DE7228
0012FF68   0012FFA4
0012FF6C   00C20000
 

6.落脚点在这个位置,然后删除硬件断点单步跟两步

00C454BB   /EB 44           jmp short 00C45501                       ; //落脚点
00C454BD   |EB 01           jmp short 00C454C0
00C454BF   |9A 51579CFC BF0>call far 00BF:FC9C5751
00C454C6   |0000            add byte ptr ds:[eax],al
00C454C8   |00B9 00000000   add byte ptr ds:[ecx],bh
00C454CE   |F3:AA           rep stos byte ptr es:[edi]
00C454D0   |9D              popfd
00C454D1   |5F              pop edi
00C454D2   |59              pop ecx
 

7.单步两步之后程序应该是运行到了注释的地方,按照ximo大神视频中的讲解,这里应该是最佳以壳脱壳的位置。

00C46519    03C3            add eax,ebx
00C4651B    BB A2000000     mov ebx,0A2                              ; //以壳脱壳最佳位置
00C46520    0BDB            or ebx,ebx
00C46522    75 07           jnz short 00C4652B
00C46524    894424 1C       mov dword ptr ss:[esp+1C],eax
00C46528    61              popad

8.到了这里之后,我们就可以使用loadPE先完整转存下来,然后查看程序现在运行到位置的地址,是00C4651B,我们使用loadPE部分转存,区段就选择包含了这个地址的区段。也就是00C40000这个区段,把这个区段给转存下来先,这里需要注意的是不同的PC或者是系统可能显示的地址是不同的,所以不要太过于死板。一定要按照视频教程走,其实你仔细看会发现我的教程里的地址跟ximo大神视频教程里的地址是不一样的。不过这并不影响。

9.完整转存和区域转存都执行完毕之后我们使用loadPE载入完整转存的文件,也就是点[PE编辑器]按钮,选中完整转存的那个文件;然后点击[区段]按钮,在最后一个区段右键—从磁盘载入—选中我们不分转存的那个区段。载入后我们右键选中我们载入的这个区段,然后点[编辑区段],名称我们可以随意填,虚拟地址选项输入添加区段的起始地址-基质,也就是00C40000-00400000=00840000。填完之后点确定然后保存

10.执行完上面的步骤之后我们使用需要给添加好区段的程序重建PE,使用loadPE即可。这里要说明一下,重建选项只勾选[使PE有效]这一个选项即可,其他选项都不勾选。

11.重建PE完成后我们就可以使用ImportREC进行脱壳了。脱壳地址就填假的OEP地址-基质也就是F27CF,然后进行修复,修复的时候还是使用等级1+插件进行修复。修复完毕之后先不要转存,我们需要把ImportREC上OEP地址改为最佳脱壳位置OEP-基质也就是0084651B后再进行转存。至此我们的以壳脱壳算是搞完了

12.运行查壳

运行OK,查壳:Unknown

需要说明的是我个人认为用这种方法壳应该是没有脱掉的。不过这样操作之后我们就可以使用资源编辑器对资源进行编辑修改,这样也就达到了我们的破解目的。所以壳是不是真的脱掉了我们也就不要太在意了。毕竟我们学习脱壳只是为了破解嘛。