检测游戏是否存在作弊行为的方法

2017-05-30 13:58黄佳
企业科技与发展 2017年3期

黄佳

【摘 要】随着智能手机和平板电脑的普及,移动手机用户越来越多,移动游戏的市场规模也随之暴涨,如此大的市场规模,必定会引来手游行业中的激烈竞争。一款游戏若想在激烈的市场竞争中生存下来,在游戏中需内置健全的保护措施。因此,建立检测游戏是否存在作弊行为的机制是十分必要的。它既可以加固游戏,保证游戏拥有正常的规则环境,也可以防止其他方对游戏的恶意攻击和破坏,起到积极的保护作用。

【关键词】Unity;检测作弊;Apk;Android

【中图分类号】TP393 【文献标识码】A 【文章编号】1674-0688(2017)03-0133-03

在《2016中国游戏产业报告》中,在国内火爆的手游取得了骄人的成绩,移动游戏的市场份额第一次超过客户端游戏,成为份额最大的细分市场,国内销售收入达到819.2亿元,占比超过客户端游戏市场,达到49.5%,成为份额最大、增速最快的细分市场。随着行业的发展,国内手游市场还远未达到饱和状态,VR设备的出现,VR概念手游的提出,VR游戏的崛起,移动手游行业潜在增长点可望在未来数年内进一步成熟。SuperData等欧美地区的各种权威的统计报告都显示VR市场有巨大的空间,Oculus Rift、HTC Vive和PSVR三大VR设备相继发布,也为国内的VR游戏开发者提供了更有潜力的平台。如此大的市场规模,手游行业中各种正常和非正常的竞争是十分激烈的。手游产品若想获得更长的生命周期,除了产品完整精美之外,能够经得起玩家捣鼓,抗第三方工具摧残,安全地运行也至关重要。因此,对游戏加固,在游戏中建立检测是否存在作弊行为的机制是十分必要的。

1 检测游戏是否存在作弊行为的理论

1.1 模拟器检测

?譹?訛模拟器具有一定的特征,一般的检测方法主要是对模拟器的IMSI、IDS、默认文件、默认号码等几个方面进行检测。在得知了这些信息后,只需在运行时进行检测,如果检验结果与默认值吻合,那么检测设备便是模拟器,这是较为传统的检测方法。②基于模拟器CPU信息的检测,主要是检测CPU信息是否包含intel、amd等字段。相较于传统方法,该方法有了更高的检测成功率,很多模拟器目前对于CPU信息还无法进行模拟。类似的原理,还可以检测google_sdk,sdk,sdk_x86,vbox86p等相关信息来识别是否是模拟器。③关键路径检测特定模拟器,对于某些具有反防作弊功能的模拟器,需要特定的检测方法,bluestacks成功躲避了前2种检测方法,检测这类模拟器时可以根据总结出的一些bluestacks的关键路径进行检测。④电池信息检测,可以从电池的温度和电量等信息入手,检测温度在使用过程中是否一直保持不变,或者电量一直是固定值并且不是百分之百等,可以鉴别出genymotion、bluestacks等主流模拟器。⑤模拟器检测与模拟器反检测都在不断地更新迭代中,无法确保哪一种方法会长久使用,很多时候在检测模拟器的过程中,都不是只使用某一种固定的方法,需要具体问题具体分析,也需要用多种方法来综合检测。检测出模拟器玩家,可以有效地控制和防止黑客玩家在电脑端使用模拟器对游戏外挂、作弊、分析调试,保证玩家在游戏既定的环境下操作及游戏,保障游戏的顺利运营。

1.2 第三方加速器检测

手游和端游的通用加速功能原理都相同,通常游戏需要以帧为单位播放画面,播放画面过程中计算每帧动画播放所需时间(也可理解为2个画面切换的间隔时间),游戏需要调用C库函数获取系统时间以供计算每帧更新。目前,手机端绝大部分游戏基于两大引擎,分别为Cocos2D引擎、Unity3D引擎。引擎中实现了游戏每帧更新相关处理逻辑(包括每帧更新时间的计算),因此导致使用固定引擎的游戏每帧更新所需时间计算过程中调用的Libc.so模块完全相同。通过Unity3D的代码内容可看出,Unity3D引擎为游戏开发者提供通用的Update函数,该函数会在游戏每帧更新的逻辑进行调用,每帧更新逻辑完全封装于Unity3D引擎提供的LibtUnity.so模块中。

