Battleye反作弊防止外挂脚本注入指南


七龙 发布于 2021-04-15 / 149 阅读 / 0 评论 /
大家好!还是我七龙,这里将讲述我对过滤器的使用理解与我自己的方式,可能包含错误或者不准确的地方,还请指出,多多包含! 我注意到 Arma 开服这块严重缺乏有关 BattlEye 的信息,甚至一些不懂脚本的人都能复制别人的所谓外挂代码来执行(其代码可能它自己都不知道)达到作弊效果,本指南将概述 BE

大家好!还是我七龙,这里将讲述我对过滤器的使用理解与我自己的方式,可能包含错误或者不准确的地方,还请指出,多多包含!

我注意到 Arma 开服这块严重缺乏有关 BattlEye 的信息,甚至一些不懂脚本的人都能复制别人的所谓外挂代码来执行(其代码可能它自己都不知道)达到作弊效果,本指南将概述 BE 过滤器 和 BEServer.cfg

我将以通俗来讲述反作弊过滤器的使用方法!

目录:

  1. Battleye过滤器是什么?
  2. Battleye过滤器的7种执行操作
  3. Battleye过滤器的2种匹配类型
  4. 过滤器实战
  5. 异常函数约定
  6. 添加异常匹配
  7. 错误分析 找到规则触发者 Kick Restriction #000
  8. 关于 BEServer.cfg 中配置基本规则限制

1.BattlEye 过滤器是什么:

BE 过滤器是Arma 游戏的BattlEye 反作弊的可选功能。它们提供了一些额外的保护,可以由服务器管理员定制。

我服务器开了BE就安全了吗?

是防君子不能防小人,BE并不是全能,外挂还是能轻松注入脚本的,比如炸服脚本,但凡执行的脚本,就可以使用过滤器来阻止外挂并且记录在案,放到封神榜!

我用的infiSTAR能反外挂吗?

infistart是国外付费的一款反黑客+管理工具,它的确能做一些反脚本注入,但是很有局限性,通常来说国内的人用的infi并没有完全使用它的反作弊功能,也就开了一点简单的默认

并且服务端不一,需要会技术的人来专门针对性做深度配置才能到达理想效果!

远程执行白名单CfgRemoteExec能反外挂吗?

远程执行白名单,通俗来说就是发起远程调用的函数给他加以限制,让他只能在指定的范围内使用,它确实能达到一些效果,但是对于注入脚本来说,显得很脆弱!但是绝对不能忽视CfgRemoteExec,如果不对函数加以限制,会导致非常恐怖的后果,作弊者可以让任何玩家执行代码!甚至可以让特定玩家触发BE被踢出!,除了开启函数白名单,针对一些公共的服务端,由于非常多的人知道此端的函数名和执行范围,建议对函数进行更名。

Battleye过滤器是什么?它在arma3服务端上发挥什么作用?

BattlEye 过滤器是波西米亚使用的反作弊,当你的服务器启用它时,他会扫描客户端上所有正在运行的脚本,和服务端命令上特定的关键词,如果匹配到就会执行操作,至于什么操作待会在说。

如何启用Battleye过滤器?

那么,怎么样才能防止外挂? 这里介绍Battleye,国内服主基本上不会去动这个东西,因为不懂...

在你开服参数中的-profiles 指向 的文件夹内有一个BattlEye文件夹,在里面建立 scripts.txt 里面书写反作弊规则

当然,里面不单单只有scripts.txt

scripts.txt

[在哪些命令参数中搜索关键字] :客户端上运行的所有脚本。
[可以用来干啥]:可以包含指定关键字的语句 或 包含围绕脚本中的几行。这很有用,因为它揭示了作弊脚本中的更多内容。然后可以根据这些作弊代码信息来添加反作弊。
[外挂一般干啥]:想炸你服。
注意:目前 scripts.txt 是唯一不支持正则表达式的过滤器。这意味着在 scripts.txt 中唯一需要以\开头的字符是双引号"和\本身(当字面意思使用时)。

这是最密集的过滤器,因为它搜索客户端上运行的所有脚本,而不仅仅是特定的命令参数。因此建议限制该文件中的关键字数量。使用命令通常比特定的语句、字符串或变量名更具包容性。如 publicvariableval.txt,如果您的模组使用带有通配符值的变量(例如玩家姓名或文本输入框),请注意您使用的关键字。用户可以输入任何内容。

