首先,想说明的是这个壳在我的PC上是可以用上一个帖子中的方法来到假的OEP的:http://www.52pojie.cn/forum.php?mod=viewthread&tid=433462&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline,可能跟系统版本有关。如果大家使用这个连接中的帖子无法来到假的OEP那么可以参考下下面的方法,对于比较难的壳,我们首先先掌握方法,脱得多了,自然而然也就会了。当然,对于抽取OEP代码的壳,我们首先要知道不同语言写出来的程序的入口点代码特征,大家可以参考:http://www.52pojie.cn/thread-421969-1-1.html
1.载入PEID
ACProtect v1.35 -> risco software Inc. & Anticrack Softw
2.载入OD,异常选项不勾选INT3选项,隐藏OD,吾爱官方现在的OD隐藏OD在strongOD里面,还是使用最后一次异常法shift+F9一次,第二次就会跑飞了
004AC000 > 60 pushad ; //入口点 004AC001 4E dec esi 004AC002 D3D6 rcl esi,cl 004AC004 4E dec esi 004AC005 66:D3E8 shr ax,cl 004AC008 4E dec esi 004AC009 8BC3 mov eax,ebx
3.落脚点,落脚后在堆栈闯窗口右键单机SE句柄,然后选择[数据窗口跟随],然后右键选中数据窗口跟随的地方下内存访问断点,然后shift+F9一次
0012FF24 004BAAF0 SE处理程序 //堆栈窗口SE句柄 004BAAF0 0424448B //数据窗口跟随 004BAB23 90 nop ; //最后一次异常法落脚点 004BAB24 64:67:8F06 0000 pop dword ptr fs:[0] 004BAB2A 83C4 04 add esp,0x4 004BAB2D 60 pushad 004BAB2E E8 00000000 call NetClean.004BAB33 004BAB33 5E pop esi 004BAB34 83EE 06 sub esi,0x6 004BAB37 B9 5B000000 mov ecx,0x5B
4.落脚点,在落脚点的位置下断点F2,然后shift+F9一次
004BAAF0 8B4424 04 mov eax,dword ptr ss:[esp+0x4] ; //落脚点 004BAAF4 8B4C24 0C mov ecx,dword ptr ss:[esp+0xC] 004BAAF8 FF81 B8000000 inc dword ptr ds:[ecx+0xB8] 004BAAFE 8B00 mov eax,dword ptr ds:[eax] 004BAB00 2D 03000080 sub eax,0x80000003 004BAB05 75 12 jnz short NetClean.004BAB19 004BAB07 90 nop
5.落脚点,在落脚点的位置同样下断点F2然后shift+F9一次
004BAB4E 8B048E mov eax,dword ptr ds:[esi+ecx*4] ; //落脚点 004BAB51 8B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+0> 004BAB55 03C3 add eax,ebx 004BAB57 C1C8 0E ror eax,0xE 004BAB5A 2BC2 sub eax,edx 004BAB5C 81EA D41CF55C sub edx,0x5CF51CD4
6.落脚点,落脚后先清除两个F2断点,一个内存访问断点,然后找到下面最近的retn,F4运行到指定位置。
004BAB62 89048E mov dword ptr ds:[esi+ecx*4],eax ; //落脚点 004BAB65 49 dec ecx 004BAB66 ^ EB E1 jmp short NetClean.004BAB49 004BAB68 61 popad 004BAB69 61 popad 004BAB6A C3 retn ; //F4 004BAB6B 0000 add byte ptr ds:[eax],al
7.到这里后就是脱壳的最佳时机了(如果想要看看假的OEP位置可以按照上一篇的脱壳法到内存界面401000下断点shift+F9运行过去看下).我们在命令行输入”d 12ffc0”,据ximo大神讲,这是ACProtect壳的死穴,记着就好。输入完命令后回车,在数据窗口第一行下硬件断点,然后shift+F9运行一次(我在我的PC上下硬件断点程序会跑飞,我的是win7–32,悲催。还是老老实实用XP吧)
0012FFC0 00000000 //数据窗口第一行
8.落脚点的位置就是被偷取代码的第一行,一共被偷取了三行代码,使用二进制把它复制出来
004C9B31 55 push ebp ; //被偷取代码1 004C9B32 8BEC mov ebp,esp ; //被偷取代码2 004C9B34 6A FF push -1 ; //被偷取代码3 004C9B36 90 nop 004C9B37 60 pushad 55 8B EC 6A FF //二进制复制一共5个字节
9.点击来到内存窗口在401000位置下断点F2然后shift+F9一次来到假的OEP,向上找5个字节(如果向上拉的时候代码乱掉了就右键分析一下代码再向上拉)
004431F9 68 D8B24400 push NetClean.0044B2D8 ; //假的OEP 004431FE 68 B4334400 push NetClean.004433B4 00443203 64:A1 00000000 mov eax,dword ptr fs:[0] 00443209 50 push eax 0044320A 64:8925 0000000>mov dword ptr fs:[0],esp 00443211 83EC 68 sub esp,0x68
10.如下,找到5个字节后选中并右键使用二进制粘贴
004431F4 8C db 8C ; //第1个字节 004431F5 . C3 retn ; //第2个字节 004431F6 49 db 49 ; //第3个字节 004431F7 2E db 2E ; //第4个字节 004431F8 79 db 79 ; //第5个字节 004431F9 . 68 D8B24400 push NetClean.0044B2D8 ; //假的OEP 004431FE . 68 B4334400 push NetClean.004433B4 SE 处理程序安装 00443203 . 64:A1 00000000 mov eax,dword ptr fs:[0] 00443209 . 50 push eax 0044320A . 64:8925 0000000>mov dword ptr fs:[0],esp 00443211 . 83EC 68 sub esp,68
11.在新的OEP位置右键新建EIP,然后可以先进行一下脱壳,当然脱壳后的程序是不能运行的。
004431F4 55 push ebp ; //此处新建EIP 004431F5 8BEC mov ebp,esp 004431F7 6A FF push -0x1 004431F9 . 68 D8B24400 push NetClean.0044B2D8 ; //假的OEP 004431FE . 68 B4334400 push NetClean.004433B4 处理程序安装 00443203 . 64:A1 0000000>mov eax,dword ptr fs:[0] 00443209 . 50 push eax 0044320A . 64:8925 00000>mov dword ptr fs:[0],esp 00443211 . 83EC 68 sub esp,0x68
12.OD载入已脱壳的程序,先去到原脱壳程序的入口点(可以使用PEID查看一下未脱壳程序的入口点然后在OD中跟随一下),然后把被抽取的三行代码改到入口点的三行代码中,第四行改为一个无条件跳转”jmp 00ff31f4”,跳转到我们新建EIP的那个地址如下图(可能是系统不同,所以改好后显示的代码跟XP下不一样,还是要用XP脱壳才行):
- 修改前:
004AC000 > $ 60 pushad ; //入口点 004AC001 . 4E dec esi 004AC002 . D3D6 rcl esi,cl 004AC004 . 4E dec esi 004AC005 . 66:D3E8 shr ax,cl 004AC008 . 4E dec esi 004AC009 . 8BC3 mov eax,ebx
- 修改后
004AC000 > 55 push ebp ; //入口点 004AC001 8BEC mov ebp,esp 004AC003 6A FF push -0x1 004AC005 - E9 EA71F9FF jmp NetClean.004431F4 ;//无条件跳转 004AC00A C3 retn 004AC00B . 48 dec eax
13.修改完成后选中修改的几行代码,然后右键–复制到可执行文件–选择,在新出现的窗口再右键–保存文件,保存到一个路径下。然后使用loadPE把保存好的文件的入口点改为和未脱壳程序一样的入口点。就可以正常运行了。
14.运行查壳
运行OK,查壳:UnKnow 查壳虽然好像还是有壳的样子,但是其实已经脱掉了。