手游通用加速出现的根本原因如下:绝大部分手机游戏使用两大引擎(Cocos2D引擎和Unity3D引擎)開发游戏,两大引擎采用固定的Libc.so函数计算游戏每帧更新(Cocos2D引擎通過libc.so的gettimeofday函数计算每帧更新,Unity3D引擎通过调用clock_gettime计算每帧更新)所需时间,从而通过修改引擎获取时间或者影响计算每帧更新相关变量便能实现手游通用加速功能。

基于手机端采用两大引擎实现的游戏,通用的游戏加速功能可通过以下方式实现。?譹?訛基于游戏逻辑的:修改游戏计算每帧更新所需变量;通过修改代码影响每帧计算的时间结果。?譺?訛与游戏逻辑无关的:修改主逻辑模块导入表;通过InlineHook方式修改Libc.so模块的时间函数(gettimeofday/clock_getime)或者修改更加底层的代码。基于游戏逻辑实现的加速修改,针对每帧更新所需变量的修改,可以通过检测是否存在内存修改进行阻拦,此方法将在下文具体说明;针对通过修改代码影响每帧计算的时间结果实现的加速,可以在发布游戏的时候,将游戏代码进行加密,防止游戏源代码被非法窃取、篡改,以达到黑客玩家通过修改代码达到加速的目的。目前,外网主流的游戏整体加速器(葫芦侠变速精灵、叉叉及圈圈加速器、烧饼修改器、晃悠游戏大师),均采用与游戏逻辑无关的的方式实现通用加速功能,不同引擎,加速器修改了不同Libc.so相关函数。葫芦侠变速精灵加速功能针对Cocos引擎修改了所有模块的gettimeofday函数导入表,其他几款工具修改gettimeofday、clock_getime的Libc.so相关代码实现加速功能,每款工具基于不同引擎的加速功能实现方式汇总见表1。

因此,通过检测时间函数是否存在异常,检测设备进程中是否存在第三方加速器的特征,便可检测出黑客玩家是否有可能使用加速器,进而加以必要的约束,防止黑客玩家使用加速器糟蹋游戏,变相攻击游戏服务器。

1.3 内存修改检测

一般内存修改的原理是第三方工具使用打开进程等类似的api以适当的权限打开游戏进程,找出数据段范围,然后对该进程的地址范围进行扫描后,修改数据内容,以达到内存修改的目的。

Android系统是基于Linux系统,Android要针对其他进程进行内存修改是基于Ptrace系统调用,Ptrace提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image。它主要用于实现断点调试。一个被跟踪的进程运行中,直到发生一个信号,则进程被中止,并且通知其父进程。在进程中止的状态下,进程的内存空间可以被读写。父进程还可以使子进程继续执行,并选择是否忽略引起中止的信号。在Linux系统中,可以通过Ptrace系统调用实现对进程的内存修改。大致过程如下:①通过远程进程pid,attach远程进程。②获取远程进程寄存器值并保存,以便注入完成后恢复进程原有状态。③获取远程进程系统mmap、dlopen、dlsym调用地址。④根据值搜索和proc//maps中的地址和偏移量与前端交互。⑤根据值的变化,确定内存地址(一般没办法精确到一个)。⑥根据内存地址修改成前端需要的值。⑦恢复远程进程寄存器。⑧DETACH远程进程。其中,④⑤两步可以有多种方式来搜索定位。

因此,要防止内存被修改,必须对游戏内存数据进行专业高级保护。首先,可以对重要的内存数据进行加密后,存储于内存之中,每次读取使用时,都需要相应的秘钥解密,提高黑客玩家解析加密后的内存数据难度,降低内存数据被篡改的风险。其次,通过限制游戏进程的被访问权限,可以有效地防范和控制游戏内存数据被篡改,避免游戏内存中的重要数据被窃取,防止黑客通过内存信息破解游戏,保护游戏运行中的信息安全。

2 检测游戏是否存在作弊行为的实现

