Unity手游引擎安全解析及实践
近日,由Unity主办的“Unity技术开放日”在广州成功举办,网易移动安全技术专家卓辉作为特邀嘉宾同现场400名游戏开发者分享了网易在手游安全所积累的经验。当下,很多手游背后都存在靠汲取开发商利益的灰色产业链,它们通过破解,对游戏进行重打包达到修改支付、修改广告等目的。通过利用外挂、篡改数据、游戏加速等手段来破坏游戏平衡,流失付费玩家,这些都极大的危害着手游生态。卓辉通过介绍目前各种Unity手游破解方法及对游戏的危害,分享了网易为Unity引擎安全所做的工作,帮助手游开发者规避这些安全风险。
一、手游安全风险
手游安全问题原因分析
相比以前端游时代,手游开发基本上是脚本为主,开发迭代的周期比较短,但是同样降低了逆向分析的门槛,破解者分析整个游戏变得更加容易。另一方面,一些重本地交互的手游的数据是放在客户端计算,服务端对客户端控制相对较弱,可以通过篡改客户端的数据来达到作弊效果。第三,对普通玩家来讲,安卓模拟器有很多,在模拟器作弊变得更加简单。第四就是端游时代所用的保护方案,如驱动保护,在手机端没有办法用,手机端对于APK的权限限制更加严格。而对于破解工作室来讲,手游时代的成本更低,比如空间成本、电力成本、机器成本、破解成本,这样导致大量端游打金工作室涌入手游吸金,给手游的生态带来了极大的挑战。
手游威胁
在如此热门的手游破解领域,我们来看下手游到底经受着哪些安全问题的困扰。首先就是游戏外挂,这个从端游时代就出现的问题也困扰着手游,自动打怪、自动升级等辅助类外挂能够代替手工操作,让整个手游完全自动化,这样虽然表面上提高了单个用户时长,实际上这都是无效的时间,因为这样会大大降低游戏互动性,增加其它玩家的游戏成本,从而流失真正用户;其次就是游戏破解,破解游戏协议,找到游戏漏洞,或者直接模拟数据发包,严重威胁游戏的平衡性,缩短游戏的生命周期,大大增加开发团队的开发成本;手游还存在很多游戏加速器和篡改器,玩家可以很方便下载到这些工具,用来修改游戏数据,直接影响游戏平衡,流失付费玩家。
二、Unity引擎安全风险
网易安全团队分析了公司内外很多Unity游戏的安全问题,概括来讲就是静态数据安全(脚本和资源)、动态数据安全(角色动态数据、运行速度)和收益安全(支付和广告)。Unity引擎的脚本文件作为一个DLL文件存在,可以用Reflector工具进行反编译,得到如下图所示代码:
整个游戏的脚本代码毫无保留的呈现在我们面前,这样对破解者来讲,相当于和开发团队一样拥有了游戏的源代码。如果我们用Unity Studio反编译U3D引擎的资源文件,也可以拿到相关游戏的资源数据,如下图所示:
那么这些破解会带来哪些危害呢?
对于强校验的MMORPG手游来讲,通过逆向,导致整个通信协议直接被分析,客户端和服务端的通信毫无保留的呈现在破解者面前,他可以修改数据包、发送带欺骗性的数据包,最终可能开发出脱离客户端的外挂,通过封包来模拟客户端行为,这会严重危害手游的平衡性。
另外我们也发现很多手游虽然有很强的校验,但是对于场景中角色可移动区域的判断、角色攻击范围的判断、角色攻击行为的判断还是比较弱,这样通过破解可以达到,穿墙、自动瞄准、远程攻击等作弊效果,对正常玩家的冲击相当厉害,最终玩家会慢慢流失,如下视频所示:
https://share.weiyun.com/15fdae5843679985ca91299e590e4d14 (gameguarddian修改器实现瞬移.mp4)
对于弱校验和单机类的手游,可以导致内购被破解,角色属性被修改,导致玩家不需要付费就可以达到甚至超过付费玩家的水平,这会大大打击付费玩家的积极性,最终影响开发商收益。
三、Unity引擎安全解决方案
那么我们如何保护Unity引擎安全,保护自己的合法权益呢?
对于很多开发团队可能也有自己开发加固保护系统的打算,如果要做好这套保护系统,需要解决很多问题,主要包括以下四个:
第一、保护方案自研成本比较高,需要不断调研、不断改进,你不但需要了解破解流程,还需要深度掌握Unity引擎的运行原理。
第二、安卓的兼容性问题,安卓设备碎片化严重,系统版本升级、用户环境多样化。需要不断完善你的解决方案。网易在这一块积累了很长时间,才开发出一套在性能、兼容性和安全强度都满足的保护方案。如果游戏开发团队自研,兼容性会占用团队大量时间,降低游戏核心逻辑开发速度。
第三、对于破解来说,本身保护工作是一个矛和盾的过程,是不断升级和不断对抗的过程。如果游戏开发团队要去自研保护系统,需要分析市面上的破解工具,并不断分析他们破解的方法,然后才能不断提高整个保护系统强度。
第四、第三方服务的兼容性,游戏现在越来越是一个精细化开发的模式,很多游戏团队只做一些核心的逻辑玩法的开发, 所以保护就需要兼容支付模块、热更新方案及质量跟踪等各种第三方服务。而兼容这些第三方的服务,又给游戏开发团队带来了很大的挑战。
另外传统的脚本加密方法也会存在两个问题。一个是静态保护逆向分析难度不高,定位解密算法容易;另一个是动态保护较弱,反调试、反HOOK、反DUMP等保护强度不高,非公开的解密方法没有防护。
要改进传统加密方法并打造安全的保护方案,首先需要解决以下四个问题:
第一个就是要提供足够高效的保护方案。对于游戏保护来讲,核心点是不能影响游戏运行的性能,不能影响玩家体验,要既能满足保护强度、也能满足性能要求。
第二就是脚本解密的算法和加载函数足够复杂,可以抗静态和动态分析,让破解者无法获取解密流程。
第三就是能够防HOOK,防止在关键API上被下勾子,从而防止动态拷贝内存。
第四是防DUMP,即使全内存搜索也让破解者找不到DLL文件。
具体实现方法如上图所示,只有做到静态和动态全方面保护,我们的保护方法才能抵抗各种破解,各种分析。
接下来,我们来看一下网易云安全团队提供的这套解决方案的加载原理,如下图所示:
手游开始运行后,系统首先会去加载Unity的Mono的so文件,这个so文件已经被网易云加固处理过,对so文件和相应API进行了保护,并同时会加载游戏安全模块。当游戏进程读取脚本文件时候,就会进入mono文件,这个时候可以完成DLL处理工作,让Unity引擎可以正常加载加密的脚本文件。整个过程对开发者透明,游戏开发并不需要在开发的时候介入或者做什么操作。
Unity资源保护这一块原理也类似,我们处理了unity.so的文件,当这个资源请求发出以后,可以把加密后的资源文件进行解密,因为有很多3D游戏资源非常大,有一些有几百兆,所以我们对加密方案和算法进行了极大的优化,可以保证资源文件解密的时间最多只要10ms,不会影响游戏的性能,对玩家无感知,以及对于游戏的FPS都没有影响。另外资源加密对于游戏开发也是完全透明的。
最后,通过一张概览图来看下网易云安全的加固服务针对手游提供的功能:
要打造一个既安全又高效的保护方案,需要团队不断投入人力和时间进行更新、升级,不断研究破解方法。提供稳定可靠的第三方服务既可以有效降低手游安全风险,帮助开发团队在核心业务上赢得更多时间和精力,降低成本,同时提高保护效果。通过网易多年内部安全服务的技术经验积累,网易云安全的应用加固形成了一套成熟高效的移动安全解决方案,已为公司内外数百款手游提供安全保障。多个手游技术负责人表示,在接入了网易加固服务之后,游戏破解率直线下降,反外挂功能也大幅降低了外挂入侵,游戏安全隐患得到了及时有效的扼制。