前段时间发了篇帖,同样的内容,只不过厂商不一样。前篇贴子下面就有人说,某易的保护似乎要复杂一些,于是再一次闲来无事,分析下某易的保护是怎么做的。先申明一点,由于之前做了几次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的游戏保护都不强,主要是因为其开源的原因吧。。。
大牛勿喷,欢迎交流~
哦,对了,之前那篇帖子,都是从攻击者的角度去说的,下来我自己又去跟了一会,发现了一些其他的东西,拿来和大家分享一下。
第一,伪三进程守护,其中子进程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",见下图
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2018-11-14 11:05
被老skr江编辑
,原因: