[ZZ]变速齿轮做者的文章--绝杀反外挂方案

 

  自从网络游戏诞生以来外挂就一直是网络游戏厂商头痛的问题。因为网络游戏服务器端的负荷很重,不能进行太多计算,只能把大量检测外挂的工做放在网络游 戏的客户端进行。可是外挂也老是能够进行针对性的修改,使这些检测失效。并且从某种意义上说,外挂使这些检测失效比游戏检测这些外挂更容易。从目前的状况 来看,在这场较量中彷佛也是外挂占了上风。在这种状况下游戏厂商不得不使用封号的办法阻止玩家做弊,可是这又会形成玩家流失。有没有一种能有很好的反外挂 效果,而外挂又没法使这些检测失效的反外挂方法方案?这就是本方案所能作到的。算法


首先介绍一下本方案的基本原理。一个网络游戏客户端在运行时,从本质上说是一个从服务器接收数据,网络游戏客户端根据这些数据,加上用户鼠标键盘的输入, 计算出向服务器发送的数据,并把这些数据发送给服务器的过程。记录下一个客户端从服务器接收到的数据、用户鼠标键盘的输入,以及这些数据在客户端上被处理 的时间,就能计算出这个客户端应向服务器发送的数据。在用户没有做弊的状况下,即便在不一样的客户端从新计算,也仍然能获得相同的结果。quake(雷神之 锤)、星际争霸、cs(反恐精英)等游戏的录像功能使用的就是本原理。所以咱们只要比较两个客户端计算的结果,若是不相同,就能知道其中有客户端做弊了。

因为被检验的客户端和检验它的客户端都有可能做弊,例如检验它的客户端有可能谎报被检验客户端做弊,也可能谎报被检验客户端没做弊,所以两端的做弊都必须防止。咱们先来看一下具体怎么作。

一个网络游戏客户端链接服务器时,同时也链接另外两个用于对它进行验证的游戏客户端。在服务器传送给客户端的数据中含有从服务器上发出的时间。客户端把它 从服务器上接收到的数据D一、该客户端上鼠标键盘的数据D2,以及这些数据在客户端上被处理的时间D三、D4传送给两个用于验证的游戏客户端。为保证这些 数据不被修改,在传送给验证客户端前,D一、D二、D三、D4使用RSA算法加密。验证客户端根据D一、D二、D三、D4计算出被验证客户端应向服务器发 送的数据D5和D5的CRC校验D6,把D6传送给服务器。为防止被验证客户端在把D1传送给验证客户端前修改D1的数据,验证客户端也要把D1的CRC 校验D7传送给服务器。服务器计算被验证客户端发送给它的的数据D8的CRC校验D9,以及D1的CRC校验D10。比较D九、D六、D十、D7,若是 不相同,就能够知道有客户端做弊了。

下面来看看上面的方案在各类状况下是如何检测出哪一个客户端在做弊的。

假设被验证客户端在把D1传送给验证客户端前修改D1,服务器只需比较D十、D7就能知道被验证客户端是否修改了D1。

假设验证客户端谎报D1被修改,在验证客户端向服务器报告此问题时,服务器将要求验证客户端把D1传送给服务器。因为D1使用RSA算法加密,验证客户端 根本没法修改它,所以验证客户端是没法谎报D1被修改的。对于验证客户端谎报D二、D三、D4被修改的状况也与此相似。

假设被验证客户端使用加速外挂,因为D1中含有服务器发送它的时间,这个时间减D3或D4后的值D11应该是一个恒定值。若是这个值变化超过必定范围,例如两秒,就能够知道被验证客户端做弊了。

假设被验证客户端使用修改封包、内存、脱机等外挂,D九、D6一定不相同,因此只需比较D九、D6就能知道有客户端做弊。

在发现有客户端做弊后,服务器将要求验证客户端把D一、D二、D三、D4发送给服务器,由服务器计算被验证客户端应向服务器发送的数据D13。比较D八、 D13,若是不相同,就能知道是被验证客户端做弊。比较D五、D13,若是不相同,就能知道是验证客户端做弊。

假设被验证客户端为了逃避验证,不把验证数据发送给验证客户端。对于这种状况,若是两个验证客户端在一段时间内都没有收到验证数据,服务器能够断开被验证客户端的链接。

假如被验证客户端由于验证客户端下线等缘由和验证客户端断开了链接怎么办?只要另外一个验证客户端还能收到验证数据,就不会有什么影响。若是网络带宽容许, 甚至能够考虑链接三个验证客户端。这样即便有两个验证客户端谎报收不到数据,仍然不会对被验证客户端产生影响。在验证客户端和被验证客户端链接断开的状况 下,咱们须要让被验证客户端从新链接一个验证客户端。