在客户端上运行的脚本可以包括任务和服务器插件脚本。Arma 游戏插件和 BIS 函数的脚本也会在任务加载期间和执行某些操作时在客户端上自动运行。这意味着仅在任务和服务器 pbo 中搜索关键字的出现是不够的。您需要彻底测试您的 scripts.txt 以确保包含所有合法的例外。

addbackpackcargo.txt

[在哪些命令参数中搜索关键字] :addBackpack 它会在背包名中搜索关键字。
[可以用来干啥]:比如你服务器根本不可能获得这种背包。
[外挂一般干啥]:可以生成一堆背包,或者生成服务器内不允许的大背包啥的。

addmagazinecargo.txt

[在哪些命令参数中搜索关键字] :addBackpack 它会在(弹夹/物品的类名)中搜索关键字。
[可以用来干啥]:比如你服务器根本不可能获得这种(弹夹/物品的类名)。
[外挂一般干啥]:可以生成一堆(弹夹/物品的类名),或者生成服务器内不允许的弹夹/物品的类名。

addweaponcargo.txt

[在哪些命令参数中搜索关键字] :addWeapon 它会在武器类名中搜索关键字。
[可以用来干啥]:比如你服务器根本不可能获得这种武器。
[外挂一般干啥]:可以生成一堆武器,或者生成服务器内不允许的武器。

attachto.txt

[在哪些命令参数中搜索关键字] :attachTo 它会在对象类名中搜索参数。并且只适用于全局对象,局部对象不会触发它。
[可以用来干啥]:防止对所有玩家啥的附加对象(载具,AI啥的)。
[外挂一般干啥]:常见的"叠罗汉",高爆子弹,脚下GBU等,遍历所有玩家,创建一个自身AI附加到当前玩家身上。并且可以用于各种目的,包括传送(被附加的单位会被立即移动)。

createvehicle.txt

[在哪些命令参数中搜索关键字] :createVehiclecreateUnit 它会在载具类名中搜索参数。并且只适用于全局对象,局部对象不会触发它。
[可以用来干啥]:防止创建不应该存在的AI,载具。
[外挂一般干啥]:常见的创建炸弹,刷载具,刷AI和其他物体。
注意:如果启用了环境,Arma 会在客户端自动创建动物。当车辆被摧毁时,客户端也会自动创建一些爆炸,例如 SmallSecondary、HelicopterExploBig 和 HelicopterExploSmall

deletevehicle.txt

[在哪些命令参数中搜索关键字] :deleteVehicle 它会搜索被删除对象关键字,并且只适用于全局对象,局部对象不会触发它。
[可以用来干啥]:防止删除服务器里的牌子等。
[外挂一般干啥]:常见删除服务器内的牌子,箱子,鼠标指向的对象等。

mpeventhandler.txt

[在哪些命令参数中搜索关键字] :addMPEventHandler 它会搜索命令参数关键字。
[可以用来干啥]:防止添加除你服务器之外的事件。
[外挂一般干啥]:可以向其他玩家添加事件,并且事件触发时会在其他玩家的电脑执行。如果是触发规则的代码那么这个玩家会被T。

publicvariable.txt

[在哪些命令参数中搜索关键字] :publicVariable[Server] 它会搜索变量名。
[可以用来干啥]:防止公开你服务器内不允许的变量名。
[外挂一般干啥]:可用于向服务器和所有连接的客户端广播变量。覆盖现有的全局变量值(尽管这在 Arma 3 中使用compileFinal是可以避免的)。
注意:在 remoteExecCall/remoteExec或 Arma 3 等效的 BIS_fnc_MP 分别使用变量名 remExField、remExFP 和 BIS_fnc_MP_packet。像 infistar 这样的反黑客脚本会从客户端广播公共变量以记录活动并向管理员通知检测结果。大多数模组还从客户端广播一些公共变量来通知玩家登录(如一些生活服)。

publicvariableval.txt

