在国内做游戏,少不了做各种加密。如果客户端做战斗话,那就更少不了做内存加密了。
一般来说,作弊有三种途径:
- 初始态:修改配置表文件
- 中间态:修改内存数值(八门神器)
- 结果态:修改网络消息
今天我就第2条,谈一谈防作弊的思路及手段。以我对类八门神器的了解,其操作修改内存的基本操作流程如下:
操作方法:
- 在游戏界面上找到想要修改的数值(如金币1000),输入八门神器查找,会显示所有数值为1000的内存地址。
- 然后在游戏里让这个数值发生变化(如消费2,剩余998)
- 再次输入八门神器查找,则会在上次结果的基础上,显示所有数值变为998的内存地址。
- 循环1-3的操作,直至只剩下一个内存地址(也有可能是若干个,最好是一个)。
找到内存后,就可以为所欲为了。一般有两种修改,一种是直接修改为想要的值,一种是锁定内存,不让其变化。
如果是静态/全局变量,八门神器还可以直接保存内存偏移记录,以备下次使用。局部变量就只能临时有效了,下次再执行上面的操作修改。
根据这个流程,如果想让作弊者找不那么对应内存地址,那么让显示的数值与实际内存数值不一致,是不是就可以了呢?
解决方案1:隐藏明面数值
在存数值的时候,加上一个的偏移量,或者乘以一个倍数。读数值的时候减去对应的偏移量,或者除以对应的倍数。偏移量和倍数可以是固定值,也可以是任意可用的随机值。
评:
这种方案我们很容易想出来,那么开发八门神器的人也很容易想到啊。
所以八门神器还可以模糊查找,变大了,变小了,变了,没变等变化趋势来查找内存。
因此简单的加减,乘除,异或,平方,立方等都是不好用的,是骗不过八门神器的。
解决方案2:让数值变化失去规律
使用内存加密算法,比如Base64,Zip或者其它自定义等算法。
评:
经过这一步已经可以阻挡N多小白了,但还会有一个大神级黑客,可以反向编译,进而破解加密算法。从而可以通过显示值,反向计算出内存值,然后进行查找-修改-锁定等。
解决方案3:让数值完全随机性
写入时,使用random将数值随机分隔为二个数值,读取时再把两个数值合在一起。
评:
使用随机分隔后,就算反向编译知道了怎么加密的,也无法通过显示值,找到内存值,也就无法进行内存查找了。
解决方案4:不断变化数值所在内存地址
使用动态内存,每次修改数值时,重新new一块新的内存。这样八门神器就无法查找内存了。
评:
频繁new/delete,可能性能会略有下降。但如果性能下降是在可接受范围内,也不失为一个好办法。
解决方案5:使用内存检验码
使用内存校验码,比如Hash,CRC,MD5等校验算法。读取时通过校验,可以很容易判断出内存是否被非法修改过。
评:
此法可以单独使用,也可以与方案2、3、4结合使用。
------------------------------------------
如果有什么问题或想法,欢迎留言交流~