近些年,终端端格斗游戏发展迅速。在碎片化的时间混战中,智能手机游戏因其有趣、易玩的优势,斩获了大量玩者。
在此其内,部份庞克玩者为的是崇尚更快的格斗游戏新体验,会在PC上使用工具包来stored机游戏,虽然相比如在的PC端格斗游戏,工具包的简洁度却是不尽人意。
为的是澄清这两类玩者,很多格斗游戏供应商开始试著将智能手机游戏和PC存取,同时实现二者的互通。如《剑豪》、《第六心智》、《丛林暴力行动》等智能手机游戏都支持在PC上运转,不论是格斗游戏的操作新体验却是沉浸于感均低于智能手机与工具包。
不过,BUG也以为转捩点,不断繁殖开去。智能手机游戏一旦上到PC端,很多弊病就曝露出来,例如应用领域职权纷乱、调查取证情景繁杂等,这让格斗游戏供应商无能为力,也给BUG党有机可乘。
一般来说,反BUG由两个部份组成,即静态标识符为保护与静态运转时对付。责任编辑将著眼静态标识符为保护,从实际的为保护效用起程,先阐释通用型的PE标识符为保护在易盾手游反BUG标识符为保护中的应用领域,后如是说面向全国格斗游戏发动机的标识符为保护思路,并在此基础上,积极探索两类通用型的格斗游戏方法论标识符为保护计划。
1.通用型标识符为保护
1.1 PE标识符为保护如是说
对于PC端来说,原生植物标识符为保护指的就是对x86构架的十进制文档做的为保护,即为保护Windows上的PE文档。
PE标识符为保护已逾20多年的历史,从21世纪末期,PE标识符为保护已经有了雏型,且问世了很多直到今日仍具有非常大声望的修整路子与DES,如赫赫有名的UPX壳,即是利用其最核心理念的UCL这一工作效率较低的数据压缩来同时实现的。
根据标识符为保护的同时实现效用,PE修整用到的技术可以分为以下几类:
○ 整体加密,最常见的即压缩/加密壳及其附属功能,附属功能包括IAT加密、反调试、完整性校验等
○ 混淆,包括花指令、指令变形、标识符乱序、字符串加密等
○ 虚拟机为保护
1)整体加密
整体加密用到了SMC(self-modifying code)的思想,加密原有标识符,并通过patch PE文档的entrypoint,再插入壳标识符,利用壳标识符添加解压缩/解密功能的标识符,即被加密的原有标识符将在运转时还原;同样地,上面提到的附属功能也会被添加在壳标识符中。
整体加密的效用,更多是体现在对付静态分析上,而大部份这类加密壳,在运转时就会被直接释放到内存中,因此对于性能开销来说,整体加密更多影响的是进程的启动时间,对运转时性能开销的影响极小;转到攻击者角度,在分析时,无需关注加密壳的DES,用正确的姿势Dump内存,再使用一些技巧修复附属功能即可,比如恢复可能被加密的导入表与数据段。
针对这个问题,易盾独创了两类指令抽取的方法,可以针对需要被为保护的关键函数,将其核心理念汇编指令抽取至外部,在运转时,该部份关键函数将在外部被执行,攻击者无法在内存中找到连续且完整的标识符段,大大提高其分析成本。
指令抽取效用如下:
抽取前,可以完整看到函数CFG,可以使用Decompiler看到伪标识符
抽取后,由于核心理念指令已不在该十进制文档中,函数CFG已被破坏,不再能用Decompiler看到伪标识符,如下图(图中的函数符号是修整后手动修改的):
2)混淆
与整体加密不同,混淆对标识符段、数据段都做了直接的变换,因此对静态分析或者是静态调试来说,都能起到一定的防御作用。
根据混淆方式不同,这里可以分为无源码混淆与有源码混淆两种。
无源码混淆:易盾在上一小节中提到的指令抽取的基础上,对抽取的指令通过私有的花指令发动机处理,使在不影响性能的前提下,对原指令进行变形与膨胀,并插入与条件分支相关的花指令,即使攻击者绕过反调试,剔除了层层加密,也难以去掉耦合度较低的花指令,进而无法恢复原指令。
加花前:
加花后:
有源码混淆:易盾使用自研的安全编译器作为解决计划,支持控制流混淆、指令变形、字符串混淆、防反编译等功能。同样处理无源码混淆中被为保护的函数,开启控制流混淆与指令变形后,效用如下:
3)虚拟机为保护
其中强度最高的自然是虚拟机为保护,因其引入了两类私有的CPU指令集,将真实的原生植物汇编指令转化为私有的指令运转在虚拟出来的运转时其内;但与强度相对的,由于虚拟运转时本身也依赖真实的运转时环境,会带来极大的性能开销,而格斗游戏与一般的商用软件不容,需要进行严格的优化,且格斗游戏方法论相关的标识符往往会被频繁调用,在这种情景下,虚拟机为保护并不会是一个好的选择。
1.2 格斗游戏方法论BUG原理
接下来我们换一个角度,从攻击者的视角起程,要同时实现一个格斗游戏BUG(特指修改格斗游戏数据,改变格斗游戏设计方法论的行为,暂不讨论模拟点击类型的BUG),要关注的点一般有这两个:
○ 与格斗游戏方法论相关的关键数值,如攻击力、血量、倒计时等
○ 关键函数,如伤害判定、战斗结算、技能释放等
对于关键数值,攻击者往往会选择使用一些内存修改工具,定位到目标地址进行修改。
最常见的工具有Cheat Engine,该工具可以同时实现扫描目标进程内存,并添加监视,最终使得攻击者找到关键数值的地址同时实现篡改。
一个简单的例子:使用CE修改某单机格斗游戏中的金币与钻石,可通过反复出售道具并回购,定位金币与钻石在内存中的地址并修改,如下图:
那么传统标识符为保护可以防御这两类BUG吗?不论是整体加密、混淆甚至是强度看起来最高的虚拟机,似乎都不能满足。
对于关键函数的定位,这里又分两种情况:
第两类情况是格斗游戏方法论相关的标识符就是原生植物的机器码,如Unity3D IL2CPP及UE4。攻击者往往会选择静态分析结合静态调试的形式来分析格斗游戏方法论,此时传统标识符为保护可以起到比较好的防御效用,大大提高攻击者分析格斗游戏方法论的时间成本,而且对于大部份攻击者而言,这个时间成本是不可估量的。
第二种情况是部份格斗游戏方法论相关的标识符是通过格斗游戏发动机来加载的,如Unity3D Mono。这类格斗游戏的发动机往往包含一个运转时解释器,来解释执行存放于外部的格斗游戏方法论,此时格斗游戏方法论所在文档自然就不符合传统的PE标识符为保护计划了。
由上面两节的如是说不难看出,传统的标识符为保护计划在对付格斗游戏方法论篡改类的BUG时,只适用于部份情景。
而对于符合要求的这类格斗游戏来说,需要考虑的也不仅仅是标识符为保护的强度,还有格斗游戏的简洁度、稳定性。大量的混淆、虚拟化,势必会对这两点造成影响。
2.格斗游戏发动机为保护
由于传统标识符为保护计划并不能覆盖到所有格斗游戏标识符为保护的情景,因此我们需要使用一些特定的为保护计划,在兼顾性能的同时,起到为保护格斗游戏方法论难以被分析的目的。这里以Unity3D发动机为例,如是说易盾手游标识符为保护对于这一格斗游戏发动机的为保护计划。
2.1 Unity3D手游的标识符为保护
1)Mono DLL整体加密
未被为保护的Mono DLL符合常规的PE文档格式,以MZ开头,可以被一些工具直接解析。
且可以通过反编译工具直接看到方法论:
针对这个问题,易盾结合传统PE标识符为保护中SMC的思想,设计了两类整体加密的为保护计划。加密后的DLL不再符合PE文档格式:
且使用反编译工具无法打开:
2)Mono DLL方法级加密
与上文传统标识符为保护中的指令抽取类似,将Mono方法中关键的IL指令抽离到外部,在运转前才解密,使得攻击者无法在内存中找到包含完整方法论的DLL。下面是加密效用。
方法加密前,标识符方法论清晰可见:
方法加密后,指令已被抽离,方法论不再可见:
3)Mono DLL格式私有化
用两类私有化的文档格式存储修整前DLL中的关键加密信息,即使是格斗游戏运转过程中,DLL也不会恢复。
4)IL2CPP global-metadata 加密
大部份情景中,IL2CPP格斗游戏标识符分析的第一步,就是用一个开源工具IL2CppDumper来解析格斗游戏标识符的符号信息。而这些符号信息的来源就是global-metadata.dat这个文档。
为保护原理即通过两类自定义的DES来为保护落地的global-metadata.dat文档,使得符号解析失效。
加密前,工具运转正常:
加密后,工具解析失败:
5)IL2CPP 指令抽取
IL2CPP的格斗游戏方法论在GameAssembly.dll中,通过修整,将格斗游戏核心理念标识符抽离至外部,配合私有的乱序变形发动机,攻击者将无法在内存中找到完整的GameAssembly.dll。
2.2两类通用型的格斗游戏发动机为保护计划
正如上一节中提到的,要为保护某两类格斗游戏发动机的标识符方法论,势必要对整个发动机有一定的了解,再针对其中的标识符方法论的运转时特性,结合加密、混淆等技术同时实现两类或多种特化的为保护计划。
对格斗游戏开发者来说,在接入格斗游戏标识符为保护计划后,若需要升级甚至更换发动机,相应的成本势必会增加;
对安全开发团队来说,格斗游戏发动机的更新,也需要耗费大量成本去升级为保护计划。那么有没有两类相对通用型且性能较好安全性较低的为保护计划呢?也即需要关注三点:
○通用型性,与格斗游戏发动机种类相对应,格斗游戏开发的语言也是五花八门,要做到针对不同语言或者编译产物都能同时实现为保护功能。
○性能,为保护后的格斗游戏标识符在执行时的运转工作效率应当与为保护前接近。
○安全性,需要支持各类混淆,支持虚拟机为保护。
先看安全性,众所周知,设计虚拟机为保护计划的解释器时,有三个角度,分别是针对源码、中间语言和汇编指令。其中,中间语言和汇编指令的解释器是被应用领域最广的,而源码级虚拟机由于要考虑到编译环境,且安全性较另外二者稍低,一般只在脚本语言(如JavaScript、Lua和Python等)中被使用。
再看通用型性,因为部份脚本语言并不会编译成原生植物的汇编指令,所以这种通用型为保护计划在设计上,就无法采用针对汇编指令进行修整的形式;而对于中间语言来说,虽然兼顾了通用型性,但要在现有的中间语言基础上为多种格斗游戏开发语言适配编译器前端,或重新设计两类支持多语言的中间语言,工作量无疑是巨大的。最后还剩下一个选择,这里采用定制AST发动机来解析源码。
最后回到性能上,对于格斗游戏标识符的为保护来说,大部份情况下不会大范围地开启标识符虚拟化,更多时候是选择混淆加上少量核心理念标识符虚拟化的形式,此时只需一个轻量的虚拟机,穿插一些混淆技术,就可以起到很好的为保护效用,也由于虚拟机设计上的轻量化,性能和稳定性都可以在掌控之中。如下图:
3.手游标识符为保护总结
标识符为保护是手游反BUG战斗中处于最前线的第一道墙,标识符为保护计划的优秀与否,与实际的格斗游戏新体验与安全性紧密相关。
不过,这些尚不能覆盖到反BUG的所有方面。可能细心的读者也发现了,上文中在如是说关键数值类型的BUG时,还留有一个坑,责任编辑针对标识符的为保护计划似乎都不能很好地覆盖到这两类型的BUG。那么如何解决呢?敬请关注后续内容,带你走进运转时反BUG的前世今生。
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!