[在哪些命令参数中搜索关键字] :publicVariable[Server] 它会搜索变量名。
[可以用来干啥]:防止公开你服务器内不允许的变量名。
[外挂一般干啥]:可用于向服务器和所有连接的客户端广播变量。覆盖现有的全局变量值(尽管这在 Arma 3 中使用compileFinal是可以避免的)。
注意:这也适用于传递给调用 remoteExecCall/remoteExecBIS_fnc_MP 的参数,因为它们已分配给公共变量。如果您的 mod 广播带有通配符值的公共变量(如玩家名称或文本输入框),请注意您使用的关键字。用户可以输入任何内容。

remotecontrol.txt

[在哪些命令参数中搜索关键字] :remoteControl 使用它记录。
[可以用来干啥]:除非你服务器需要它,比如远程控制无人机什么的否则应该避免使用。
[外挂一般干啥]:尚不清楚。

remoteexec.txt

[在哪些命令参数中搜索关键字] :remoteExecCall/remoteExec 语句参数。
[可以用来干啥]:防止进行远程执行。
[外挂一般干啥]:可以将预定的作弊代码/函数进行远程执行(给所有玩家,给服务器或给指定玩家)。影响范围广,影响安全巨大,建议配合 CfgRemoteExec 进行防范。

selectplayer.txt

[在哪些命令参数中搜索关键字] :selectPlayer 单位类名。
[可以用来干啥]:防止外挂用,如果服务器不需要请禁用。
[外挂一般干啥]:什么附身玩家等,控制玩家。
注意:当在大厅中选择一个玩家位置时,客户端会使用 selectPlayer 来选择你的任务中占据该位置的单位类型。

setdamage.txt

[在哪些命令参数中搜索关键字] :setDamage 它会搜索数字参数(0-1)。只适用于全局对象,局部对象不会触发它。
[可以用来干啥]:防止服务器内全局对象之外的值。
[外挂一般干啥]:杀死玩家,修复载具,破坏物体。

setpos.txt

[在哪些命令参数中搜索关键字] : setPos[ASL/ATL] 它会搜索对象类名。只适用于全局对象,局部对象不会触发它。
[可以用来干啥]:防止服务器内对全局对象之外设置坐标。
[外挂一般干啥]:传送玩家或物体
注意:在编辑器中放置高度调整的建筑物、单位和对象可能会自动将 setPos 命令放在他们的任务.sqm 文件中的初始字段中。init 字段在所有客户端上运行,因此建议在 init 字段之外并仅在服务器上使用 setPos 命令。R3F 和 BTC 脚本也在车辆和物体上使用 setPos

setvariable.txt

[在哪些命令参数中搜索关键字] :setVariable 它会搜索变量名参数。仅适用于广播 setVariable(即第三个参数必须为 true 广播),本地 setVariable 不会触发。
[可以用来干啥]:防止除了服务器内,来自客户端广播的变量。
[外挂一般干啥]:setVariable 可用于更改设置在玩家和对象上的变量值,例如生活服刷钱等。

setvariableval.txt

[在哪些命令参数中搜索关键字] :setVariable 存储在对象上的值。仅适用于公共 setVariable(即第三个参数必须为true),本地 setVariable 不会触发。
[可以用来干啥]:如何配置此过滤器取决于您如何(或是否)在客户端上使用公共 setVariable,但目标是限制可以发送到服务器和其他客户端的内容。踢命令和关键变量和函数名称对于防止发送后将被编译和执行的代码很有用。
[外挂一般干啥]:setVariable广播 可用于在远程对象上存储代码和其他值。该值稍后可能会被使用,甚至可以在远程机器上编译和执行。
注意:像 publicvariableval.txt 和 scripts.txt 一样,如果你的 mod 使用带有通配符值的公共 setVariable(例如玩家姓名或文本输入框),请注意你踢的关键字。用户可以输入任何内容。

teamswitch.txt

[在哪些命令参数中搜索关键字] :teamSwitch 使用它记录。
[可以用来干啥]:防止调用除你服务器之外的teamswitch。
[外挂一般干啥]:尚不清楚。

waypointcondition.txt

[在哪些命令参数中搜索关键字] :setWaypointStatements 搜索条件参数。
[可以用来干啥]:除非你的服务器需要这个命令。或者除了你的服务器使用的确切条件字符串之外的所有内容都需要踢。
[外挂一般干啥]:尚不清楚。
注意:一旦航路点完成,Arma 会自动再次运行 setWaypointStatements,条件为“true”。这意味着如果您完全使用此命令,您将始终需要在此文件中添加!="true"作为例外。

