发布到外网的代码,不要打log
首先得承认,在可能出问题的地方加上log是一个好习惯。但是log很容易暴露一些关键信息,比如代码的处理流程。就算是我们的log输出要有开关才能在Debugview中打印,也是不安全的。因为打log的函数在PE文件中可以被看到,会减少黑客逆向的成本。
所以,在代码中应该用一个宏去控制log的输出,debug版本才把打log的函数编译,release版本就不要带上log了。
敏感数据要加密保存
这个很容易理解,数据如果未经加密,长期保存在内存中,是很危险的。应该选用一些加密算法,只在内存中保存加密后的串,待用到时,再解密。
加密算法的key动态变化
就算数据加密了,黑客也是会通过不断的改变一些值,然后观察内存的变化去分析其中的规律。
举个例子说吧,比如一个玩家身上的金币在一个int存放,这个int是经过加密的。玩家身上有1000金币时,加密串为0XABCD,10金币的加密串为0XEFGH。那么玩家可以不断的从钱庄中存和取金币,然后反复在内存中查看,经过几轮筛选后,玩家就能定位到表示身上金币的int类型加密串的内存位置了!
为了解决这个问题,我们可以在每次读取金币的值时,更换一下加密的key,这样,当玩家把900金币存放到钱庄然后再取出来时,这时候加密的串不再是0XABCD了,这必定会增加玩家的破解成本!
敏感数据不要一次全部传递
如果存在线程A和线程B,线程A通过一个函数func,把一组敏感信息,经过解密后,传递给线程B。黑客只要hook了这个函数func,就能拿到所有的敏感信息。为了提高黑客的破解成本,我们可以把这些敏感信息,分多次传递。
敏感信息不要集中存放
如果敏感信息在内存中是连续存放的,这样会很方便黑客攻击,除了简单的将不同的信息放到不同的内存区域外,我们甚至可以精细到一个变量,放到不同的内存中。比如将一个int分拆成几块,存在不同的内存块中,用到时在拼接起来。
敏感信息添加内存校验码
上文提到,黑客可能会通过观察内存的变化,定位出敏感信息的内存地址。这时候,黑客可能会试探性的修改一些值,然后回到游戏中查看是否生效。
我们需要给敏感数据的内存添加校验码,当读取内存时,先要检查内存的校验码是否匹配,写内存时,也会同时更新校验码。当发现校验码不正确时,我们就知道,此时内存正在被黑客篡改!
小结
所有的这些策略,都不能保证客户端代码的绝对安全,我们只是增加了破解的成本。