首页
论坛
专栏
课程

[原创]某易Unity客户端保护浅析与绕过

2018-11-13 21:34 4012

[原创]某易Unity客户端保护浅析与绕过

2018-11-13 21:34
4012
前段时间发了篇帖,同样的内容,只不过厂商不一样。前篇贴子下面就有人说,某易的保护似乎要复杂一些,于是再一次闲来无事,分析下某易的保护是怎么做的。先申明一点,由于之前做了几次reverse的题,所以能内存dump的东西,我坚决不会去分析它的算法。。。

哦,对了,之前那篇帖子,都是从攻击者的角度去说的,下来我自己又去跟了一会,发现了一些其他的东西,拿来和大家分享一下。

第一,伪三进程守护,其中子进程2你是随便附加的


第二,子进程1通过execl启动的一个可执行的文件。不过你通过IDA附加上去,并想内存定位这个文件时,会出现下方Warining。



因为子进程1会在启动后将GameProtector3文件删除。这个GameProtector3保存在某个so的尾巴上,而且会有不同版本的(arm、x86)。最终是运行时释放到本地 --> 运行文件 -->  删除文件

第三,还有一些比较奇怪的操作,比如一些变量会通过一个下标从超大的字典里去获取最终的值(疑似某种混淆方法)。剩下的基本的常规的调试检测,就不多啰嗦了



第四,绕过方式,常规的是手动使流程种的某点发生异常,大厂会为了保证用户体验而关闭反调试功能来正常运行(每次看到这,作为信息安全一份子,我的心都很疼),还有的方式是,用你的root权限,先去把这个 GameProtector3  文件的坑占住,其实其实为了让流程出现异常

---------------------------------------------------------------------------------------------正题分割线 ---------------------------------------------------------------------------------------------

这里必须吐槽一下,我找了好久,好久,好久,才找到一个unity + mono得易游戏

不过...易的保护,其实也就那么回事(当然,仅限于此游戏,我之前也是领略过自研引擎,被虐了)
 
首先,\bin\Data\Managed目录下没有 Assembly-Csharp.dll 文件,一开始我也没在意


然后,分析一下libmono.so  : 1,没有了导出函数 ; 2,有很长一段数据都为0,猜测被扣了



不知道大家遇到这种静态分析时毫无头绪得情况时怎么办,反正我是直接dump一哈试试。

易的保护,没有三进程之类的东西,直接dump出来,然后简单的修复一哈,IDA就能分析了

看看我们的'mono_image_open_from_data_with_name'



一看就知道被hook了,并且stub函数就在本模块的0x1BE738,对着这个地址,按一发 C

简单的看了看代码,发现一个很熟悉的字符串 "data-%p",见下图



源码中:


其实我们要的dll的数据就附近了,只不过为了精致的获取到dll,我们还是找了下面这个函数



这个sub_1BDC4C,其实就是do_mono_image_load函数,因为它第3和第4个参数正好恒定是1(见上上图的do_mono_image_load...)

上hook吧,然后dump。。。

但是有一个问题,我上hook的时候,一般都是so刚load结束的时候,刚才也分析到了,易的libmono.so很多数据被扣了,并且在我打算上hook的时候,会出现两个问题,1,dlsym找不到符号,这个问题简单,通过导出函数函数定位加载基址再加offset就可以了;2,找到了地址之后,你会发现这个地址的数据全是0(之前分析的,libmono.so中有些数据被扣了),说明此时数据还没恢复,如果硬上hook的话,后面数据回填的时候,你的hook代码就被覆盖了,没效果了。当然,这个问题也简单,地址只要确定了,你多找几个时机去看看这个地址恢复了没,恢复了再上hook,别急。

哦,这里还遇到一个问题,我通过dlsym获取libmono.so的导出函数的时候,地址总会出一些问题(我最开始获取的JNI_ONLOAD的地址,估计多数模块都有的符号,可能会有一些小问题吧)

最终hook到了。

dump下来,最初的那个问题出现了,没有Assembly-Csharp.dll,然后我分析了下Assembly-CSharp-firstpass.dll和Assembly-UnityScript.dll,很明确没东西。不过还是发现了一个lunchGameCoroutine的类



这个LoadGame方法是一个Native方法


IDA打开libUnityHelper.so,这个模块没有被保护,我就直接说重点了

最终这个Assembly-Csharp.dll的加载过程是:
1.解密asset下的/res/code.bytes文件(这个文件没在APK里)
2.传入LoadGame去加载,这里第一个参数是内容指针,第二个参数是长度(待会就这里dump了)
3.通过主动调用mono_image_open_from_data获取 MonoImage
4.通过主动调用mono_assembly_load_from完成dll的加载

大概就这么一个流程,最终



我没去找到底哪恢复的libmono.so,易有那些反调试的手段,估计后面写保护的时候再去好好看看他们的具体保护方法吧。
总体来说,某厂和阿易对与U3D的游戏保护都不强,主要是因为其开源的原因吧。。。

大牛勿喷,欢迎交流~



[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

最后于 2018-11-14 11:05 被老skr江编辑 ,原因:
上一主题 下一主题
打赏 + 2.00
打赏次数 1 金额 + 2.00
收起 
赞赏  junkboy   +2.00 2018/11/14
最新回复 (10)
smartdon 1 2018-11-13 21:53
2
0
楼主分析u3d的游戏很得心应手啊,那简单修复一下so是怎么修复的呢,小白求教
junkboy 2018-11-14 19:45
3
0
支持
最后于 2018-11-14 19:46 被junkboy编辑 ,原因:
chenwitch 2018-11-15 19:28
4
0
分析了半天,只是DUMP DLL,DUMP DLL不需要这么复杂,有简单得多的办法
老skr江 2018-11-16 11:24
5
0
chenwitch 分析了半天,只是DUMP DLL,DUMP DLL不需要这么复杂,有简单得多的办法
我这样的方式dump其实还有一个目的是为了后期能够替换,不过大佬有别的方法,能否给大家分享一下呢~谢过大佬
白菜大哥 2018-11-16 17:10
6
0
有些程序,仅仅是dll的话,意义不大。就算把dll原封不动的放在那里,也很安全。比如pinvoke方式,用cpp回调来搞,就强大的多。
老skr江 2018-11-16 19:57
7
0
白菜大哥 有些程序,仅仅是dll的话,意义不大。就算把dll原封不动的放在那里,也很安全。比如pinvoke方式,用cpp回调来搞,就强大的多。
我最近几天似乎已经发现了这么一个问题,不过还好,cpp里的很多符号信息都在,分析起来不是太吃力。
诶一 2018-11-18 13:12
8
0
请问有什么办法可以对GameProtector3 这个文件进行占坑,或者具体怎么样做绕过。 
laixinzaici 2019-3-17 21:01
9
0
大佬能请你帮忙看看一个u3d游戏的加密吗
yy虫子yy 2019-3-17 21:12
10
0
路过,留个mark
xxRea 2019-5-13 13:29
11
0
路过,留个mark
游客
登录 | 注册 方可回帖
返回