BeansAC

BeansAC

BeansAC(无聊的漏洞分析通知系统)是一个Minecraft服务端反作弊模组,通过拦截数据包实现模组兼容性。

管理

BeansAC

一个面向 Minecraft 的服务端反作弊插件。即插即用,通过 TOML 配置,开箱即用效果不错。


设计理念

大多数反作弊插件在模组服上表现不佳,因为它们硬编码了原版假设。BeansAC 采用了不同的方法:

  • 注册表扫描:启动时扫描所有 Forge 注册表,获取模组方块、物品、附魔和效果。动态调整检测阈值,而非维护兼容性列表。
  • 物理模拟:对每个玩家运行移动模拟,考虑活跃效果、附魔和环境条件。标记与预期行为的偏差,而非使用平均硬编码速度上限。(这花了我数小时完成。)
  • 基于事务的延迟:在连接层面追踪每个玩家的 RTT。利用此数据调整到达距离、速度和时序检测,避免高延迟玩家产生误报。
  • 服务器卡顿弹性:当服务器刻时间超过 100 毫秒或单个玩家延迟飙升时,所有检测自动跳过。

27 项活跃检测

包 检测项
移动 速度、飞行、穿墙(200 刻宽限期)、无摔落、计时器(1.5 秒窗口,2.5 倍比率)、速度、水上行走、鞘翅、载具
战斗 到达距离、自动点击、攻击冷却、自动格挡(使用物品→攻击间隔 50 毫秒内)、命中箱(实体边界框 ≥4.5)
背包 复制、容器(槽位边界 + DataValidator NBT 验证)、创造匹配(创造模式生成物品验证)
协议 异常数据包(NaN/无穷大/俯仰角边界)、Ping 欺骗(200 刻宽限期,延迟自适应)、数据包顺序(攻击/挥动顺序 + 挖掘状态机)、负载速率(每秒 10 个自定义负载)
世界 搭路、快速破坏(逐块追踪,ABORT/START 序列)、快速放置(30 毫秒间隔)、核爆(射线追踪视线 + 模式检测)

每项检测均可逐项配置:enabled、maxVl 和 punishment(踢出/封禁/警告)。


模组感知架构

BeansAC 不硬编码兼容性。启动时:

  1. RegistryScanner 遍历所有 Forge 注册表(物品、方块、附魔、生物效果、实体)。缓存哈希值以便后续启动。
  2. MovementSimulation 通过运行时扫描玩家的活跃效果和穿戴附魔,计算每个玩家的最大速度,从而使模组效果自动扩展速度范围。
  3. PossibilityMap 标记未知附魔/效果,并应用宽松乘数,而非错误标记。
  4. SandboxManager(可选):当检测到不确定行为时,启动无头 Forge JVM,针对实际模组代码测试数据包。

数据验证

DataValidator 单例验证所有进入服务器的物品 NBT,覆盖所有路径:

  • 容器点击(ServerboundContainerClickPacket)
  • 创造模式背包(ServerboundSetCreativeModeSlotPacket)
  • 书本编辑(ServerboundEditBookPacket —— 页数、页长、控制字符)
  • 铁砧重命名(ServerboundRenameItemPacket —— 名称长度)
  • 附魔注册与等级合理性
  • NBT 深度限制(防止递归标签炸弹)
  • 烟花效果数量、头颅纹理大小

误报抵抗

BeansAC 优先容忍漏报而非误报。关键缓解措施:

  • 线程安全 —— PacketInterceptor.onInboundPacket() 和 onOutboundPacket() 使用 server.isSameThread() 进行保护。防止 Netty IO 线程导致状态损坏。
  • 服务器卡顿跳过 —— 当 server.getAverageTickTime() > 100ms 或单个玩家延迟飙升时,CheckManager.runAll() 提前返回。
  • 宽限期 —— PhaseCheck 在出生/传送后等待 200 刻。PingSpoofCheck 等待 200 刻。AutoClickerCheck 需要至少 12 个样本。
  • RTT 补偿 —— 到达距离、攻击冷却和速度检测考虑每个玩家的平滑 RTT。
  • 违规等级衰减 —— 违规等级每刻衰减 1,防止误报累积处罚。
  • 模组物品容忍 —— ElytraCheck 接受胸部槽位中任何非原版物品作为潜在鞘翅,而不仅仅是 minecraft:elytra。
  • 基于碰撞的方块检测 —— PhaseCheck 使用 getCollisionShape().isEmpty() 而非硬编码白名单,适应任何来自任何模组的非实心方块。

性能

  • 通过环形缓冲区实现 O(1) 状态历史记录(无数组复制)
  • 每个玩家的 CompensatedWorld 使用 AtomicReferenceArray 后端
  • CheckManager 使用高效的基于类的分发
  • 每刻轻量状态同步

配置

基于 TOML(config/beansac.toml)。三阶段加载:通过 ForgeConfigSpec.Builder 定义所有值,通过 CommentedFileConfig 加载文件,然后构造不可变配置对象。包含反透视、沙盒、延迟和 Webhook 部分。


取消连接

所有调用 requestCancel() 的检测都通过 Mixin 层连接并实际取消数据包:

  • ReachCheck 通过 ReachCheck.validate() 返回值取消 handleInteract、handleUseItemOn、handlePlayerAction
  • NukerCheck 通过 consumeCancel() 取消 handlePlayerAction
  • FastBreakCheck 通过 consumeCancel() 取消 handlePlayerAction
  • ScaffoldCheck 通过 consumeCancel() 取消 handleUseItemOn
  • FastPlaceCheck 通过 consumeCancel() 取消 handleUseItemOn
  • AutoBlockCheck 通过 consumeCancel() 取消 handleInteract
  • HitBoxCheck 通过 consumeCancel() 取消 handleInteract
  • ContainerCheck 通过 consumeCancel() 取消 handleContainerClick
  • CreativeMatchCheck 通过 consumeCancel() 取消 handleSetCreativeModeSlot
  • PacketOrderCheck 通过 consumeCancel() 取消 handlePlayerAction
  • PayloadRateCheck 通过 consumeCancel() 取消 handleCustomPayload

所有取消路径都会触发 resyncBlock() 以防止幽灵方块不同步。


客户端品牌检测

解析 minecraft:brand 负载字符串,检测已知客户端(forge、fabric、lunar、badlion、wurst、FastMath、作弊关键词)。通过 /beansac debug 按玩家显示。


依赖:

  • Minecraft Forge,Java 17
  • Top4eat21's topeatLib

命令

命令 描述
/beansac alerts 切换实时提醒
/beansac vl <玩家> 显示违规等级
/beansac checks 列出所有检测及其状态
/beansac debug <玩家> 显示客户端品牌和检测到的功能

许可证

12Tae12 保护性许可证,详见此处。