1.载入PEID
ACProtect v1.35 -> risco software Inc. & Anticrack Soft
2.载入OD,需要注意的是,异常选项除了[内存访问异常]外其他全部勾选上,然后shift+F9运行至最后一次异常,是1次之后。第二次程序就跑飞了
00436000 > 60 pushad ; //入口 00436001 7C 03 jl short QQ个性签.00436006 00436003 7D 01 jge short QQ个性签.00436006 00436005 71 0B jno short QQ个性签.00436012 00436007 C2 66C1 retn 0xC166 0043600A D29E FC4566D3 rcr byte ptr ds:[esi-0x2C99BA04],> 00436010 D27403 75 sal byte ptr ds:[ebx+eax+0x75],cl 00436014 0177 66 add dword ptr ds:[edi+0x66],esi
3.落脚点,落脚后右键点堆栈窗口SE句柄—数据窗口跟随—数据窗口第一行下内存访问断点然后shift+F9
00447B1F CD 01 int 0x1 ; //落脚点 00447B21 40 inc eax 00447B22 40 inc eax 00447B23 0BC0 or eax,eax 00447B25 75 05 jnz short QQ个性签.00447B2C 00447B27 90 nop 00447B28 90 nop 0012FF44 00447B03 SE处理程序 //堆栈窗口 00447B03 0C245C8B //数据窗口第一行
4.落脚点,在落脚点下F2断点,然后shift+F9
00447B03 8B5C24 0C mov ebx,dword ptr ss:[esp+0xC] ; //落脚点 00447B07 8383 B8000000 0>add dword ptr ds:[ebx+0xB8],0x2 00447B0E 33C0 xor eax,eax 00447B10 C3 retn 00447B11 64:67:FF36 0000 push dword ptr fs:[0] 00447B17 64:67:8926 0000 mov dword ptr fs:[0],esp
5.落脚点,继续在这里下F2断点,然后shift+F9运行
00447B53 8B048E mov eax,dword ptr ds:[esi+ecx*4] ; //落脚点 00447B56 8B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+0> 00447B5A 2BC3 sub eax,ebx 00447B5C C1C0 07 rol eax,0x7 00447B5F 33C2 xor eax,edx 00447B61 81C2 4B3DF129 add edx,0x29F13D4B
6.落脚点,先清除刚刚下的2个F2断点和1个内存访问断点,然后在最近的retn处F4
00447B67 89048E mov dword ptr ds:[esi+ecx*4],eax ; //落脚点 00447B6A 49 dec ecx 00447B6B ^ EB E1 jmp short QQ个性签.00447B4E 00447B6D 61 popad 00447B6E 61 popad 00447B6F C3 retn ; //F4 00447B70 0000 add byte ptr ds:[eax],al
7.在无StolenCode的帖子中已经说过,正常情况下接下来是在内存窗口的401000处下段然后shift+F9运行就可以到OEP了,但是我们这个壳你这样操作后会发现OEP处的代码好像不对劲,因为被抽取过了,我们要做的是点[调试]按钮—设置条件,或者使用快捷键ctrl+T,在弹出来的界面勾选最下面一个然后输入被偷取的代码,我使用的ximo教程里的壳,被偷取的代码为”push ebp”,输入完后点确定,然后使用快捷键ctrl+F11跟踪步入(或者点[调试]–跟踪步入)
8.找到了我们被偷取的代码,在这个壳中被偷取了三行代码,选中这三行,二进制复制
004254C8 61 popad 004254C9 55 push ebp ; //被偷取1 004254CA 8BEC mov ebp,esp ; //被偷取2 004254CC 83EC 44 sub esp,0x44 ; //被偷取3 004254CF 60 pushad 004254D0 60 pushad 55 8B EC 83 EC 44 //二进制复制出来的,一共6个字节
9.然后到内存窗口,在401000处下断F2,然后shift+F9运行来到假的OEP,向上找6个字节(看代码第二列,两位为一个字节),然后右键–二进制—使用nop填充,填充完毕后再数6个字节,然后使用二进制粘贴
004010D2 56 push esi 004010D3 FF15 E4634000 call dword ptr ds:[0x4063E4] ; //假的OEP 004010D9 8BF0 mov esi,eax 004010DB 8A00 mov al,byte ptr ds:[eax] 004010DD 3C 22 cmp al,0x22 004010DF 75 1B jnz short notepad9.004010FC 004010E1 56 push esi
10.此时OEP已经补充完整了,接着右键点’push ebp’哪一行—点[此处新建EIP]然后就可以脱壳了,脱壳注意[重建输出表]这一项不勾选,脱壳后使用ImportREC修复,我在脱壳的过程中出现过修复失败的情况,这种情况我一般都是用ImportREC上修复的插件或者别的版本的ImportREC来修复,可以都试试。
004010CC 55 push ebp 004010CD 8BEC mov ebp,esp 004010CF 83EC 44 sub esp,0x44 004010D2 56 push esi 004010D3 FF15 E4634000 call dword ptr ds:[0x4063E4] ; notepad9.0040D1BA 004010D9 8BF0 mov esi,eax ; kernel32.BaseThreadInitThunk 004010DB 8A00 mov al,byte ptr ds:[eax] 004010DD 3C 22 cmp al,0x22 004010DF 75 1B jnz short notepad9.004010FC 004010E1 56 push esi
11.运行查壳
运行OK,查壳:Microsoft Visual C++ v6.0 SPx