仙剑5出了之后迅速购入了一款,毕竟是少有的几款喜欢的国产游戏品牌(从仙剑3开始接触的~),
通关之后便对它的保护机制有了兴趣,,。
于是首先去网上搜罗了一下,发现加密方式不是Securom 7.x的,貌似已经升级成了8.
但是从网上的一个关于Securom7.x的资料中还是发现了一些有用的东西的,,,这是后话了,现在开始。

此文章中涉及到的技术和资料用于研究和学习。

尝试1:

首先我尝试用OllyDbg载入,然后从开始一步一步的跟着程序走,没多远走到这里

02F3EB9C    90              nop
02F3EB9D    895424 08       mov     [dword esp+8], edx
02F3EBA1    0FA4DF 00       shld    edi, ebx, 0
02F3EBA5    8B10            mov     edx, [dword eax]
02F3EBA7    015424 14       add     [dword esp+14], edx
02F3EBAB    90              nop
02F3EBAC    83C0 04         add     eax, 4
02F3EBAF    66:FF4C24 10    dec     [word esp+10]
02F3EBB4    90              nop
02F3EBB5  ^ 75 EA           jnz     short 02F3EBA1                   ; 对程序的一小块计算校验和
02F3EBB7    804C24 14 01    or      [byte esp+14], 1
02F3EBBC    53              push    ebx
02F3EBBD    5B              pop     ebx
02F3EBBE    817424 14 42A90>xor     [dword esp+14], 0CA942
02F3EBC6    817C24 14 03A70>cmp     [dword esp+14], 0CA703           ; 对比前面的计算结果,准确则跳
02F3EBCE    76 03           jbe     short 02F3EBD3
02F3EBD0    EB 32           jmp     short 02F3EC04

由此可以看到如果在前面一段设了int3断电就会出错,应该是很典型的Anti-Debug了。

然后继续跟


02F3EE9C    50              push    eax
02F3EE9D    16              push    ss
02F3EE9E    17              pop     ss                               ; 这里利用CPU的机制强制EFLAG寄存器入栈,
02F3EE9F    9C              pushfd                                   ; 所以如果用F7跟踪的话就露了马脚了,
02F3EEA0    8B0424          mov     eax, [dword esp]
02F3EEA3    F6C4 01         test    ah, 1                            ; 这里就是要比较T FLAG了,这里我们将ah修改为2后继续
02F3EEA6    74 05           je      short 02F3EEAD
02F3EEA8    B9 BE070000     mov     ecx, 7BE
02F3EEAD    33C0            xor     eax, eax
02F3EEAF    74 02           je      short 02F3EEB3


然后到这里又是计算校验和,但是附近没有判断,继续跟进

02F3EEC1    90              nop
02F3EEC2    8B5C24 20       mov     ebx, [dword esp+20]              ; 计算2f3ee2ch开始到2FBEEF8的校验和
02F3EEC6    8B1B            mov     ebx, [dword ebx]
02F3EEC8    33F3            xor     esi, ebx                         ; 后面会根据这个结果算出程序的返回地址
02F3EECA    834424 20 04    add     [dword esp+20], 4
02F3EECF    56              push    esi
02F3EED0    5E              pop     esi
02F3EED1    66:FF4C24 1C    dec     [word esp+1C]
02F3EED6    90              nop
02F3EED7  ^ 75 E8           jnz     short 02F3EEC1
02F3EED9    90              nop
02F3EEDA    8B5C24 14       mov     ebx, [dword esp+14]
02F3EEDE    90              nop
02F3EEDF    896424 14       mov     [dword esp+14], esp
02F3EEE3    834424 14 24    add     [dword esp+14], 24
02F3EEE8    2BEE            sub     ebp, esi
02F3EEEA    8B7424 18       mov     esi, [dword esp+18]
02F3EEEE    8D1B            lea     ebx, [dword ebx]
02F3EEF0    8B6424 14       mov     esp, [dword esp+14]
02F3EEF4    872C24          xchg    [dword esp], ebp                 ; 在此处 将算出的地址入栈
02F3EEF7    90              nop
02F3EEF8    C74424 04 C2040>mov     [dword esp+4], D50004C2
02F3EF00    C1EB 00         shr     ebx, 0   ;这里OllyDbg被混淆了,应为“retn 4”
02F3EF03  ^ EB F7           jmp     short 02F3EEFC    


此处没有判断,但是后面会根据这个结果得出程序的返回地址,因此可以在靠下一些的位置设硬件断点,,,

尝试2:

这么一步一步分析太慢了,并且一旦放跑就会结束进程,后来从资料中发现,Securom7的保护模式中不是只有一个进程的,而是会另外生成一个进程,这个才是最重要的进程,前面的那个进程主要是计算出新创建进程需要的参数的,那么8是不是也是这样呢?,(相关信息可以看wzanthony的http://bbs.pediy.com/showthread.php?t=93932),其中涉及到很重要的一些突破方式甚至涉及到了Hook 系统DLL,,我只是刚入逆向的新手啊,,这从何下手,。。= =,
继续Google,发现了国外的一些成果,关键字“Special_Issue_for_SecuRom7.3”,有时间的话我再翻译它
在那个资料里面提到了一个工具OEP Finder可以完成这个任务!,如文档里所说勾上Kill Low Alloc,Hook Virtual Alloc,Get TickCount +1即可,然后在参数用在原先OllyDbg载入的Pal5设CreateProcesinternalA建立的断点得到,填入之后即可,但是有一点不足,无法自动找到OEP,看来有了一定的应对措施,我也懒得找了,直接用OllyDbg Attach进去看看,这里发现一个规律,Attach进去之后要尽快F9恢复程序的运行,这样才能保证不会死掉,
由于我只是个新手,因此在Attach之后尚无明确的方法找到OEP并且有效脱壳,比较有趣的是发现貌似Pal5内含有很多调试信息,甚至一些参数信息,








以上就是到目前为止的一些半成品了,如果有什么好的方法的话希望能够多多交流~,