前言
如何防作弊在游戏开发中还是占蛮重的比例的,这也涉及到游戏盈利的问题,如果不做防作弊措施,或许我们开发出来的app当前上线或许第二天就出破解免费版了,这个事情我亲身经历过,当然这是基于app做的比较好被外挂公司盯上了,一度很火的吃鸡游戏端游版本其实外挂非常猖獗,这也是因为没有做防外挂,如何防作弊在求职者求职的时候也会经常被问到,当然我们能想到最简单的方案就是不要信任客户端任何数据,以服务器数据校验为准,当然这种方案在一些客户端服务器交互比较少的情况是可以这样设计的,假设FPS,我们每次射击造成的伤害,一帧里面会射击好多次,不可能每次都去向服务器校验吧,交互太频繁了,体验也很差,但如果不校验的话,客户端就是修改武器属性值,这就是客户端作弊了,如何解决这样的问题,下文会介绍到防作弊的思路。
客户端如何作弊
手机端
我在当初手游刚起步的时候,flappy bird想必玩游戏的人都知道,是一款非常虐的手游,当时也非常火,朋友圈都在晒分数,后来我知道用一款《八门神器》的app能够作弊修改分数,然后修改成很高的分数晒在朋友圈就显得自己“很牛逼”,满足一下自己的虚荣心,原理就是修改分数内存值来达到作弊的效果。
PC端
PC上修改内存也有对应的软件,例如Cheat Engine,就类似手机上的八门神器,如何应用见下图:
如何防作弊
Unity开发推荐一款插件Anti-Cheat Toolkit,自行上Asset Store上下载。具体原理就是我们通过数据混淆,UI上显示的值实际上是我们经过计算出来的值,所以内存修改器根据UI上显示出来的值去搜内存地址是搜不到的。
防作弊原理
1 | private int curATK; |
分析:^运算是异或运算,需要一点二进制的知识,异或运算是相同为0,不同为1,下面举例:3 ^ 4=7,3对应的二进制是11,4对应的二进制是100,异或运算之后的结果二进制是111对应的十进制就是7,下图程序验证一下:
分析
根据上面的程序你是否真真明白是如何防作弊的呢,num是我们输入的值,例如玩家当前的金币数量是4,但我们UI上的显示并不是直接Coin.Text = num.ToString(),这样玩家搜到num的内存就很容易修改了,就作弊了,我们UI上的显示值是hiddenValue^cryptoKey的值。玩家就算搜出num的值并修改了,对我们显示金币真实的数量并没有影响。
分析插件Anti-Cheat Toolkit
我们Unity开发估计很多人都会用这个插件,他是如何实现数据加密的呢,我们看下手册就会知道它是将Unity的基本数据类型都封装了一个对应的数据类型,例如:int->ObscuredInt,Float->ObscuredFloat,string->ObscuredString等。拿ObscuredInt举例:
会发现它封装了一个跟Int对应的结构体,并且有一个混淆因子cryptoKey=444444,我们再看string类型的封装的一个类ObscuredString,它的混淆因子是string cryptoKey=“4441”,如果我们用这个插件啥都不修改,那如果我是黑客,我知道当前某游戏是Unity开发的并且数据做了防外挂处理,那么我如何破解防外挂,我肯定首先就想到的就是这个插件,并且知道这些混淆因子,那么我就相对容易能破解出来,所以如何再进一步防外挂,就必须要对插件的混合因子再做一个混淆或者修改就显得很重要。