编写安全的PC端代码

##发布到外网的代码,不要打log## 首先得认可,在可能出问题的地方加上log是一个好习惯。可是log很容易暴露一些关键信息,好比代码的处理流程。就算是咱们的log输出要有开关才能在Debugview中打印,也是不安全的。由于打log的函数在PE文件中能够被看到,会减小黑客逆向的成本。算法

因此,在代码中应该用一个宏去控制log的输出,debug版本才把打log的函数编译,release版本就不要带上log了。安全

##敏感数据要加密保存## 这个很容易理解,数据若是未经加密,长期保存在内存中,是很危险的。应该选用一些加密算法,只在内存中保存加密后的串,待用到时,再解密。函数

##加密算法的key动态变化## 就算数据加密了,黑客也是会经过不断的改变一些值,而后观察内存的变化去分析其中的规律。加密

举个例子说吧,好比一个玩家身上的金币在一个int存放,这个int是通过加密的。玩家身上有1000金币时,加密串为0XABCD,10金币的加密串为0XEFGH。那么玩家能够不断的从钱庄中存和取金币,而后反复在内存中查看,通过几轮筛选后,玩家就能定位到表示身上金币的int类型加密串的内存位置了!线程

为了解决这个问题,咱们能够在每次读取金币的值时,更换一下加密的key,这样,当玩家把900金币存放到钱庄而后再取出来时,这时候加密的串再也不是0XABCD了,这一定会增长玩家的破解成本!debug

##敏感数据不要一次所有传递## 若是存在线程A和线程B,线程A经过一个函数func,把一组敏感信息,通过解密后,传递给线程B。黑客只要hook了这个函数func,就能拿到全部的敏感信息。为了提升黑客的破解成本,咱们能够把这些敏感信息,分屡次传递。游戏

##敏感信息不要集中存放## 若是敏感信息在内存中是连续存放的,这样会很方便黑客攻击,除了简单的将不一样的信息放到不一样的内存区域外,咱们甚至能够精细到一个变量,放到不一样的内存中。好比将一个int分拆成几块,存在不一样的内存块中,用到时在拼接起来。内存

##敏感信息添加内存校验码## 上文提到,黑客可能会经过观察内存的变化,定位出敏感信息的内存地址。这时候,黑客可能会试探性的修改一些值,而后回到游戏中查看是否生效。编译

咱们须要给敏感数据的内存添加校验码,当读取内存时,先要检查内存的校验码是否匹配,写内存时,也会同时更新校验码。当发现校验码不正确时,咱们就知道,此时内存正在被黑客篡改!变量

##小结## 全部的这些策略,都不能保证客户端代码的绝对安全,咱们只是增长了破解的成本。

相关文章
相关标签/搜索