waypointstatement.txt

[在哪些命令参数中搜索关键字] :setWaypointStatements 搜索语句参数。
[可以用来干啥]:除非你的服务器需要这个命令。或者除了你的服务器使用的确切条件字符串之外的所有内容都需要踢。
[外挂一般干啥]:setWayPointStatements 语句参数可用于在服务器和所有连接的客户端上远程执行代码。
注意:一旦航点完成,Arma 会自动再次运行 setWaypointStatements,并使用空字符串 "" 作为语句。这意味着如果您完全使用此命令,您将始终需要在此文件中添加!=""作为例外。

2.BattlEye 过滤器7种执行操作

be过滤器有7个操作,分别如下:

  • 1 = 仅记录到 .log 文件。
  • 2 = 仅记录到控制台窗口。
  • 3 = 记录到 .log 文件和控制台窗口。
  • 4 = 踢人而不生成 .log 条目。
  • 5 = 仅踢人并记录到 .log 文件。
  • 6 = 仅踢人并登录到控制台窗口。
  • 7 = 踢人并登录到 .log 和控制台窗口。
    控制台窗口指的就是你开arma3服务端的白色小窗口,log是你配置的过滤器文件下生成的.log文件

3. BattlEye 过滤器两种匹配类型

上下文中说的异常,指的是当过滤器抓取到了sqf,假设你过滤器写了一个函数和规则, 恰好客户端触发了,这就产生了异常sqf,而异常通常代指你写的规则

!= 完全匹配符 当规则有这条,就表示参数必须是完全匹配,意思是如果你执行了某函数,在scripts里定义的关键词函数整个语句都必须与异常完全匹配
! 包含匹配符 当规则有这一条,就表示参数里包含了异常

4.过滤器规则实践

添加一个关键词,当发现这个关键词时T人打开scripts.txt

在开头第一行写//new2 这个是协议规定,不能改的 然后另起一行

异常是支持正则表达式的,然后 凡是异常中的代码带引号都要反斜杠,带空格的代码都要带引号

异常规则

如何写一个规则?大概格式是这样

要执行的操作ID(1-7) 关键词 规则

在scripts中是这样:

执行方式 触发关键词 匹配类型 异常

1 "allPlayers" 意思是,当有人执行了allPlayers函数,会被记录,为什么用引号,其实用不用无所谓吧,有空格就要引号

1.使用scripts.txt通过记录作弊者执行的脚本来做反作弊过滤器

1 "" 里面是空的,表示客户端执行的所有脚本都会被记录到.log文件

为什么要怎么做?因为这样将有利于分析外挂使用者注入的脚本,他执行的脚本将会被记录!

2.使用createvehicle.txt过滤器 禁止某些东西在服务器内生成

假如我服务器是没有坦克的,想当玩家生成了一辆坦克,就把这个人踢掉,并且记录他执行的脚本代码该如何做呢?

这里拿T100来说,T100的class是 O_Truck_03_medical_F 创建载具的函数是 createVehicle

createvehicle.txt 是当玩家执行创建对象的时候执行,这个对象可以是载具,或者其他 ,假如我在 createvehicle.txt 过滤器里写了这一句规则

5 " O_Truck_" !" O_Truck_03"

解释: 表示从玩家客户端捕获脚本以 O_Truck_ 开头的. ! 感叹号上面说过,规则里要包含这一条,规则是 O_Truck_03

然后某玩家执行了创建载具函数:

createVehicle ["O_Truck_03_ABC_F",getPosATL player,[],10,"NONE"];

是不会被T和记录日志,为什么? 因为 ! 的匹配机制是包含,上面玩家执行的创建sqf确实包含了 O_Truck_03_medical,所以他不会被T

什么情况下会被踢出去?

createVehicle ["O_Truck_04_ABC_F",getPosATL player,[],10,"NONE"];

当玩家执行这句的时候会被T,因为捕获到了O_Truck,但是O_Truck_03 这个规则 内不包含O_Truck_04_ABC_F

如果把匹配类型改成 !=

5 "O_Truck" !="O_Truck_03_medical_F"

上面的两个实例都会被T,因为参数不完全匹配为O_Truck_03_medical_F,什么情况下不会被T?

