美服SealOnline主程序SO3D.exe脱壳过程

偶尔翻硬盘的时候看到一个Doc文件,打开一看,是关于脱壳的。

这游戏的名字总会勾起我的回忆——希望OL。因为它是我唯一一款从公测的时候就玩的游戏,然后在偶尔玩玩,到06-07年期间就进入疯狂沉迷阶段,每个星期放学回家必定要玩上一整天。甚至于新年过年也在游戏里和情侣一起放放焰火。
年纪大了,难免喜欢怀念过去,总会想起一些人一些事……

印象最深的当然就是游戏里情侣关系的 沧芽炽 了。

小沧可还记得猫咪山涯上的灭绝师太带着周芷若?可还记得翅膀?

还有 南宫煌,让你把剑升+8,差点害你破产了

表哥也是一起玩的,不过印象中他都是瞎玩的,挺欢乐的样子。

还有同班的书记同学也被我拉一起玩了,真浪费了他不少时间呢。

后来国服光宇不争气。去了马服玩到高级数的时候竟然关服了。再后来昆仑比光宇更不堪。

期间去了美服转一下,延迟大,没有感觉了……满满的都是回忆,说起来没完,就不说了。

也没什么心思整理了,下面就把DOC的内容贴出来,写这个DOC的时候,SO3DPlus.exe的版本应该是2013-06-11的,PEID测试为ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov,毕竟过去一年多了,觉得还有用的就参考一下吧。多去看雪、吾爱看看同类壳的脱法就差不多了。

 

一、在OllyDBG用常规方法跟踪到OEP

  1. 打开OD,在“调试设置”里,把异常全部勾上,然后留下两个“内存访问异常”不勾。
  2. 载入加壳的EXE,F9一下,看看有没有遇到异常,如果程序直接运行起来了,OD根本没有断下来,就是要换个OD版本了,我用过吾爱2011年的专版,还有小生我怕怕的专版,程序直接F9就开始运行了……没有停在异常里。后来换了dyk158的2005年修改版就能停下来了,不知道是什么地方没设置好还是别的原因。
  3. 提示异常要按Shift+F9,记下按了多少次,我按了17次,程序就跑起来了(还Anti-Debug,把我系统自动重启了),用OD重新载入。
  4. 这回记住按少一次Shift+F9,16次就停下来在经典的地方了,在下面最近的一个Retn按F2下断点。
    003439EC     3100             xor dword ptr ds:[eax],eax  《====停在这里
    003439EE 64:8F05 00000000 pop dword ptr fs:[0]
    003439F5 58 pop eax
    003439F6 833D B07E3400 00 cmp dword ptr ds:[347EB0],0
    003439FD 74 14 je short 00343A13
    003439FF 6A 0C push 0C
    00343A01 B9 B07E3400 mov ecx,347EB0
    00343A06 8D45 F8 lea eax,dword ptr ss:[ebp-8]
    00343A09 BA 04000000 mov edx,4
    00343A0E E8 2DD1FFFF call 00340B40
    00343A13 FF75 FC push dword ptr ss:[ebp-4]
    00343A16 FF75 F8 push dword ptr ss:[ebp-8]
    00343A19 8B45 F4 mov eax,dword ptr ss:[ebp-C]
    00343A1C 8338 00 cmp dword ptr ds:[eax],0
    00343A1F 74 02 je short 00343A23
    00343A21 FF30 push dword ptr ds:[eax]
    00343A23 FF75 F0 push dword ptr ss:[ebp-10]
    00343A26 FF75 EC push dword ptr ss:[ebp-14]
    00343A29 C3 retn 《====这里下断点
    00343A2A 5F pop edi
    00343A2B 5E pop esi

     

5. 然后按下Shift+F9,程序就停在 00343A29 retn 这里了。看看OD右下角的栈窗口,从上往下找到最近的一句数值为12FFXX的地址:

0012FF24     01BD5DD8
0012FF28 00400000 SO3DPlus.00400000
0012FF2C D1E4F0C3
0012FF30 0012FF6C 《====留意这句12FFXX,地址是12FF30
0012FF34 00330000
0012FF38 00300000

 

