脱svkp壳的基本流程

作者在 2010-01-25 12:45:30 发布以下内容

脱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才可以运行。。。

********************************************************************************************
后记:
从上面的过程可以看出,脱某种相同壳不同的程序的情况也是不一样的
除了有某些固定的套路之外,我们还需要灵活的去应用。。。。。。。
从而总结出经验。。。。以备后用!

破解@经历 | 阅读 1385 次
文章评论,共0条
游客请输入验证码
浏览2344284次