createVehicle ["O_Truck_03_medical_F",getPosATL player,[],10,"NONE"];

是不会被T的,因为他完全匹配,一般来说,在createvehicle.txt使用 ! 异常比 != 更有效,但是在scripts中尽量使用!=

上面说的这些规则,在scripts.txt里的工作方式是不一样的!

5.异常函数约定

这个其实不是官方的内容,官方也没有,这是我的想法,我称之为约定,什么叫异常sqf代码函数约定,假设我服务端的代码中遍历了全体玩家

这是外挂注入脚本用的最多的方式,我们来约定一种函数,只能通过这种函数来调用,否则识别为黑客代码T掉

我们在任务里封装一个函数假设为: destiny_fnc_allPlayers ,其内容为

_DestinyAllPlayers = allPlayers

_DestinyAllPlayers

调用该函数返回一个全部玩家数组,任务混淆,防止外挂使用者扒取代码,然后在过滤器中写

5 "allPlayers" !="_DestinyAllPlayers = allPlayers"

然后代码中全部使用到allPlayers的函数全部替换为 destiny_fnc_allPlayers

当外挂注入者执行了一个杀死全体玩家的脚本,他肯定会这样写

{
	_x setDamage 1;
} forEach allPlayers;

意思是,循环全体玩家,然后全部杀死,但是在执行前会被反作弊扫描到,从而匹配到我们上面写的规则,触发异常, 异常是forEach allPlayers; 然后被服务器T掉

因为他使用了allPlayers,但是它使用的规则不是 _DestinyAllPlayers = allPlayers,只要不是全部T掉,这就是我说的约定,客户端脚本与我写的规则做了一个约定,约定只能使用这种格式来获取全体玩家!

凡是违反约定的执行代码方式,都会被T,从而达到反作弊效果!

6.添加异常为完全匹配

使用上面的方式因为是!=,完全匹配会遇到一个问题,就是可能官方也用到了这个,或者你用了别人的任务服务端也会出现这个,不好加以约束,我该如何呢?

我们可以这样,1 "allPlayers" 来记录用到allPlayers的函数

然后我们会在scripts.log中看到触发的代码,例如:

22.04.2022 23:11:16: RIO (192.168.0.111:2304) b8a252f8aabd48365cf071e5a2bf011d - #31 "xxx_fncxxx = {

params ["_object"];

_p = allPlayers;"

复制最外面的引号之间的代码,如下:

"xxx_fncxxx = {

params ["_object"];

_p = allPlayers;"

遵循上述规则,在每次出现的引号前"加上反斜杠\。由于这是针对scripts.txt,我们可以忽略正则表达式元字符。Notepad++ 等文本编辑器可用于快速替换所有出现的"with "。

\"xxx_fncxxx = {
\n
params ["_object"];
\n
_p = allPlayers;\"

格式化为一行

\"xxx_fncxxx = {\nparams ["_object"];\n_p = allPlayers;\"

由于包含空格,就要引号阔起来,这个异常就好了,然后需要添加一个! 或者 != 让他识别为异常,我们使用!= 因为更安全

!="\"xxx_fncxxx = {\nparams ["_object"];\n_p = allPlayers;\""

最后,必须将整行代码添加到与相对应的地方,假如T人

5 allPlayers !="\"xxx_fncxxx = {\nparams ["_object"];\n_p = allPlayers;\""

7.错误分析 找到规则触发者 Kick Restriction #000

有时候进去服务器被T,例如显示

23:05:25 | Player #31 RIO (192.168.0.111:2304) (b8a252f8aabd48365cf071e5a2bf011d) has been kicked by BattlEye: Script Restriction #110

显示一些正常的函数都触发了,怎么找到并且排除这个问题呢?

这里提供了3个消息, 发生时间,玩家名称, 被T的消息和编号

首先找到触发日志.这里提示我触发了scripts.txt,就去找到scripts.log

根据时间找到 编号为 #110的,就可以看见我们触发了什么!

22.04.2022 23:05:25: RIO (192.168.0.111:2304) b8a252f8aabd48365cf071e5a2bf011d - #110 "namespace getvariable ["BIS_fnc_arsenal_light",objnull];
deletevehicle _center;
deletevehicle _sphere;
deletevehicle _light;
上面就是触发的代码, 如果想完全包含,按照低6章教程即可!

