【文章标题】: 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
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课