From 9d0123ba5aae18df325a7633de874c0a911d6ea7 Mon Sep 17 00:00:00 2001 From: MDIC Date: Tue, 19 Apr 2022 16:17:28 -0400 Subject: [PATCH] Duel Exploit Detection Mind Controling a victim in a duel then using teleport hack to either set up the the opponent or exploit for own personal gain. Both Players will be flagged for cheating, Alerts sent out. Let the GM's sort it out. --- sql/world/Acore_strings.sql | 5 ++-- src/AnticheatMgr.cpp | 50 +++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/sql/world/Acore_strings.sql b/sql/world/Acore_strings.sql index 8575cc1..eaa83a3 100644 --- a/sql/world/Acore_strings.sql +++ b/sql/world/Acore_strings.sql @@ -1,8 +1,9 @@ -DELETE FROM `acore_string` WHERE `entry` IN (30087,30088,30089); +DELETE FROM `acore_string` WHERE `entry` IN (30087,30088,30089,30090); INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES (30087, '|cffffff00[|cffff0000ANTICHEAT ALERT|r|cffffff00]:|r |cFFFF8C00|r |cFFFF8C00[|Hplayer:%s|h%s|h|r|cFFFF8C00]:', NULL, NULL, NULL, NULL, NULL, '|cffffff00[|cffff0000ALERTA ANTITRAMPAS|r|cffffff00]:|r |cFFFF8C00|r |cFFFF8C00[|Hplayer:%s|h%s|h|r|cFFFF8C00]:', '|cffffff00[|cffff0000ALERTA ANTITRAMPAS|r|cffffff00]:|r |cFFFF8C00|r |cFFFF8C00[|Hplayer:%s|h%s|h|r|cFFFF8C00]:', NULL), (30088, '|cffffff00[|cffff0000ANTICHEAT ALERT|r|cffffff00]:|r POSSIBLE TELEPORT HACK DETECTED|cFFFF8C00 %s|r', NULL, NULL, NULL, NULL, NULL, '|cffffff00[|cffff0000ALERTA ANTITRAMPAS|r|cffffff00]:|r POSIBLE HACK DE TELEPORTE DETECTADO|cFFFF8C00 %s|r', '|cffffff00[|cffff0000ALERTA ANTITRAMPAS|r|cffffff00]:|r POSIBLE HACK DE TELEPORTE DETECTADO|cFFFF8C00 %s|r', NULL), -(30089, '|cffffff00[|cffff0000ANTICHEAT ALERT|r|cffffff00]:|r POSSIBLE IGNORE CONTROL HACK DETECTED|cFFFF8C00 %s|r', NULL, NULL, NULL, NULL, NULL, '|cffffff00[|cffff0000ALERTA ANTITRAMPAS|r|cffffff00]:|r POSIBLE CONTROL DE HACK DETECTADO IGNORARADO|cFFFF8C00 %s|r', '|cffffff00[|cffff0000ALERTA ANTITRAMPAS|r|cffffff00]:|r POSIBLE CONTROL DE HACK DETECTADO IGNORARADO|cFFFF8C00 %s|r', NULL); +(30089, '|cffffff00[|cffff0000ANTICHEAT ALERT|r|cffffff00]:|r POSSIBLE IGNORE CONTROL HACK DETECTED|cFFFF8C00 %s|r', NULL, NULL, NULL, NULL, NULL, '|cffffff00[|cffff0000ALERTA ANTITRAMPAS|r|cffffff00]:|r POSIBLE CONTROL DE HACK DETECTADO IGNORARADO|cFFFF8C00 %s|r', '|cffffff00[|cffff0000ALERTA ANTITRAMPAS|r|cffffff00]:|r POSIBLE CONTROL DE HACK DETECTADO IGNORARADO|cFFFF8C00 %s|r', NULL), +(30090, '|cffffff00[|cffff0000ANTICHEAT ALERT|r|cffffff00]:|r TELEPORT HACK USED WHLE DUELING|cFFFF8C00 %s|r vs |cFFFF8C00 %s|r.', NULL, NULL, NULL, NULL, NULL, '', '', NULL); DELETE FROM `command` WHERE `name`='anticheat jail'; DELETE FROM `command` WHERE `name`='anticheat delete'; diff --git a/src/AnticheatMgr.cpp b/src/AnticheatMgr.cpp index eb3ca3b..1a9a3fd 100644 --- a/src/AnticheatMgr.cpp +++ b/src/AnticheatMgr.cpp @@ -25,6 +25,7 @@ #define LANG_ANTICHEAT_ALERT 30087 #define LANG_ANTICHEAT_TELEPORT 30088 #define LANG_ANTICHEAT_IGNORECONTROL 30089 +#define LANG_ANTICHEAT_DUEL 30090 enum Spells { @@ -297,6 +298,31 @@ void AnticheatMgr::TeleportHackDetection(Player* player, MovementInfo movementIn float xDiff = fabs(lastX - newX); float yDiff = fabs(lastY - newY); + if (player->duel) + { + if ((xDiff >= 50.0f || yDiff >= 50.0f) && !player->CanTeleport()) + { + Player* opponent = player->duel->Opponent; + + std::string str = "|cFFFFFC00[DUEL ALERT Playername:|cFF00FFFF[|cFF60FF00" + std::string(player->GetName().c_str()) + "|cFF00FFFF] Possible Teleport Hack Detected! While Dueling [|cFF60FF00" + std::string(opponent->GetName().c_str()) + "|cFF00FFFF]"; + WorldPacket data(SMSG_NOTIFICATION, (str.size() + 1)); + data << str; + sWorld->SendGlobalGMMessage(&data); + + sWorld->SendGMText(LANG_ANTICHEAT_DUEL, player->GetName().c_str(), opponent->GetName().c_str()); + + if (sConfigMgr->GetOption("Anticheat.WriteLog", true)) + { + LOG_INFO("module", "AnticheatMgr:: DUEL ALERT Teleport-Hack detected player {} ({}) while dueling {}", player->GetName(), player->GetGUID().ToString(), opponent->GetName()); + LOG_INFO("module", "AnticheatMgr:: DUEL ALERT Teleport-Hack detected player {} ({}) while dueling {}", opponent->GetName(), opponent->GetGUID().ToString(), player->GetName()); + } + BuildReport(player, TELEPORT_HACK_REPORT); + BuildReport(opponent, TELEPORT_HACK_REPORT); + } + else if (player->CanTeleport()) + player->SetCanTeleport(false); + } + if ((xDiff >= 50.0f || yDiff >= 50.0f) && !player->CanTeleport()) { if (m_Players[key].GetTotalReports() > sConfigMgr->GetOption("Anticheat.ReportsForIngameWarnings", 70)) @@ -475,6 +501,30 @@ void AnticheatMgr::SpeedHackDetection(Player* player, MovementInfo movementInfo) // this is the distance doable by the player in 1 sec, using the time done to move to this point. uint32 clientSpeedRate = distance2D * 1000 / timeDiff; + if (player->duel) + { + if ((clientSpeedRate > speedRate * 1.25f) && !m_Players[key].GetLastMovementInfo().HasMovementFlag(MOVEMENTFLAG_FALLING)) + { + if (!player->CanTeleport()) + { + Player* opponent = player->duel->Opponent; + std::string str = "|cFFFFFC00[DUEL CHEAT ALERT Playername:|cFF00FFFF[|cFF60FF00" + std::string(player->GetName().c_str()) + "|cFF00FFFF] Possible Speed Hack Detected! While Dueling [|cFF60FF00" + std::string(opponent->GetName().c_str()) + "|cFF00FFFF]"; + WorldPacket data(SMSG_NOTIFICATION, (str.size() + 1)); + data << str; + sWorld->SendGlobalGMMessage(&data); + + sWorld->SendGMText(LANG_ANTICHEAT_DUEL, player->GetName().c_str(), opponent->GetName().c_str()); + if (sConfigMgr->GetOption("Anticheat.WriteLog", true)) + { + LOG_INFO("module", "AnticheatMgr:: DUEL ALERT Speed-Hack detected player {} ({}) while dueling {}", player->GetName(), player->GetGUID().ToString(), opponent->GetName()); + LOG_INFO("module", "AnticheatMgr:: DUEL ALERT Speed-Hack detected player {} ({}) while dueling {}", opponent->GetName(), opponent->GetGUID().ToString(), player->GetName()); + } + BuildReport(player, SPEED_HACK_REPORT); + BuildReport(opponent, SPEED_HACK_REPORT); + } + return; + } + } // We did the (uint32) cast to accept a margin of tolerance // We check the last MovementInfo for the falling flag since falling down a hill and sliding a bit triggered a false positive if ((clientSpeedRate > speedRate * 1.25f) && !m_Players[key].GetLastMovementInfo().HasMovementFlag(MOVEMENTFLAG_FALLING))