应该如何从新链接一个验证客户端呢?对此须要每过必定时间,例如10秒,保存一次被验证客户端的状态。在验证客户端和被验证客户端链接断开时,被验证客户 端链接一台新的验证客户端,把此状态传送给新的验证客户端。新的验证客户端根据此状态,再加上被验证客户端传送给它的D一、D二、D三、D4就能继续计算 D5,从而继续对被验证客户端进行验证。若是被验证客户端和两个验证客户端的链接都中断了,咱们就须要中断服务器和验证客户端的链接。对于服务器计算 D13的状况也是同样,只要根据被验证客户端的状态,再加上D一、D二、D三、D4就能计算出D13 。

假如验证客户端老是不报告被验证客户端做弊,只要另外一个验证客户端工做正常就不会有影响。另外可让一些客户端故意传送给它错误的数据,若是它没有报告做弊,就可判断出此验证客户端在做弊。

假如被验证客户端故意传送给验证客户端没法用RSA算法解密的数据,或者验证客户端故意报告被验证客户端传送给它没法用RSA算法解密的数据怎么办?服务器没法区分这两种状况,因此只能做为被验证客户端和验证客户端链接中断来处理。

再来看一种状况。假设外挂经过某种方法让使用外挂的客户端互相联系,而且联合做弊怎么办?例如,一个使用了外挂的被验证客户端链接了两个验证客户端,其中 一个验证客户端也使用了外挂,另外一个没有。被验证客户端强行中断与没有使用外挂的验证客户端的链接,而另外一个使用了外挂的验证客户端却又不向服务器报告被 验证客户端的做弊行为。对此咱们能够每过一小段时间,例如30秒,就要求被验证客户端改变它的两个验证客户端。这个周期越短越好。在链接新的验证客户端 后,除了要求新的验证客户端验证当前被验证客户端和服务器之间的通信外,还要求验证以前30秒的通信。只要这时的两个验证客户端没有做弊,被验证客户端之 前30秒的做弊行为就能被检测出来。

本方案能够检测全部修改客户端网络输入输出数据的外挂,例如加速、修改封包、修改内存等。也不可能作出脱机外挂。在没有源代码的状况下,脱机外挂要输入和 输出和原游戏彻底相同的数据远比厂家本身还难。若是这样,外挂做者们不如写游戏赚钱了。目前国内外挂这么多,跟这些外挂做者没法经过正常的软件得到收入也 有关系。并且游戏每作一次小小的改动,外挂都得改得吐血。

本方案对于不修改客户端对外输入输出流的外挂是没法检测。什么状况外挂不会修改客户端网络输入输出数据?有两种状况,一种是使用程序模拟用户的鼠标键盘输 入,另外一种是修改显示。对于模拟用户的鼠标键盘输入的外挂,咱们能够用网页上经常使用的验证码的方式来对付。像网页上那样的验证码,人眼能够很容易辨认出其中 的数字,但用软件却很难辨认出,所以外挂也就没法工做。何况模拟键盘鼠标的外挂对游戏的影响比加速、修改封包、修改内存、脱机等要小得多,所以被一些人称 为绿色外挂。对于修改显示,传奇外挂显示人物血条的功能后来被厂商本身加入到游戏中。而在魔兽世界中显示血条的功能则是官方承认的插件,可见厂家对这种外 挂的承认。把墙体变成透明的一些程序,若是游戏中没有阻碍视线的墙体就没有用处。在雷神之锤(QUAKE)或反恐精英(CS)中,把墙体变透明后,就能看 见墙后面的人,或者血和甲。这是由于在客户端上实际有这些数据,只是在正常状况下游戏不在屏幕上显示出来。对此,咱们可让服务器不把这些在正常状况下玩 家看不到的东西的数据传送给客户端。

因为本方案是即时的,因此在检测到客户端做弊后能够当即断开该客户端的链接。这要比过后封号更容易让用户接受。因为验证客户端须要把D一、D二、D三、 D4传送给被验证客户端,因此每增长一个验证客户端,被验证客户端所需的网络带宽就须要增长大约0.5倍。可是一个不使用本方案的网络游戏实际所需的网络 带宽是不多的,一般在每秒1K字节左右,因此即便被验证客户端链接两个验证客户端,所需的网络带宽也只有大约2K。并且一些对游戏没有影响的数据,例如玩 家在游戏中的聊天,或者服务器发送的广告等,不须要发送给验证客户端,所以所需的带宽还能更少。

在本方案中已经假设了不少种外挂以及它们的抵御方法。若是您认为还有本方案中没法抵御的外挂,欢迎假设出这种外挂对本方案进行虚拟攻击。您能够 给我邮件或者到 游戏玩家论坛发表您的方案。我将改进个人方案,以抵御您的攻击(若是我能作到的话)。若是对本方案有任何问题能够 给我邮件或在 论坛上提出,我将在 个人主页上给您解答。

本方案已申请专利。寻求业务合做以及投资。个人邮件地址是wangrong1000@hotmail.com 。服务器

不得不说该做者的思路很是的有创意.网络

相关文章
相关标签/搜索