大家好,我是时雨。我又来了,今天我们来聊聊大家可能比较感兴趣的问题,Roblox的外挂以及反挂手段。
【本篇简介】
我将介绍一款在国外风靡一时的外挂软件的运作机制(我不会透露关于这款软件如何获取和使用,因为这有损一部分人的利益)以及如何针对这类外挂进行一些基本的防范。
【正文】
有句话前段时间传得很广,说是
“Everything died except for synx…”
那么究竟什么是synx?
Synapse X又称为SynX或darkdev,也就是用其中一部分的功能概括整个软件的一种命名简称。Synapse X是合法化软件,这点我们不应当觉得奇怪,因为在国外连某颜色网站都可以合法化,外挂合法也不是什么稀罕的事情。这款软件很多人对它的理解非常片面,实际上synx不仅具备外挂的能力也有反制外挂的能力,但绝大多数黑客本身并不太擅长代码也不会制作完整的游戏。根据国外一位网友的调查显示80%左右的Roblox黑客都是18岁以下的人,他们绝大多数都是利用synx的外挂系统破解游戏,这80%的人群在平台上并没有一款像样的成品。
关于这个软件的简介就此打住,我们来聊一聊最常用的两种作弊软件用途。
※第一种是Material Stealer。也就是盗素材。synx万恶的功能中有一项就是提供下载游戏的渠道。下载的部分是客户端,也就是说所有客户端脚本客户端素材包括ReplicatedFirst和ReplicatedStorage(这就是为什么我把他们叫客户端优先加载和客户端存储的原因)中的所有内容。需要强调的是,这些客户端内容中的服务器脚本不会被反编译,但是ModuleScript如果是放在客户端是会被破译的。
※第二种是Cheating。也就是常见的作弊。然而Cheating的本质是Remote Spy。什么是Remote Spy呢?打个比方说,我现在要购买一瓶无敌药,但无敌药需要1000金币,假如我在客户端判定玩家是否够1000金币并且在不够的时候提醒玩家去赚取更多金币的话,那么正常玩家肯定会去刷更多金币。然而外挂玩家会直接绕开你的一切判定FireServer,获取无敌药。如此一来如果你的数据安全不到位,并且没有服务器判定的话,玩家就能利用这个漏洞无限刷无敌药。同样的,目前很多创作者的游戏都有这样类似的漏洞,我前一段时间听我身边一位制作人说他的游戏有人发现了漏洞无限刷钻石,结果他那个月游戏在线虽然上升了一倍,但是收入却下降了一倍。换言之,如果说你不对外挂采取制裁,那么你的游戏就像一个决堤的大坝,最后辛苦归辛苦但血本无归,只能靠补贴汲取一些安慰。
那我们该怎么防范呢?
方法一将所有重要数据存在服务器。
这种方法其实在官方的排行榜教程中有过一小段介绍但未详细阐明。
我们应当还记得,在官方给出的排行榜范例中,我们首先需要在player下新建一个叫leaderstats的文件夹,将需要排序的数据放在第一个,其他需要展示的数据放在第二三四个,最多只能展示leaderstats前4个数据。这个运作原理在移动端和PC端都是一样的。
那这和我要说的服务器数据安全有什么关系呢?别急。
排行榜的数据安全我们有目共睹,存储在leaderstats中的数据坚固如山一般,有种绝对的权威感。
我们的做法就是仿照这种写法在服务器中新建的文件夹用来存储我们需要存储的数据。注意,所有这些操作都在服务器脚本进行。
然后我们再将需要存储的数据新建出来之后放进对应的文件夹即可。类似这样:
这样做的好处是,我们的每一个重要游戏数据都是存储在服务器端,也就是说假如客户端对数据进行任何篡改,服务器的数据都不会发生变化。
当我们需要使用这些数值时,可以直接在客户端调用。这是Roblox编辑器的一个非常强大的地方,服务器数据的修改会立即同步到客户端,所以不影响客户端的调用和客户端关于服务器数据.Changed这类事件的使用。
当我们离开游戏时对数据进行存储即可,关于数据存储我会在以后的内容中详细讲述,如何正确应用存储确保数据能够100%保存成功,以及世界排行榜的写法等等。
方法二在服务器增加额外判定。举例说明,如果一个客户端事件是攻击,但是服务器没有对攻击设置间隔,那么通过RemoteSpy,黑客可以轻易做到无间隔攻击,一秒进行60此判定。额外间隔设置有很多种方法,在这里我想介绍下我的方法。
在服务器对攻击指令进行处理的时候我们增加如下代码。这里NormalAttackCounter是一个我预先存放在服务器的NumberValue(lua的一种数值类型,用于存储小数可以理解成加强版的double)。每次攻击时让NumberValue的数值为os.clock()。这里用os.clock()是因为os.clock()可以精确到小数,但os.time()只能精确到整数。如此一来,下一次攻击我们判定当前的时钟时间是否大于我们给定的攻击间隔,如果判定小于此间隔则返回空值。
不知道各位能否理解我上面的表述,简而言之就是在前面方法一提到的基础上,我们增加一个时间记录值,让每次判定都与上一次记录的时间作比较,避免事件逐帧判定。有些游戏的服务器缺乏这种判定,还可能导致黑客的DoS攻击,也就是我们通常说的炸服。如果服务器接收处理事件速度过快,超过处理能力,那么服务器就会进入慢速服务以确保不影响其他服务器功能,但是这个被攻击的服务器就无法正常运作了。所以这一步对于服务器保护也有一定作用,可以避免被一些不良黑客频繁炸服影响玩家体验,降低好评率和在线量。
但是如果我们对每一个事件都增加这样的判定未免会导致玩家需要的运行时常量过多,也不太好。所以我们还可以这么做,
我们强制限定一个事件接收频率,超过该频率就不接收事件。这样在一些非密集型事件中可以避免实例化大量玩家的运行时常量。
但是我们无法避免游戏被窃取怎么办呢?
地图的话,我目前也没有很好的办法。最常见的一种方法是让地图在反编译的过程中生成.lock文件导致被窃取的地图无法打开。但目前这种方法的代码还没有开源,或者我还没有找到,等我找到或者研究出来后再与大家分享。
但是代码的话却可以防范。一种最简单的方法就啊将你代码的长度,我指的是每个localscript的行数,排除空行和过短的行以外,扩充到2000行以上。由于synx破解时有设置一个非常良心的timeout,让一些非常复杂的代码无法在规定时间内被破译出来而超时。在后续打开的地图脚本中会看但–synapse X failed to decompile之类的语句。除此之外的防范手段对代码能力有一定的要求,这里先点到为止,以后我们有空再详细叙述。
※除了数据安全,游戏中的移速、跳跃高度、是否能飞行之类的外挂也比比皆是,但这类外挂最多影响体验,很难对游戏数据安全构成较大威胁。
最后我还有一点想补充,我们要尽量杜绝使用外挂,因为实际上当我们大量使用别人的地图别人的道具后我们就会丧失自己的创作力和创作欲望,最后变成了看到别人做什么游戏我们就做什么游戏,看到别人做什么玩法我们就模仿着做什么玩法。这样我们最终什么也得不到,我们只会在这条歧路越走越远,然后丧失一切想象力,变成一个内卷的机器。这是游戏行业最不想看到的那样。曾经我和一位年长的创作者聊天,其实过去十多年来,国内的游戏行业就是这样,在无限的内卷无限的模仿中迷失了方向。我们要做出自己的东西,表达自己真正想要表达的世界观,这才是作为一个游戏人做高的荣誉。