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:[0] 0040A433 |. 50 push eax 0040A434 |. 64:8925 00000>mov dword ptr fs:[0],esp 0040A43B |. 83EC 68 sub esp,68 0040A43E |. 53 push ebx 0040A43F |. 56 push esi 0040A440 |. 57 push edi 0040A441 |. 8965 E8 mov [local.6],esp 0040A444 |. 33DB xor ebx,ebx 0040A446 |. 895D FC mov [local.1],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:[40FFF0],FFFFFFFF 0040A459 |. 830D F4FF4000>or dword ptr ds:[40FFF4],FFFFFFFF 0040A460 |. FF15 C0C24000 call dword ptr ds:[<&MSVCRT.__p__fmode>] ; msvcrt.__p__fmode 0040A466 |. 8B0D D0FF4000 mov ecx,dword ptr ds:[40FFD0] 0040A46C |. 8908 mov dword ptr ds:[eax],ecx 0040A46E |. FF15 C4C24000 call dword ptr ds:[<&MSVCRT.__p__commode>; msvcrt.__p__commode 0040A474 |. 8B0D CCFF4000 mov ecx,dword ptr ds:[40FFCC] 0040A47A |. 8908 mov dword ptr ds:[eax],ecx 0040A47C |. A1 C8C24000 mov eax,dword ptr ds:[<&MSVCRT._adjust_f> 0040A481 |. 8B00 mov eax,dword ptr ds:[eax]
2.载入OD,异常选项不勾选INT3选项,隐藏OD,吾爱官方现在的OD隐藏OD在strongOD里面,还是使用最后一次异常法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 0043D731 SE处理程序 0043D731 0C245C8B //数据窗口跟随
4.落脚后,在落脚点下F2断点,然后shift+F9运行一次
0043D731 8B5C24 0C mov ebx,dword ptr ss:[esp+0xC] ; //落脚点 0043D735 8383 B8000000 0>add dword ptr ds:[ebx+0xB8],0x2 0043D73C 33C0 xor eax,eax 0043D73E C3 retn 0043D73F 64:67:FF36 0000 push dword ptr fs:[0] 0043D745 64:67:8926 0000 mov dword ptr fs:[0],esp 0043D74B 33C0 xor eax,eax
5.落脚后再次再落脚点下F2断点,然后shift+F9运行一次
0043D781 8B048E mov eax,dword ptr ds:[esi+ecx*4] ; //落脚点 0043D784 8B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+0x4] 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:[esi+ecx*4],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:[eax],al 0043D7A0 0000 add byte ptr ds:[eax],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:[40FFEC],eax ; //假的OEP 0040A488 E8 16010000 call 跑跑排行.0040A5A3 0040A48D 391D 90FE4000 cmp dword ptr ds:[40FE90],ebx 0040A493 75 0C jnz short 跑跑排行.0040A4A1 0040A495 68 A0A54000 push 跑跑排行.0040A5A0 0040A49A FF15 CCC24000 call dword ptr ds:[40C2CC] ; 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 00000000 mov eax,dword ptr fs:[0] ; //在这里脱壳 00441E53 8905 39CA4200 mov dword ptr ds:[0x42CA39],eax 00441E59 FF35 39CA4200 push dword ptr ds:[0x42CA39] 00441E5F 8F05 71CA4200 pop dword ptr ds:[0x42CA71] 00441E65 FF35 71CA4200 push dword ptr ds:[0x42CA71] 00441E6B 891C24 mov dword ptr ss:[esp],ebx 00441E6E 890424 mov dword ptr ss:[esp],eax
来源:https://www.cnblogs.com/JianXu/p/5158368.html