6. 然后在OD的命令行窗口输入HR 12FF30 下硬件断点,或者点击上面那句,右击——“数据窗口中跟随”,在OD左下角的窗口里往上找到12FF30 右击——“断点”——“硬件访问断点”——“WORD”。
7. F9一下,程序断在两个JMP的地方,代码如下。清除硬件断点(HD 12FF30),或者“调试”——“硬件断点”,删除掉12FF30。然后一路F7,发现大跳,就是OEP了。

01BD5F05    /EB 44            jmp short 01BD5F4B 《===停在这里,F7一下
01BD5F07 |EB 01 jmp short 01BD5F0A
01BD5F09 |9A 51579CFC BF00 call far 00BF:FC9C5751
01BD5F10 |0000 add byte ptr ds:[eax],al
01BD5F12 |00B9 00000000 add byte ptr ds:[ecx],bh
01BD5F18 |F3:AA rep stos byte ptr es:[edi]
01BD5F1A |9D popfd
01BD5F1B |5F pop edi
01BD5F1C |59 pop ecx
01BD5F1D |C3 retn
01BD5F1E |55 push ebp
01BD5F1F |8BEC mov ebp,esp
01BD5F21 |53 push ebx
01BD5F22 |56 push esi
01BD5F23 |8B75 0C mov esi,dword ptr ss:[ebp+C]
01BD5F26 |8B5D 08 mov ebx,dword ptr ss:[ebp+8]
01BD5F29 |EB 11 jmp short 01BD5F3C
01BD5F2B |0FB703 movzx eax,word ptr ds:[ebx]
01BD5F2E |03C6 add eax,esi
01BD5F30 |83C3 02 add ebx,2
01BD5F33 |8BD0 mov edx,eax
01BD5F35 |8BC6 mov eax,esi
01BD5F37 |E8 0C000000 call 01BD5F48
01BD5F3C |66:833B 00 cmp word ptr ds:[ebx],0
01BD5F40 ^|75 E9 jnz short 01BD5F2B
01BD5F42 |5E pop esi
01BD5F43 |5B pop ebx
01BD5F44 |5D pop ebp
01BD5F45 |C2 0800 retn 8
01BD5F48 |0102 add dword ptr ds:[edx],eax
01BD5F4A |C3 retn
01BD5F4B \03C3 add eax,ebx 《==== JMP来到这里
01BD5F4D BB 00000000 mov ebx,0
01BD5F52 0BDB or ebx,ebx
01BD5F54 75 07 jnz short 01BD5F5D
01BD5F56 894424 1C mov dword ptr ss:[esp+1C],eax
01BD5F5A 61 popad
01BD5F5B 50 push eax
01BD5F5C C3 retn 《==== 一路F7到这里,你会发现EAX就是OEP了(大跳转到006438DC)
01BD5F5D E8 00000000 call 01BD5F62
01BD5F62 5D pop ebp

 

二、脱壳修复IAT

  1. 使用exe 对已加壳的EXE跟踪IAT,中途弹出一个Dip什么的对话框,我选了No,接着会出现对话框提示“Pause!”,让你按确定,看看类似下图的黑窗的情况,显示出OEP的话,就执行第2步。

  2. 这时候打开LordPE(我用的是LordPE Deluxe B – Patched这个版本,在Win7环境没有60个进程显示限制的BUG),对正在运行的加壳EXE右击——完整脱壳,保存为exe。
  3. 打开ImportRec 1.7(我用的是ImpREC FINAL 1.7汉化版),在进程列表选你的EXE,然后OEP填上你在 第0步 或 第1步 里找到的OEP减去00400000,比如我这里是006438DC-00400000,得到2438DC,点击“自动查找IAT”,然后提示“可能发现了原始的IAT”,点击“获取输入表”,发现全部找出来了,没有无效的。接着“转存到文件”,选择上面脱出来的exe。
  4. 完成,加壳的EXE 5M左右,脱壳后18.5M。直接打开EXE运行正常,接下来该干嘛干嘛了。