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