通过以上原理及说明,在Android游戏中,可以把以上检测行为用代码方式做成一个so(share object)动态链接库,生成二进制文件,加入Android游戏apk安装包中,当游戏运行时,Android可以从应用层通过JNI调用底层的C/C++函数按既定规则来检测游戏中是否存在作弊行为,从而达到对游戏作弊行为进行自动化检测,进而达到对游戏apk安装包加固的目的,以保护游戏的安全运行。

3 检测作弊行为的具体方法

3.1 检测apk是否在模拟器环境下运行

检测步骤如下:?譹?訛检测当前系统是否存在相关的库文件,如“/system/lib/libc_malloc_debug_qemu.so”“/sys/qemu_trace”“/system/bin/qemu-props”等,存在這些文件则说明运行在模拟器环境。?譺?訛检测默认IMSI:310260000000000。?譻?訛检测默认ID:0000000

00000000。?譼?訛检测默认号码,如:“15555215554”“15555215556”“15555215558”等。?譽?訛检测当前系统是否存在“/dev/socket/qemud”“/dev/qemu_pipe”等虚拟设备,存在这些文件则说明运行在模拟器环境。?譾?訛检测当前系统的配置属性,如“vbox86p”“google_

sdk”“goldfish”“sdk”“sdk_x86”等,存在这些属性则说明运行在模拟器环境。?譿?訛检测cpu信息,如“intel”“amd”。?讀?訛一些bluestacks的关键路径的检测,如:“/data/app/com.bluestacks.appmart1.apk”“/data/app

/com.bluestacks.BstCommandProcessor-1.apk”

“/data/app/com.bluestacks.help-1.apk”“/data/app/

com.bluestacks.home-1.apk”等。

3.2 检测是否存在第三方加速器

检测步骤如下:?譹?訛枚举当前进程的模块,检测是否存在第三方加速器特有的so文件,存在则说明使用了第三方加速器。?譺?訛检测系统库libc.so的系统时间函数gettimeofday和clock_gettime是否被inline hook,如果被inline hook,則说明使用了第三方加速器。?譻?訛检测系统库libc.so的函数导出表的gettimeofday和clock_gettime函数地址是否被修改,如果被修改则说明使用了第三方加速器。

3.3 检测是否存在内存修改

?譹?訛开启反调试、反附加,检测游戏是否被调试器附加,探知程序是否正在被调试,防止其他方试图用反汇编之类的方法破解程序,防止第三方工具随意读取程序数据。?譺?訛枚举当前进程的模块,检测是否存在第三方内存修改器特有的so文件,以判断是否存在第三方内存修改器。

4 结语

拥有检测游戏是否存在作弊行为的方法是一款游戏标准的加固内容,也是游戏成熟的表现。它类似于电脑操作系统中的杀毒软件,像保护操作系统文件不被病毒侵害一样,保护游戏在一个良好的环境下运行,阻挡黑客玩家和竞争对手通过不正常手段对游戏功能和游戏环境进行破坏,保障普通玩家和支付玩家在游戏中应得的商品和服务,促进游戏中的正常交易,保障了开发者的收益和消费玩家的利益,促进游戏产业的发展和游戏市场销售份额的提高,对健康的游戏生态环境营造有着重大意义。

参 考 文 献

[1](美)德雷克.Android安全攻防权威指南[M].北京:人民邮电出版社,2015.

[2]佚名.Unity3D[EB/OL].http://Unity3D.com,2016-12-05.

[3]佚名.Android模拟器检测常用方法[EB/OL].http://

blog.csdn.net/sinat_33150417/article/details/51320228,2016-05-05.

[4]Felix Matenaar,Patrick Schulz.Detecting Android

Sandboxes[EB/OL].http://www.dexlabs.org/blog/btd-

etect,2012-08-10.

[5]佚名.手机游戏加速器的工作原理[EB/OL].https://

www.zhihu.com/question/22741208,2014-08-19.

[6]张跃骞.Android APP保护及破解[J].中国教育网络,2016(Z1):44-46.

[7]丰生强.Android软件安全与逆向分析[M].北京:人民邮电出版社,2013:78-90.

[8]杜吉志,徐明昆.Android系统内存管理研究及优化[J].软件,2012,24(5):69-80.

[9]佚名.Android下内存修改的研究汇总[EB/OL].http://

www.cnblogs.com/xieyuan/p/3787253.html,2014-

05-21.

[责任编辑:陈泽琦]