From 7d4ca88fab2dd023f38c296233e94b90348921b7 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Tue, 18 Mar 2025 11:30:20 -0500 Subject: [PATCH] Detect RPC Spam --- Helpers/ExtendedPlayerInfo.cs | 30 +++++++++++++++++++++++++++++- Modules/AntiCheat/BAUAntiCheat.cs | 17 +---------------- Modules/RPC.cs | 28 ++++++++++++++++++++++++---- Patches/GamePlayManagerPatch.cs | 10 ---------- Patches/PlayerJoinAndLeftPatch.cs | 3 --- Resources/Lang/en_US.json | 1 + 6 files changed, 55 insertions(+), 34 deletions(-) diff --git a/Helpers/ExtendedPlayerInfo.cs b/Helpers/ExtendedPlayerInfo.cs index 094e43d..503a18f 100644 --- a/Helpers/ExtendedPlayerInfo.cs +++ b/Helpers/ExtendedPlayerInfo.cs @@ -1,5 +1,7 @@ using AmongUs.GameOptions; using BetterAmongUs.Items; +using BetterAmongUs.Managers; +using BetterAmongUs.Modules; using HarmonyLib; using InnerNet; using UnityEngine; @@ -18,9 +20,33 @@ public class ExtendedPlayerInfo : MonoBehaviour hasSet = true; } + private float timeAccumulator = 0f; public void Update() { - AntiCheatInfo.TimeSinceLastTask += Time.deltaTime; + var time = Time.deltaTime; + + AntiCheatInfo.TimeSinceLastTask += time; + + if (AntiCheatInfo.RPCSentPS > 0) + { + bool flag = _Data.Object.IsCheater(); + + if (AntiCheatInfo.RPCSentPS >= ExtendedAntiCheatInfo.MaxRPCSent && !flag) + { + BetterNotificationManager.NotifyCheat(_Data.Object, + Translator.GetString("AntiCheat.Reason.RPCSentPS"), + Translator.GetString("AntiCheat.UnauthorizedAction") + ); + Logger.LogCheat($"{_Data.Object.BetterData().RealName} {AntiCheatInfo.RPCSentPS} Sent."); + } + + timeAccumulator += time; + if (timeAccumulator >= 0.25f - (0.005 * AntiCheatInfo.RPCSentPS)) + { + AntiCheatInfo.RPCSentPS -= 1; + timeAccumulator = 0f; + } + } } public void LateUpdate() @@ -52,6 +78,8 @@ public class ExtendedAntiCheatInfo { public bool BannedByAntiCheat { get; set; } = false; public List AUMChats { get; set; } = []; + public static int MaxRPCSent => 35; + public int RPCSentPS { get; set; } = 0; public int TimesAttemptedKilled { get; set; } = 0; public int OpenSabotageNum { get; set; } = 0; public bool IsFixingPanelSabotage => OpenSabotageNum != 0; diff --git a/Modules/AntiCheat/BAUAntiCheat.cs b/Modules/AntiCheat/BAUAntiCheat.cs index 8b4350a..575d38f 100644 --- a/Modules/AntiCheat/BAUAntiCheat.cs +++ b/Modules/AntiCheat/BAUAntiCheat.cs @@ -13,7 +13,7 @@ class BAUAntiCheat public static Dictionary SickoData = []; // HashPuid, FriendCode public static Dictionary AUMData = []; // HashPuid, FriendCode public static Dictionary KNData = []; // HashPuid, FriendCode - public static bool IsEnabled { get; private set; } = true; + public static bool IsEnabled => PlayerControl.LocalPlayer?.Data?.IsIncomplete == false; public static string[] GatherAllData() { @@ -65,21 +65,6 @@ class BAUAntiCheat } } - - public static void PauseAntiCheat() - { - float time = 2.5f; - if (IsEnabled) - { - IsEnabled = false; - - _ = new LateTask(() => - { - IsEnabled = true; - }, time, "PauseAntiCheat"); - } - } - [HarmonyPatch(typeof(PlatformSpecificData))] class PlatformSpecificDataPatch { diff --git a/Modules/RPC.cs b/Modules/RPC.cs index ea3d09d..599753c 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -36,7 +36,13 @@ enum HandleGameDataTags : byte internal class PlayerControlRPCHandlerPatch { public static bool Prefix(PlayerControl __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) - { + { + __instance.BetterData().AntiCheatInfo.RPCSentPS++; + if (__instance.BetterData().AntiCheatInfo.RPCSentPS >= ExtendedAntiCheatInfo.MaxRPCSent) + { + return false; + } + BAUAntiCheat.HandleCheatRPCBeforeCheck(__instance, callId, reader); if (BAUAntiCheat.CheckCancelRPC(__instance, callId, reader) != true) @@ -59,15 +65,23 @@ internal class PlayerControlRPCHandlerPatch [HarmonyPatch(typeof(PlayerPhysics), nameof(PlayerPhysics.HandleRpc))] internal class PlayerPhysicsRPCHandlerPatch { - public static void Prefix(PlayerPhysics __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) + public static bool Prefix(PlayerPhysics __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) { + __instance.myPlayer.BetterData().AntiCheatInfo.RPCSentPS++; + if (__instance.myPlayer.BetterData().AntiCheatInfo.RPCSentPS >= ExtendedAntiCheatInfo.MaxRPCSent) + { + return false; + } + if (BAUAntiCheat.CheckCancelRPC(__instance.myPlayer, callId, reader) != true) { Logger.LogCheat($"RPC canceled by Anti-Cheat: {Enum.GetName((RpcCalls)callId)}{Enum.GetName((CustomRPC)callId)} - {callId}"); } BAUAntiCheat.CheckRPC(__instance.myPlayer, callId, reader); - RPC.HandleRPC(__instance.myPlayer, callId, reader); + RPC.HandleRPC(__instance.myPlayer, callId, reader); + + return true; } } @@ -75,7 +89,13 @@ internal class PlayerPhysicsRPCHandlerPatch public static class MessageReaderUpdateSystemPatch { public static bool Prefix(/*ShipStatus __instance,*/ [HarmonyArgument(0)] SystemTypes systemType, [HarmonyArgument(1)] PlayerControl player, [HarmonyArgument(2)] MessageReader reader) - { + { + player.BetterData().AntiCheatInfo.RPCSentPS++; + if (player.BetterData().AntiCheatInfo.RPCSentPS >= ExtendedAntiCheatInfo.MaxRPCSent) + { + return false; + } + if (BAUAntiCheat.RpcUpdateSystemCheck(player, systemType, reader) != true) { Logger.LogCheat($"RPC canceled by Anti-Cheat: {Enum.GetName(typeof(SystemTypes), (int)systemType)} - {MessageReader.Get(reader).ReadByte()}"); diff --git a/Patches/GamePlayManagerPatch.cs b/Patches/GamePlayManagerPatch.cs index d955690..5aacc54 100644 --- a/Patches/GamePlayManagerPatch.cs +++ b/Patches/GamePlayManagerPatch.cs @@ -1,6 +1,5 @@ using BetterAmongUs.Helpers; using BetterAmongUs.Modules; -using BetterAmongUs.Modules.AntiCheat; using HarmonyLib; using System.Text; using TMPro; @@ -13,15 +12,6 @@ class GamePlayManager [HarmonyPatch(typeof(LobbyBehaviour))] public class LobbyBehaviourPatch { - [HarmonyPatch(nameof(LobbyBehaviour.OnDestroy))] - [HarmonyPrefix] - private static void OnDestroy_Prefix(/*LobbyBehaviour __instance*/) - { - if (GameState.IsInGame) - { - BAUAntiCheat.PauseAntiCheat(); - } - } [HarmonyPatch(nameof(LobbyBehaviour.Start))] [HarmonyPostfix] private static void Start_Postfix(/*LobbyBehaviour __instance*/) diff --git a/Patches/PlayerJoinAndLeftPatch.cs b/Patches/PlayerJoinAndLeftPatch.cs index 535b463..b1561c2 100644 --- a/Patches/PlayerJoinAndLeftPatch.cs +++ b/Patches/PlayerJoinAndLeftPatch.cs @@ -1,7 +1,6 @@ using BetterAmongUs.Helpers; using BetterAmongUs.Managers; using BetterAmongUs.Modules; -using BetterAmongUs.Modules.AntiCheat; using BetterAmongUs.Patches; using HarmonyLib; using InnerNet; @@ -15,8 +14,6 @@ class OnGameJoinedPatch { try { - BAUAntiCheat.PauseAntiCheat(); - // Fix host icon in lobby on modded servers if (!GameState.IsVanillaServer) { diff --git a/Resources/Lang/en_US.json b/Resources/Lang/en_US.json index 5dd2924..71617b3 100644 --- a/Resources/Lang/en_US.json +++ b/Resources/Lang/en_US.json @@ -119,6 +119,7 @@ "AntiCheat.Cheat.KNC": "KN Chat", "AntiCheat.Reason.InvalidFriendCode": "Invalid Friend Code", "AntiCheat.Reason.PlatformSpoofer": "Platform Spoofer", + "AntiCheat.Reason.RPCSentPS": "RPC Spam", "AntiCheat.Reason.SickoMenuUser": "Known Sicko User", "AntiCheat.Reason.AUMUser": "Known AUM User", "AntiCheat.Reason.KNUser": "Known KN User",