脱svkp壳的基本流程(刚学破解。发现这个壳太变态了。需要好好学学。。)
********************************************************************************************
一、避开IAT加密,处理输入表
忽略所有异常选项,隐藏OD!
0040C000 n> 60 pushad /入口,注意此时的ESP=12FFC4
0040C001 E8 00000000 call noped.0040C006
0040C006 5D pop ebp
0040C007 81ED 06000000 sub ebp,6
命令行下断:bp GetModuleHandleA+5,Shift+F9 通过所有异常,断下后取消断点,Alt+F9返回!
77E5AD8B /0F84 37010000 je kernel32.77E5AEC8 //断在这里
77E5AD91 |FF7424 04 push dword ptr ss:[esp+4]
77E5AD95 |E8 F8050000 call kernel32.77E5B392
77E5AD9A |85C0 test eax,eax
77E5AD9C |74 08 je short kernel32.77E5ADA6
0FEE018F E8 02000000 call 0FEE0196 //返回到这里
0FEE0194 CD20 83042408 vxdcall 8240483
0FEE019A C3 retn
0FEE019B E8 EB020FE8 call F7FD048B
********************************************************************************************
1、Ctrl+F搜索特征码,搜索所有命令:mov dword ptr ds:[edi],eax
我这里搜索到了3处,为了跳过IAT加密,我们需要选择第3个!
0FED3B68 mov dword ptr ds:[edi],eax
0FED5ED2 mov dword ptr ds:[edi],eax
0FEE2B9C mov dword ptr ds:[edi],eax //双击来到代码处!
0FEE2B9C 8907 mov dword ptr ds:[edi],eax //来到这里!我们用SVKP 1.32插件去下花指令!
0FEE2B9E 7C 03 jl short 0FEE2BA3
0FEE2BA0 EB 03 jmp short 0FEE2BA5
0FEE2BA2 - E9 74FB61E8 jmp F850271B
0FEE2BA7 0100 add dword ptr ds:[eax],eax
0FEE2B9C 8907 mov dword ptr ds:[edi],eax //去花指令之后是这样的
0FEE2B9E 7C 03 jl short 0FEE2BA3
0FEE2BA0 90 nop
0FEE2BA1 90 nop
0FEE2BA2 90 nop
0FEE2BA3 90 nop
0FEE2BA4 90 nop
0FEE2BA5 61 popad
0FEE2BA6 E8 01000000 call 0FEE2BAC
0FEE2BAB 9A 83C40490 9090 call far 9090:9004C483
现在我们要汇编下!
0FEE2B9C 61 popad
0FEE2B9D 8907 mov dword ptr ds:[edi],eax
0FEE2B9F 7C 02 jl short 0FEE2BA3
0FEE2BA1 90 nop
0FEE2BA2 90 nop
0FEE2BA3 90 nop
0FEE2BA4 90 nop
0FEE2BA5 90 nop
0FEE2BA6 E8 01000000 call 0FEE2BAC
0FEE2BAB 9A 83C40490 9090 call far 9090:9004C483
方法即是:把popad和mov dword ptr ds:[edi],eax翻转下,nop掉原先的popad!
********************************************************************************************
2、Ctrl+F搜索特征码,搜索所有命令:
cmp dword ptr ds:[ebx],251097CC //用来处理特殊加密
0FEE0F64 813B CC971025 cmp dword ptr ds:[ebx],251097CC //F2,Shift+F9到这,然后F8(见CALL就F7进),有回跳的就让它回
跳!
0FEE0F6A EB 03 jmp short 0FEE0F6F //改jmp 0FEE0FFA
0FEE0FF4 /0F84 EB300000 je 0FEE40E5 //找到这里!
0FEE0FFA |60 pushad ★这是我们想要的
继续bp GetModuleHandleA+5,Shift+F9 通过所有异常,断下后取消断点,Alt+F9返回!
********************************************************************************************
二、到达FOEP,脱壳修复!
接上!
下命令行断点hr 0012FFB0,Shift+F9中断3次!
0FF41D30 60 pushad //第一次
0FF41D31 E8 03000000 call 0FF41D39
0FF41D36 D2EB shr bl,cl
0FF41D38 0A58 EB or bl,byte ptr ds:[eax-15]
0FF41D44 E8 01000000 call 0FF41D4A //第二次
0FF41D49 E8 E8020000 call 0FF42036
0FF41D4E 00CD add ch,cl
0FF41D50 2083 04240B83 and byte ptr ds:[ebx+830B2404],al
0FF41DEC E8 00000000 call 0FF41DF1 //第三次
0FF41DF1 5D pop ebp
0FF41DF2 E8 02000000 call 0FF41DF9
0FF41DF7 CD20 83042408 vxdcall 8240483
0FF41DFD C3 retn
0FF41DFE E8 83ED05EB call FAFA0B86
取消断点!!!
命令行下tc ebp==12FFC0(12FFC0=12FFC4-4) //12FFC4是壳入口处的ESP值
004010CF 83EC 44 sub esp,44 //断在这里
004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA
004010D9 8BF0 mov esi,eax
004010DB 8A00 mov al,byte ptr ds:[eax]
右键--分析代码,避免我们向上翻看的时候代码混乱!
004010CC /. 55 push ebp //OEP,呵呵~~
004010CD |. 8BEC mov ebp,esp
004010CF |. 83EC 44 sub esp,44
004010D2 |. 56 push esi
004010D3 |. FF15 E4634000 call dword ptr ds:[4063E4] ; [GetCommandLineA
004010D9 |. 8BF0 mov esi,eax
看来是没有被抽取字节了。。。
现在用LordPE纠正大小DUMP!!
打开IR 1.6,OEP填10CC--自动搜索IAT--获取输入表--有1个无效
************************
众所周知:
SVKP的加密函数一般是GetProcAddress、GetModuleHandleA、GetCommandLineA、 ExitProcess等
大家再看看入口已经有kernel32.GetCommandLineA,而且IR 已经把ExitProcess识别出来了。。。那就只有前2种了
************************
那么我们就来试一试了。。。结果只有是GetModuleHandleA才可以运行。。。
********************************************************************************************
后记:
从上面的过程可以看出,脱某种相同壳不同的程序的情况也是不一样的
除了有某些固定的套路之外,我们还需要灵活的去应用。。。。。。。
从而总结出经验。。。。以备后用!