本文作者为七少月,由于国庆,该文可以带作者名转载,声明:仅为技术交流与学习,任何非法用途与本人无关
马上就要到国庆节了,好像应该送点什么,论坛貌似不太活跃。。。那就送《神庙逃亡2》吧。。。 这个游戏介绍就不用多说了,跑酷类的始祖级Unity3d游戏,深受玩家喜爱的单机游戏,不过随着它的火爆,也由单纯的单机变为了可以PVP的弱联网游戏,而且保护也逐步加强,从裸奔到DLL加密和DEX加壳。目前神庙逃亡2的版本是2.1,不过这个游戏版本太多,光是同一个版本号的游戏就又分为移动版,百度版等等,支付方式和代码肯定不同。这里我就选择一些有代表性的来说说。 一、 软件验证 该游戏从哪个版本开始有软件防修改验证,这个我也没有确切查考,大概是在1.14 版本以后,因为我在弄1.12 版本以前没有看到盗版提示,在1.12 版本以前这个游戏应该就是裸奔状态。软件验证目地就是防修改,应该就是签名验证了,签名验证在哪里呢?是在最简单的smali 里,看起来这个游戏so 的数量随着版本逐步增多,但目前看来没有一个是可以完成保护游戏功能的,大部分的so 还是其他厂商sdk 的so 文件,后面会深入说说。还有1 个佐证,当我们直接修改回编游戏后,出现一个提示框“您正在使用的是盗版软件。。。”。我们要注意的就是这个提示框的样式,这个样式就是那种黑底白字的安卓系统默认的提示框。试想一下,这个游戏画面做的也不错,在开发UI 用户界面时肯定会顺带开发自己游戏中使用的五颜六色提示框,而这个提示框用的却是这种古老默认的安卓系统提示框,所以这种情况绝大多数是在smali 里。不过也可能是在so ,但我说了,这个游戏毕竟是个知名的,如果这个提示框在so 里或DLL 中,应该会用自己开发的提示框。当你的DEX 脱壳,直接搜索字符串“盗版软件”,即有所得,这个提示框的名字叫“dialog_initconfig_msg ”。修改如下图: 至于原理我就不说了,无非就是简单改个跳转。不过新版本的好像签名验证就不是这么容易了,可以使用我的上一篇《Masterkey漏洞过签名验证》,即使他签名验证可能再难,如果签名都没变过,肯定也是过的。 二、 DEX脱壳 在神庙逃亡2的1.14版本以后,该游戏运用了第三方加壳加固。由于本人自身原因,不便说明太多。当然,对于这个游戏的难点,肯定是DEX和DLL的脱壳解密,如果这个问题解决了,就可以说对于一般水平的朋友,就几乎没有任何困难。但很抱歉,我实在没办法满足这个需求,只能说把脱壳后的DEX让大家看一看,以下是神庙逃亡2的2.0版本DEX脱壳后的DEX: 三、 DLL处理与修改 虽然说对于DEX和DLL如何脱壳,这一点不能详说,但我也不想写个文档却把关键的都省略掉。这里我就和大家说说该游戏DLL的大致加密方式。如果你把几个版本神庙逃亡拿出来对比就会发现,只要是APK处于被加固状态的,DLL就是加密的状态,而且到2.1版本为止,DLL加密后文件头的HEX是一样的。这就说明,几个版本的DLL加密方式是一样的。首先猜想一下,如果说是平常的游戏开发商进行的加密,假定他已经开发一套加密框架代码或方案,那么这么多版本,应该有一点变动才合理。因为假如加密框架代码已经开发好,密钥子的更换几乎不费任何成本,这样在极低的成本下,开发商肯定会进行加密方式的变动以保护软件的最大安全。而神庙逃亡2几个版本都没有任何的关于DLL加密方式的变动。由此可以大胆推想,这个游戏的DLL加密保护完全是由第三方加固商进行的!只有这样才在行业里比较合理!当然,这肯定不能靠猜测,要靠科学的验证和实验。我们通常所知, DLL 加密的解密会在libmono.so 中,首先我们看这个游戏的libmono.so 是3.69MB ,利用IDA打开这个so 里的关键函数mono_open_file_with_name ,发现里面没有任何循环语句或是异或那样的数据处理语句,再把这个so 和由Unity_MONO 编译出的原生3.69MB 的so 进行对比,没有任何变化。其他的so 虽然多,但我说了,大部分还是其他厂商SDK 的so 文件,剩下几个so 文件大小都发生了变化,当然不能仅仅看大小,依次用IDA 打开这几个so 文件,这里我觉得比较有可能的就是libmain.so 。然而这个so 里分析函数后,确实有一些Assembly_onload 函数,只是跟进去看后,也没有处理DLL 的痕迹。那么就只能说明,解密DLL 的算法不在so 文件里。那么这个解密DLL 到底在什么地方呢?我们现在不必太过于追究它的算法到底在哪,因为如果是第三方加固要刻意去保护这个DLL ,那么很可能这个算法已经写在了这个加固商的定制的加密后的jar 文件里。所以,最主要的是把DEX 脱壳,然后让其重打包可以成功,才能进行DLL 的保护分析。当我们把DEX 脱壳后,重打包成功,运行游戏,发现游戏卡在了第一个界面,再想想,如果是我们DEX 有问题,那么游戏应该是闪退,可是如今卡在了第一个界面,而一般U3D 游戏,第一个界面如果不是splash 这样的厂商宣传图片,就必然是加载界面。动态调式一下:很明显,意思就是加载那个关键的DLL失败,我们回到软件APK来,看看这个Assembly-csharp.dll,如下图: 这个DLL 显然是加密了。现在把所有线索分析组成一块,当DEX 是加固状态时,DLL 也是加密状态时,APK 正常运行;当DEX 已经被脱壳,也就是壳不运行的时候,DLL 仍在加固状态,APK 是出现加载DLL 失败,而DLL 解密又不在so 里。很明显了,我们只剩下最后一种情况,DLL解密的关键在壳的smali中!当然应该是壳运行中运行了壳的某个so或jar文件,壳里面有定制的解密该DLL的算法,必须伴随壳的运行,才能够正确解密DLL,然后让游戏可以运行!果然是不错的方法,那么我们怎么解决呢?很简单,只要我们把解密后的DLL 从内存中抠出来就可以,当然现在很多加固用抽取加密,不过我猜想一下,抽取加密如今更多是处理DEX ,DEX 属于安卓,而如何做到抽取加密一个别的厂商的DLL ,这个windows 下的东西,况且这个游戏还不是小软件,与DEX 不同,一个DEX 可以看作独立的,但一个DLL 和so 层,其他DLL 层,U3D 引擎层等等都有密切联系,所以我想,目前DLL加密还只是整体加密,做不到抽取加密!那么最难点就出来了,如何从内存中DUMP 出解密后的DLL ,当然还是在带壳动态调式的情况下,这个可能就需要一定的本事了。我说了,我写的文章没有任何想教人破解的意思,只是分析一条可行性思路和方案,至于朋友真的能不能做到,我是无法保证的,个人能力不同。另外,注意了,这个游戏自身里有gdbserver 文件,是不是想防GDB ,是不言而喻的吧。 作者已经证实了,当把DEX脱壳,并且解密后的DLL抠出来后,再重打包,APK就可以正常运行了,接下来,我们松了一口气,可以任我们修改了! 先来欣赏一下,我们的DLL代码,首先是柳岩的角色脚本: 我们随便搜索一个“coin”方法,很快就发现,这个DLL开发的也确实是没有做任何保护技巧和手段,关键属性没有写成隐藏属性,没有转移到别的DLL或资源文件中,就是那个get,set。不得不说,给我的感觉就像是修改一个小厂商开发的DLL一样,如贝利快跑。。。 我们看看类的名称,很快找到一个很显而易见的类,叫“PlayerStats”类,看过我的《U3D安卓逆向基础教程》的朋友都知道,往往名称有Player,就是一个信号,告诉我们这个类放的是玩家数据,而一旦出现了Stats,其实就是Start的意思,也就是游戏初始化。 上面这个函数就是原始DLL的游戏初始化时玩家金币获取函数。当然毕竟是知名游戏,还是用了一个if做了下保护。如果是新手或不细心,很可能出错,就想着只保留最后return XXX这句,或者直接就不管这个if了。这个if意思就是,一旦金币数超过了0X5f5e0ff,就启动保护,大概最终金币还是0。另外,如果想游戏初始化自定义金币成功,我看了下,还必须保证一些函数不为NULL,或不为false,这些函数都是全局函数,用在了很多地方,联系较多。以上分析,我的改法很简单,把那句0X5f5e0ff进行无限放大,只要不超过INT32数据类型范围就行,我改的是999999999,然后return 9999999。改后函数如下: 游戏初始化时无限金币,无限钻石要修改的函数如下: 至此,我们DLL就搞完了,看下效果: 四、 内购逆向分析 虽然说,通过了以上DLL的修改,金币和钻石已经对我们毫无意义,但分析一个游戏或软件,内购逆向分析是肯定要的。但这个游戏我不想多说,因为他的内购就是那些常用的几个运营商,移X,联X和电X,还有一个支X宝。这个游戏在内购上也没有像开心消消乐等那样在运行商SDK基础上,又加上多层如检测SMI卡,检测服务器上传是否安全,等等这样的保护,所以我就不说了,就是运行商的内购分析。很多地方都有,不过我想说说支X宝,好像我拿到的这个版本利用传统的找到Resultstaus.smali,然后找到9000的十六进制所在的switch分支语句,再修改switch语句,这种方法不行了。我是把Resultstaus.smali中以下代码删掉,当然这个支X宝的Resultstaus.smali好像也和以前见过的有点区别,用了一个数组,可能我长期没碰支X宝,至于剩下几个运行商自己去找吧: 五、 资源提取 这个游戏的资源文件是做了一定处理,不过在assets文件夹中,有1个Bundles文件夹,里面有一些角色的.unity3d格式的文件,可以直接用disunity extract进行提取资源,提取出来是动作效果shader文件,和ktx文件,如下图: 六、 最终效果 写了这么久,有点累,不写了,最后来看看一张效果图吧,网上好像有特定角色无限钻石的,但我们这个无视任何角色,初始化就是无限金币,无限钻石: 结束语:如今,安卓安全发展得尤为迅速,以U3D的DLL保护为例,现在就有千变万化, 看近行远,雨雪纷飞,不如笑面对人。。。。。。
|