【文章标题】: eXcalibur V1.03通用脱壳方法
【文章作者】: ayarei
【下载地址】: 自己搜索下载
【使用工具】: ollyice
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  天某群里有人问到eXcalibur V1.03的脱壳问题。因为很久没有脱过这个壳了,不过记得脱起来还是比较简单的一个壳。这个壳算是取当时众家之长逆向出来的,另外背景音乐是仙剑3的《望海潮》,都是比较好玩的东西。(不过那时候的壳现在看来难度都是很低的,就是有些比较复杂,比如SVK那个需要修很长时间stolen code)正好很久没有使用过调试工具了,也算是复习一下吧,不过感觉手生了很多,od都不会使了,哈哈。另外考虑到通用性原因,很多地方都不是下断中断,因为由于选择项导致部分代码可能并不执行。
  
  Ollydbg载入某VC加壳程序,HideOD插件隐藏一下ollydbg:

代码:
  00405000 > /E9 00000000     jmp     00405005
  下断BP GetForegroundWindow,F9中断后取消断点,Alt+F9返回:
代码:
  003D021B    8985 A4394000   mov     dword ptr [ebp+4039A4], eax
  003D0221    E8 0D000000     call    003D0233
  003D0226    45              inc     ebp
  003D0227    6E              outs    dx, byte ptr es:[edi]
  003D0228    61              popad
  003D0229    626C65 57       bound   ebp, qword ptr [ebp+57]
  003D022D    696E 64 6F77005>imul    ebp, dword ptr [esi+64], 5600776>
  003D0234    FFD7            call    edi
  003D0236    8985 94394000   mov     dword ptr [ebp+403994], eax
  003D023C    6A 00           push    0           //这里改成push   1
  003D023E    FFB5 A4394000   push    dword ptr [ebp+4039A4]
  003D0244    FFD0            call    eax
  然后Ctrl+B,搜索E8 5E,找到:
代码:
  003D02EB    FF15 12544000   call    dword ptr [<&KERNEL32.VirtualAll>; kernel32.VirtualAlloc
  003D02F1    FC              cld
  003D02F2    8BF8            mov     edi, eax
  003D02F4    8BB5 3C374000   mov     esi, dword ptr [ebp+40373C]
  003D02FA    46              inc     esi
  003D02FB    B9 10000000     mov     ecx, 10
  003D0300    E8 5E000000     call    003D0363        //找到这里
  003D0305    85C0            test    eax, eax
  003D0307    74 07           je      short 003D0310 //改成jmp short 003D0310
  003D0309    E8 08000000     call    003D0316        //这里处理Stolen Call
  003D030E  ^ E2 F0           loopd   short 003D0300
  003D0310    61              popad
  003D0311    E9 BE000000     jmp     003D03D4
  修改之后下断BP GetCurrentThread,中断之后取消断点,Alt+F9返回:
代码:
  003D03E4    6A 00           push    0
  003D03E6    6A 00           push    0
  003D03E8    6A 11           push    11
  003D03EA    50              push    eax
  003D03EB    FFD7            call    edi     //这里nop掉
  003D03ED    BE A8250000     mov     esi, 25A8
  003D03F2    85F6            test    esi, esi
  003D03F4    0F84 CA050000   je      003D09C4   //到003D09C4上下个断
  然后还是Ctrl+B,搜索61 80,找到:
代码:
  003D0975    61              popad
  003D0976    3385 E0394000   xor     eax, dword ptr [ebp+4039E0]
  003D097C    8907            mov     dword ptr [edi], eax    //这三句指令要修改
  003D097E    8385 E4394000 0>add     dword ptr [ebp+4039E4], 4  
  003D0985    61              popad
  改成:
代码:
  003D097C    61              popad
  003D097D    8907            mov     dword ptr [edi], eax
  003D097F    8385 E4394000 0>add     dword ptr [ebp+4039E4], 4
  从而避开IAT加密。此时F9,中断在:
代码:
  003D09C4    E8 23020000     call    003D0BEC
  取消断点,下断BP VirtualFree,中断后取消断点,Alt+F9返回:
代码:
  00405007    9C              pushfd
  00405008    6A 63           push    63
  0040500A    73 0B           jnb     short 00405017
  Ctrl+B,搜索9D EB,找到:
代码:
  00405030    9D              popfd           //下断,F9中断在这里
  00405031    EB 01           jmp     short 00405034
  00405033  - E9 33C0648F     jmp     8FA5106B
  00405038    0083 C40CE801   add     byte ptr [ebx+1E80CC4], al
  0040503E    0000            add     byte ptr [eax], al
  00405040    00C7            add     bh, al
  00405042    58              pop     eax
  00405043    9D              popfd
  00405044    61              popad
  00405045    E8 15000000     call    0040505F
  0040504A    E8 E80F0000     call    00406037
  0040504F    009A E8090000   add     byte ptr [edx+9E8], bl
  00405055    00E9            add     cl, ch
  00405057    68 EF174000     push    004017EF
  0040505C    EB 01           jmp     short 0040505F
  0040505E    C7              ???                                      ; 未知命令
  0040505F    58              pop     eax
  00405060    40              inc     eax
  00405061    50              push    eax
  00405062    C3              retn               //单步跟进到这里,然后下断
  中断几次,在地址显示到离当前地址比较远的时候就到OEP了。跟进到OEP:
代码:
  004017F0  /.  55            push    ebp                              ;  kernel32.ExitProcess
  004017F1  |.  8BEC          mov     ebp, esp
  004017F3  |.  6A FF         push    -1
  004017F5  |.  68 E0244000   push    004024E0
  
--------------------------------------------------------------------------------
【经验总结】
  实际上这个壳还是比较简单的壳,各位高手勿笑罢了。 很久没来过看雪了,算是个纪念吧
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年07月30日 PM 11:19:30