8.配置BEServer.cfg的基本规则

很多人仅仅知道在这个文件里配置rcon,其实它还可以提供强大的规则,有些服主rcon无法连接,此文件的规则不生效,请开启你的BE反作弊!

在你开服参数中的-profiles 指向 的文件夹内有一个BattlEye文件夹,在服务器运行时,它会自动重命名为 BEServer_active_xxxx.cfg 以确保安全。它必须至少包含服务器 RconPort 和 RConPassword。如果你没有此文件可以新建一个txt文件将文件格式改为cfg,使用x64开服就命名为:BEServer_x64.cfg,如果不是x64将它命名为BEServer.cfg

首先我们来看一个基本示例:

RConPassword rcon123456789
RconPort 7410
MaxAddBackpackCargoPerInterval 20 1
MaxAddMagazineCargoPerInterval 400 1
MaxAddWeaponCargoPerInterval 75 1
MaxCreateVehiclePerInterval 150 1
MaxDeleteVehiclePerInterval 100 1
MaxSetDamagePerInterval 3 1
MaxSetPosPerInterval 10 1

格式为:
Max[Command]PerInterval [最大使用次数] [以秒为单位的时间]
在示例中,如果 setDamage 在 1 秒或更短的时间内使用了 30 次或更多次,它将触发 setDamage 计数限制,并且会被T出服务器。

用于每秒最大使用次数的值会因 mod 的不同而有很大差异。上述值是一个松散示例。为了获得最佳值,您需要从可能的最严格(最低)限制开始试验每个命令,并增加它直到没有引起踢出服务器。这将需要大量测试,因为只有某些动作或事件可能会触发踢出玩家。也可以提高时间,让限制更加严格。

命令:

MaxSetPosPerInterval

[作用]:限制 setPos[ASL/ATL] 的使用,仅用于全局对象。
[外挂一般干什么]:setPos 可以快速传送服务器上的所有玩家 (50+) 或对象 (300+)。
注意:请记住上面 setPos 下关于高度调整的全局建筑物的注释。加载时,它们可以在一秒钟内在客户端上运行数百次 setPos(取决于建筑物的数量)。为避免这种情况,应仅在服务器机器上生成和定位建筑物。

MaxSetDamagePerInterval

[作用]:限制 setDamage 的使用,仅用于全局对象。
[外挂一般干什么]:setDamage 可以快速杀死所有玩家(50+),摧毁服务器上的所有车辆(300+)或物体和建筑物(数千)。

MaxAddBackpackCargoPerInterval

[作用]:限制 addBackpack 的使用
[外挂一般干什么]:addBackpack 可以快速生成许多背包。

MaxAddMagazineCargoPerInterval

[作用]:限制 addMagazine 的使用
[外挂一般干什么]:addMagazine 可以产生许多弹药和物品。
注意:当玩家从弹药箱、保险箱和车辆货物等大型存储单元中取出物品时,addMagazine 每秒会在其客户端上自动运行多次。

MaxAddWeaponCargoPerInterval

[作用]:限制 addWeapon 的使用
[外挂一般干什么]:addWeapon 可以快速生成许多武器。
注意:当玩家从弹药箱、保险箱和车辆货物等大型存储单元中取出武器时,addWeapon 每秒会在其客户端上自动运行多次。

MaxDeleteVehiclePerInterval

[作用]:限制 deleteVehicle 的使用
[外挂一般干什么]:deleteVehicle 可以快速删除服务器上的所有车辆(300+)或对象(数千个)。删除服务器用于交互的物体。
注意:如果从客户端运行服务器清理脚本,您将从客户端删除数百个对象,包括尸体、武器持有人、残骸等。建议清理仅服务器上运行。

MaxCreateVehiclePerInterval

[作用]:限制 全局 createVehicle、createUnit 、createAgent 的使用
[外挂一般干什么]:createVehicle 可以在服务器上大量生成对象。一般炸服代码,就是死循环中不断创建炸弹。

最后
**
BE过滤器指南看到这里我相信你已经拥有了会自己配置反作弊规则的能力!**

参考:

https://github.com/AsYetUntitled/Framework/wiki/BattlEye-Filters

https://opendayz.net/threads/a-guide-to-battleye-filters.21066/



评论