网络游戏的外挂、攻击主要有这么几种形式:
1. 加速挂,主要攻击客户端脱机战斗的游戏类型。
2. 修改内存,也是针对客户端的,修改血量、攻击等数值。
3. 破解通信协议,如果通信协议未加密或者使用了简单的加密方式,都可以用工具破解,然后分析协议内容得到协议结构。
4. hook通信协议,用其他方式分析消息结构,不需要知道如何加密,只要可以调用客户端的代码就能使用同样的加密方式和服务器通信。
5. 封包重发,截获客户端发出的某些关键包多次发给服务器,比如充值、攻击等。
6. ddos攻击,使用机器人或者大量肉鸡连接甚至登录服务器,对攻击者没什么好处,只是单纯的消耗网络资源和服务器资源使其不能正常运行。
7. 黑到服务器主机内。这就没得说了。。
外挂制作者可谓是煞费苦心,通常认为客户端非常脆弱,外挂的防线只能靠服务器守护。
针对以上的攻击行为,我们也有响应的对策,首先我们要把服务器放在安全的地方!专业的事情交给专业的团队做,使用市面上成熟的云服务器,让运维的人替我们解决网络安全方面的问题。也就是6、7之类的问题。
对于1、2的做法,显然服务器要对客户端的关键操作进行验证,比如使用时间戳检测移动时间防止瞬移,检测攻击数值、攻击频率,检测单局游戏时长等,这属于逻辑设计范畴必要的考虑。
那么对于3、4、5这类通信协议攻击,服务器要做的首先是对协议内容加密。由于网络安全领域的长足发展,理论上使用对称加密算法都是不可靠的。然而破解当前主流的加密算法是需要一段时间的,至少24小时以上。这就给我们很大的容错机会,比如我们可以在发送第一条消息的时候带上第二条消息的密钥,这样同样两条消息的加密密文都不同,造成破解困难。这就是迭代加密,迭代加密还有个好处,就是可以对付简单的封包重发。如果客户端到服务器和服务器到客户端的消息都使用迭代加密,就是双向迭代加密。增强了安全性,而且对加解密来说只是密钥的变化,并不影响效率。在玩家登陆的时候,服务器应当防止非授信客户端登录,这样机器人之类的模拟客户端单纯借助通信协议是无法正确登录游戏的。这就是密钥认证,我们先生产一对 公钥/密钥,服务器持有公钥,客户端持有私钥。客户端登录时发送登陆请求,然后服务器用公钥加密一段随机数,客户端用私钥解密返回随机数,如果服务器校验失败就断开连接。
最后就是对付4一类的情况,逆向破解者可以做到hook客户端代码,绕过加密步骤,这样任何加密方式都没有意义了。这种情况只能靠提高网络模块耦合性、代码混淆一类的手段,防止逆向者轻易分析出消息收发的流程,找出规律。