
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 不硬编码兼容性。启动时:
- RegistryScanner 遍历所有 Forge 注册表(物品、方块、附魔、生物效果、实体)。缓存哈希值以便后续启动。
- MovementSimulation 通过运行时扫描玩家的活跃效果和穿戴附魔,计算每个玩家的最大速度,从而使模组效果自动扩展速度范围。
- PossibilityMap 标记未知附魔/效果,并应用宽松乘数,而非错误标记。
- 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 保护性许可证,详见此处。
正在加载版本记录…


正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。