神庙逃亡2全系列分析
本帖最后由 水波摇曳 于 2015-9-30 21:46 编辑本文作者为七少月,由于国庆,该文可以带作者名转载。
声明:仅为技术交流与学习,任何非法用途与本人无关
马上就要到国庆节了,好像应该送点什么,论坛貌似不太活跃。。。那就送《神庙逃亡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保护为例,现在就有千变万化,看近行远,雨雪纷飞,不如笑面对人。。。。。。
楼主是做安卓开发的吗 不错不错1!!值得学习!!!{:4_86:} 大神牛逼!顶一个 很好,mark {:4_86:}加油 膜拜大神。。。 sos521qqq 发表于 2015-9-30 00:53
楼主是做安卓开发的吗
不是呢,妹子 楼主附件在哪 请问下楼主,怎么能知道一个程序的dex或者dll是加密的呢?
页:
[1]
2