我的生活随笔

八门神器初始化失败(八门神器没有修改功能)

  一款游戏要上线,就要防外挂。历史上因为外挂导致玩家大量流失的游戏数不胜数。随着游戏R&D技术的发展,外挂的防范其实在业内已经越来越好了。下面总结一下防外挂的基础知识,以及我们的移动模块为防外挂做了哪些工作。

  这种插件分析游戏使用的内存,找到内存中的变量,分析猜测变量的意思。因为客户端本身存储了很多游戏信息,比如技能cd,移动速度等。因为我们游戏技能的管理和启动都是由客户端控制的,如果插件能把技能cd改成0,客户端就可以无限玩这个技能了。

  加速档可以加速某个进程的时间,通过加速档,游戏客户端进程的时间可以加速N倍。真实时间可能只过了1s,而客户端进程的时间已经过了Ns。通过加速档位,可以加快人物移动速度,加快技能cd等。

  这种插件可以拦截客户端发送给服务器的消息,然后篡改或者重发。例如,您可以截取一个技能释放消息,然后无限期地将其发送到服务器。如果服务器不验证,就会无限期执行技能。

  这种外挂对游戏的伤害相对较小,但也是最常见的。这种外挂比较常见,对游戏的影响主要取决于游戏机制。举个例子,我的一个哥们弄了20多部手机,用按钮精灵刷了传奇世界手游的金币,然后卖给其他玩家。但是,对于不能自由交易的游戏,就不会出现这种问题。最多会导致玩家自己使用,让他们24小时在线,缩短游戏寿命。

  反外挂是一个系统工程,需要不同模块的配合。而且不同游戏对外挂的防范要求不同,具体游戏需要具体分析。

  游戏开始时,检查手机正在执行的进程。如果发现黑名单上有进程,就不能进入游戏。这种方法可以防止市面上常见的插件,但是对于不常见的或者新开发的插件,你就无能为力了。如果游戏不火,没人玩,这个手段就够了。希望大家能遇到专门为自己游戏开发的插件,哈哈。

  记录玩家的行为(经常是点击行为)并进行分析。这种方法可以帮助检测玩家是否使用了按键向导工具。

  前面已经介绍过,插件可能会修改内存或篡改同步消息来达到自己的目的。如果我们对客户端的内存信息和通信信息进行加密,插件无法分析得到的信息,所以无从下手。

  在moba游戏或者fps这种对抗性游戏中,玩家通过使用外挂对手可以清晰的感知到。对于这类游戏,举报机制是非常有用的反外挂手段。

  上面描述的一般方法并不能解决所有的外挂问题,所以我们需要在游戏的逻辑实现过程中做出相应的反外挂机制。

  这有两层意思,一层意思是让外挂用户得不到好处;另一层意思是,如果外挂用户只能通过非常麻烦复杂的工作获得一些小的好处,那么我们可以放过这种情况,也就是说,没有必要在所有情况下都加入反外挂逻辑。

  添加防插逻辑时,需要考虑防插增加的性能开销。如果反插件增加了巨大的性能开销,往往不值得。在这种情况下,可以考虑不在逻辑中放插件,而且是通过其他方式。

  可信的不需要验证,不可信的选择性验证。在我们的游戏中,客户端发送的所有消息都被认为是不可信的,服务器发起的所有调用都是可信的。比如下面介绍的移动模块防外挂机制,当服务器的其他模块比如权限模块通知我的移动模块闪烁时,我不考虑权限模块是否可能被外挂操作,我觉得都是可信的。当然,这个权限可能是客户端操作的,所以此时客户端是否使用插件要由权限模块来判断和验证。

  我们游戏的移动同步逻辑的基本原理是:单元根据玩家的输入在主终端(玩家自己的客户端)执行移动逻辑,然后以一定的频率将位置和时间信息发送给从终端。服务器和其他客户端根据主终端发送的移动同步信息模拟、预测和校正单元的位置。

  因为我们游戏的所有动作都是由主客户端发起并执行,然后由服务器跟随,所以传送也是由客户端先执行,然后通知服务器。

  为了保证客户端不能发送非法闪烁消息,我们将闪烁过程定义为:服务器发起,客户端执行,服务器重新验证。

  对于这种外挂防范,一般有两种:1。在客户端,玩家无法通过一定的加密手段找到移动速度,所以无法更改。2.服务器端验证。我们使用服务器端认证方法。

  当客户端发送一条移动消息时,服务器可以根据这条消息和前一条消息计算出两条消息之间的移动速度,然后根据服务器信息得出服务器认为在相应时间可以达到的最高速度,对比后可以验证。

  其中,服务器很难得到相应时间的最大允许速度。起初,我们使用它的方式是记录每次运动速度变化的时间和速度值。当我们收到客户端的消息时,我们根据客户端发送消息的时间来检查该时间对应的速度值。

  但这里有一个问题:当一个飞行事件的移动速度改为300时,一个普通的移动事件在飞行事件结束前的移动速度改为40。其实这个时候的移动速度其实是300,但是按照我们的算法是40。

  因此,我们实现了一个基于移动速度改变事件的移动速度验证机制。我们不记录速度变化的值,而是记录速度变化事件的开始和结束时间以及速度值,所以每次需要计算某个时间对应的速度时,可以根据速度变化事件的信息计算出准确的值。

  最常见的游戏插件是加速器。在我们的游戏移动机制中,加速器可以让客户端的单位移动速度更快,而我们将客户端的单位位置同步到服务器。如果服务器没有任何验证,服务器将跟随客户端位置,加速器插件将生效。

  加速器插件的原理是加速客户端的时间流逝。所以,最简单的办法就是在服务器收到同步消息的时候,从同步消息中取出客户端的发送时间。如果客户端的发送时间大于服务器的当前时间(会加一个阈值),则认为使用了插件。

  游戏中有时间校准机制。当播放器在短时间内重新连接时,客户端和服务器将再现校准时间。但是,由于网络延迟和网络波动,可能会出现各种情况,包括客户端时间快于服务器时间。在这种情况下,会导致误判。

  为了解决这个问题,我分析了加速器的特性。加速器会导致客户端时间不断加速,客户端和服务器的差距越来越大。因此,使用以下验证机制基本可以避免误判:

  这样,我们给了客户一个或多个机会。对于加速插件来说,会导致客户端时间继续加速,最后用完所有的机会。但由于网络波动,客户端校准后的时间比服务器快,不太可能所有机会都用完。

  当然,这个监控方案在理论上还是有误判的。但是因为每一个场景切换都会复位,所以当n=2时,通过测试分析,误判的情况非常少。

  如果把n改大一点,会导致玩家进入新的场景。如果加速比比较小,比如0.1倍,他们可以使用加速插件更长的时间。

  附:运行日志可以检测加速器插件的使用,但是日志更多的是检查而不是预防。我们在这里实现的是预防,确保玩家不能通过使用加速器获得任何利益。

赞(0)
未经允许不得转载:我的生活随笔 » 八门神器初始化失败(八门神器没有修改功能)

我的生活随笔我的生活随笔