-
-
[原创]**前线破解
-
发表于:
2019-5-5 20:16
9987
-
**前线是一款有保护的游戏,我们来破解一下他们的保护。
1.首先我们来打开一下游戏中的Assembly-CSharp.dll文件,这个文件是u3d mono游戏的关键文件,游戏的主要逻辑都包含在其中。
2.拖到dnspy(一款dll反编译工具,可在github中下载)中查看,可以看到不能正常解析出来,这说明dll是被处理过的。
3.那我们要开始着手处理脱壳了,怎么才能解密出来dll呢。一般解密可以通过搜索dll的魔幻字,但是nProtect有反调试,不能直接搜索dll的魔幻字得到。于是我们需要去Hook相应的函数来获取解密后的dll。
4.dll加载过程。U3D中mono加载dll的过程简要提下。首先是调用mono_image_init函数进行初始化,那dll解密肯定是需要在mono虚拟机加载之前的,因此,在mono_init_image函数进行hook,看能不能得到解密的dll。使用inlinehook对libmono.so里面的函数进行hook。inlinehook是通过修改函数的前几条指令,使其跳转到我们的函数地址,执行后再跳转回原函数。Cydia Substrate是较早的inlinehook框架(其缺点是只支持Dalvik模式,Android 4.4以上请慎用)代码如下:
(1)首先hook dlopen函数,在游戏打开libmono.so时候,对libmono.so的mono_image_init函数进行hook
(2)在游戏调用mono_image_init函数时进行hook,读取mono中的image文件,根据Image的结构将dll文件dump下来。
这说明nProtect可能会对libmono.so中的函数进行校验。对函数进行校验对inlinehook进行保护的方案,那我们有没有其他方法呢?--那就是GOT表Hook。GOT表是SO库
中的外部函数导入表,当进程需要引用其他so库中的函数,会将这个函数的地址写入got表中,实际调用的时候,会按照got表中的地址跳转调用。GOT表就是通过got表
中的地址,将GOT表中的地址指向我们编写的函数,再在自定义函数末尾跳转回原函数。按照这个思路,那我们需要找到调用mono_image_init的地方,答案就在
libunity,so里面,其导入函数表中含有mono_image_init函数。因此,我们需要对llibunity中的函数进行got表Hook。got表hook这里采用开源的框架xhook进行hook。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)