手机游戏玩家的分类及特征(手机游戏盗版现状与保护方案研究分析)
随着用户移动支付习惯的形成,手机游戏付费收入也逐年增长,但在看似繁荣的大好形势下,手游盗版问题一直相伴而生,并且有愈演愈烈之势。所以各大游戏厂商也开始注重手游的安全性,本文和大家一起探讨手机游戏的相关保护方案及效果分析。
一、 手游安全现状
1. 盗版游戏现状
根据360加固保年初发表《2015年Android手机应用盗版情况调研报告》显示:平均每款正版游戏类APP对应66.4个盗版和1.1个盗版签名,比2014年增长了2倍之多,盗版现象十分严峻。
2. 盗版数量与游戏类型的关系
不同游戏类型的盗版数量也有所不同,当下最流行、长期经典的游戏都是盗版重灾区。下图是9类不同的正版游戏和盗版游戏数量之间的关系。可以看出,休闲益智类的盗版数量最多,占总体盗版游戏总数的44%;其次为跑酷竞速类占比15%;解谜冒险类占比12%。
二、 游戏保护现有手段与优缺点分析
1. Top10游戏使用哪些安全保护措施
手机游戏面对如此严峻盗版问题,游戏厂商又有哪些保护措施呢?
对360手机助手,豌豆荚,应用宝与百度手机助手10月份下载前10的游戏应用进行分析(共40款APP),其中有进行加固保护的有5款,有做签名校验的18款(其中有5款APP签名校验不通过后会直接杀死进程),有防调试功能的游戏仅有3款。
也就是说在下载的40最多款APP里,大部分的游戏是不需要经过任何技术对抗,就能直接将其轻松破解并重打包的。此时破解者可以去掉游戏内的支付环节,篡改游戏规则限制、加入自己的广告等等操作。这样一款盗版APP一旦分发出去后,对游戏开发者和用户都将造成巨大损失。
2. 游戏开源引擎的隐患
开源引擎给开发者提供很大的开发便利,同时也带来了诸多安全隐患。Cocos2d 与Unity3D游戏引擎是时下比较流行的游戏开源引擎,由于使用的是开源源码,有心的破解者能够阅读源码并找出稳定可靠的破解点,无论是编写自动化破解工具还是降低破解成本都是很有利的。所以接下来我们对使用这两个开源引擎的游戏进行简单的分析。
1) Top10游戏中Unity3D游戏的保护措施
Unity3D游戏是基于.net语言的一个3D引擎。游戏逻辑是使用.net语言编写,并在windows系统编译生成dll格式文件。所以Android平台运行Unity3D游戏引擎需要依赖一个.net的虚拟机。目前主流的虚拟机就是mono,一个开源的引擎。通常编译共享库名为libmono.so。
Unity3D的保护主要遵循两条思路:
(1) 修改mono源码,对需要解析opcode重新做做映射。修改完opcode映射的mono相当于一种新的语言,保护力度相当大的。劣势是修改源码工作量大,还是需要对dll文件做处理。兼容性稳定性也是很难保障的。
(2) 另一种思路就是对dll文件进行加密。无论是对文件部分加密还是全部加密,最终mono解析文件时还是得还原成明文。这也是现在普遍使用的一种保护手段。
对于mono的破解点的选择,函数mono_image_open_from_data_with_name提供了脚本文件的内存地址,文件长度与文件名。是一个很好的破解点。针对思路2,可以在此破解点入口,直接dump 或动态跟踪,按部就班问题都不大。
按照思路(2),我们调研了一下Top10各个Unity3D游戏的保护力度。提高游戏platformVersion,反签名校验与反调试等保护手段不在本文讨论范围,故不提及。由于涉及游戏厂商的利益,在此就不说明具体游戏应用名。对被保护过Unity3D游戏中的Top10进行了逆向,发现主要有几类保护:
A:游戏脚本在mono_image_open_from_data_with_name函数前已经被解密,这类脚本保护较弱。直接Hook目标函数,以脚本文件内存地址为首地址,文件长度为内存连续空间,把数据写到文件上既能拿到脚本明文。
B:游戏脚本改写mono_image_open_from_data_with_name函数,在函数中做解密操作。在目标函数下断点,动态跟踪参数脚本内存地址的值,脚本最终还是会在内存中被解密。
C:游戏脚本在mono_image_open_from_data_with_name函数,重定向到本地其他文件并做解密,破解该类保护的解决办法和2方法是一样的。
2) Top10游戏中Cocos2D-Lua游戏的保护措施
Cocos2d-x游戏引擎是一个支持多脚本语言的开源游戏引擎。这里只对Lua游戏引擎做分析。Cocos2d-lua使用的Lua虚拟机也是一个开源项目。和一般脚本虚拟机一样Lua虚拟机也是先加载Lua脚本并做解析执行。同时Lua虚拟机也可以编译成Luac文件,Lua虚拟机同样也能识别。
Lua 保护常见的思路有:
(1) 把Lua脚本编译成Luac格式文件,这样解包拿到的是一些二进制文件。虽然这对破解造成一定的难度,但是随着luac反编译工具的成熟,这种方法也不怎么盛行了。
(2) 通过修改Lua的opcode也能很好地保护游戏。同样也存在工作量,与修改虚拟机源码问题,由于Lua虚拟机版本迭代快速,这种方法很少见被采纳。
(3) 打包时加密Lua文件,在Lua函数中添加解密的代码,在运行时解密脚本文件是现在较为流行的一种方案。
由于内存加解密安全系数比较高,一般开发者会选择在luaL_loadbuffer这个函数做解密。同样这个函数也提供了脚本内存地址,脚本文件大小与脚本文件名这三个重要的参数。
按照思路(3),我们也对几个游戏的保护力度做了对比。
Top10 Cocos2d-lua游戏,发现保护方案有以下几种:
A:重新编译libcocos2dlua.so,修改共享库名称与隐藏共享库符号。该保护虽然给破解者批量破解造成麻烦,但是保护力度不大。
B:对脚本进行全文件加密,在加载前进行解密。参照Unity3D游戏,动态调试也能破解。
3. 开源引擎如何更好保护
对比Unity3D与Cocos2D-lua游戏引擎保护力度,我们可以得出结论尽管开发者有针对性地对自己的游戏做保护对抗,还是轻易地被破解者破解。人生亦如此,付出与回报并不能成为正比。有没有更好的解决办法呢?据360加固保安全研究员介绍,他们目前针对开源引擎游戏研究出全新的技术方案,可以给游戏开发者提供一站式的安全服务。
三、 360加固保游戏保护方案解析
1. 游戏脚本保护
360加固保游戏保护是基于加固保基础加固服务,专门为游戏开发者开发的安全服务。保持加固原有的优势的情况下,针对Unity3D游戏引擎的dll脚本与Cocos2D-Lua游戏引擎的Lua做保护。
加固保游戏保护方案思路是:获取开发者发布前的正式游戏包,经过加固处理,对游戏脚本文件进行加密。开发者的程序代码保持不变。游戏运行时,所加载的脚本文件在内存中会被解密成原文,进而被程序执行。整个过程透明的,无论是用户还是开发者的程序本身都是无感知的。
具体流程以下图是表示。
此方案的优势:
1) 高强度文件加密:加固保在做加固处理的时候会对游戏脚本文件做高强度全文件加密,并把密钥打散并一起与解密函数用VMP保护起来。
2) 透明加密:完全保持开发者自己的代码,应用运行时透明解密,不影响游戏自身的逻辑。
3) 动态解密防静态破解:只有在游戏运行起来才会才会解密脚本,使保护流程更加隐蔽。
4) 兼容性好:支持Android2.2 到Android7.0 全版本Android系统。
5) 稳定性佳:每天超过上千万台设备运行的加固保就是稳定的最好保障。
以下是加固前后的效果对比:
加固前共享库:
加固前脚本文件明文:
加固后共享库:
加固后脚本文件密文:
由加固效果图可以看出,加固前后除了脚本文件被加密,其他文件均没改动。所以360加固保一方面使得脚本文件被加密,保证了该APP的安全。另一方面也无需开发者参与进来,实现了透明加解密,不需要替换unity3D的引擎,从而保证了游戏的兼容性。
2. 防挂机辅助工具
随着手机角色扮演类型网络游戏的盛行,自动挂机辅助工具也更多被玩家用户使用,市面上针对不同需求的挂机脚本在各种论坛与社交群能轻易找到。防挂机辅助工具功能也被添加到加固保游戏保护服务中。
本方案是从屏幕模拟事件的本质属性来校验,不管辅助工具如何修改进程名称或升级技术方案,都能确保检查结果的确定。准确的检查结果能让开发者实时获知自己的游戏被挂机脚本辅助的情况。按键精灵,蜂窝游戏与脚本精灵均逃不出您的眼睛。
以下是某游戏在使用按键精灵时的检测结果。
图中用户尝试使用按键精灵进行模拟按键,结果被加固保检测到,然后提示“Event Trap”。所以我们可以根据开发者的需求,对类似的挂机辅助工具进行防御。
3. 防内存修改器与加速器
本游戏保护服务还添加了防内存修改器与防加速器功能。由于现在辅助的工具使用的技术方案都是大同小异,市面上主流的辅助工具例如八门神器,叉叉助手,烧饼修改器与胡芦侠都能进行防护。
以上就是关于手机游戏安全保护的一些研究和分析,欢迎和有兴趣的人进行技术交流。也呼吁广大手游开发者,提高应用安全意识,不让破解者有机可乘。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com