Add a bypass to some community AntiCheats and small anti-afk change
This commit is contained in:
parent
5b28bd9e44
commit
285e22accb
14
include/hacks/AntiCheatBypass.hpp
Normal file
14
include/hacks/AntiCheatBypass.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#include <sdk.hpp>
|
||||
#include <Settings.hpp>
|
||||
|
||||
namespace hacks::tf2::antianticheat
|
||||
{
|
||||
|
||||
extern settings::Boolean enabled;
|
||||
|
||||
void SendNetMsg(INetMessage &msg);
|
||||
|
||||
bool CanSetCmdNum(int new_cmdnum);
|
||||
} // namespace hacks::tf2::antianticheat
|
@ -105,8 +105,8 @@ public:
|
||||
{
|
||||
// Call original to be sure nothing breaks
|
||||
typedef bool (*BIncomingMessageForProcessing_t)(CNetMessage *, double, int);
|
||||
static auto addr = gSignatures.GetEngineSignature("55 89 E5 56 53 83 EC 10 8B 5D ? F2 0F 10 45");
|
||||
BIncomingMessageForProcessing_t BIncomingMessageForProcessing_fn = (BIncomingMessageForProcessing_t)addr;
|
||||
static auto addr = gSignatures.GetEngineSignature("55 89 E5 56 53 83 EC 10 8B 5D ? F2 0F 10 45");
|
||||
BIncomingMessageForProcessing_t BIncomingMessageForProcessing_fn = (BIncomingMessageForProcessing_t) addr;
|
||||
return BIncomingMessageForProcessing_fn(this, param_1, param_2);
|
||||
};
|
||||
// I don't get what it does but we need it
|
||||
@ -114,8 +114,8 @@ public:
|
||||
{
|
||||
// Call original to be sure nothing breaks
|
||||
typedef bool (*SetRatePolicy_t)(CNetMessage *);
|
||||
static auto addr = gSignatures.GetEngineSignature("55 89 E5 83 EC 18 C7 04 24 2C 00 00 00");
|
||||
SetRatePolicy_t SetRatePolicy_fn = (SetRatePolicy_t)addr;
|
||||
static auto addr = gSignatures.GetEngineSignature("55 89 E5 83 EC 18 C7 04 24 2C 00 00 00");
|
||||
SetRatePolicy_t SetRatePolicy_fn = (SetRatePolicy_t) addr;
|
||||
SetRatePolicy_fn(this);
|
||||
};
|
||||
|
||||
@ -214,6 +214,7 @@ class CLC_RespondCvarValue : public CNetMessage
|
||||
public:
|
||||
DECLARE_CLC_MESSAGE(RespondCvarValue);
|
||||
|
||||
char pad[4];
|
||||
QueryCvarCookie_t m_iCookie;
|
||||
|
||||
const char *m_szCvarName;
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "Backtrack.hpp"
|
||||
#include "WeaponData.hpp"
|
||||
#include "netadr.h"
|
||||
#include "AntiCheatBypass.hpp"
|
||||
|
||||
std::unordered_map<int, int> command_number_mod{};
|
||||
|
||||
@ -214,6 +215,7 @@ static int nextCritTick(int loops = 4096)
|
||||
for (int i = 0; i < loops; i++)
|
||||
{
|
||||
int cmd_number = current_late_user_cmd->command_number + i;
|
||||
|
||||
// Set random seed
|
||||
*g_PredictionRandomSeed = MD5_PseudoRandom(cmd_number) & 0x7FFFFFFF;
|
||||
// Save weapon state to not break anything
|
||||
@ -420,8 +422,29 @@ bool prevent_crit()
|
||||
// Main function that forces a crit
|
||||
void force_crit()
|
||||
{
|
||||
// Can't use normal methods here
|
||||
if (hacks::tf2::antianticheat::enabled)
|
||||
{
|
||||
// We have to ignore these sadly
|
||||
if (CE_GOOD(LOCAL_W) && (LOCAL_W->m_iClassID() == CL_CLASS(CTFCannon) || LOCAL_W->m_iClassID() == CL_CLASS(CTFPipebombLauncher) || CE_INT(LOCAL_W, netvar.iItemDefinitionIndex) == 730))
|
||||
return;
|
||||
// May only go up to 60 ticks in the future
|
||||
int next_crit = nextCritTick(60);
|
||||
|
||||
// None found, release m1
|
||||
if (next_crit == -1)
|
||||
current_late_user_cmd->buttons &= ~IN_ATTACK;
|
||||
// Force crit
|
||||
else
|
||||
{
|
||||
current_late_user_cmd->command_number = next_crit;
|
||||
current_late_user_cmd->random_seed = MD5_PseudoRandom(current_late_user_cmd->command_number) & 0x7FFFFFFF;
|
||||
current_index++;
|
||||
}
|
||||
}
|
||||
|
||||
// New mode stuff (well when not using melee nor using pipe launcher)
|
||||
if (g_pLocalPlayer->weapon_mode != weapon_melee && LOCAL_W->m_iClassID() != CL_CLASS(CTFPipebombLauncher))
|
||||
else if (g_pLocalPlayer->weapon_mode != weapon_melee && LOCAL_W->m_iClassID() != CL_CLASS(CTFPipebombLauncher))
|
||||
{
|
||||
// We have valid crit command numbers
|
||||
if (crit_cmds.size() && crit_cmds.find(LOCAL_W->m_IDX) != crit_cmds.end() && crit_cmds.find(LOCAL_W->m_IDX)->second.size())
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "hitrate.hpp"
|
||||
#include "FollowBot.hpp"
|
||||
#include "Warp.hpp"
|
||||
#include "AntiCheatBypass.hpp"
|
||||
|
||||
namespace hacks::shared::aimbot
|
||||
{
|
||||
@ -264,6 +265,9 @@ static void CreateMove()
|
||||
fov = *normal_fov;
|
||||
|
||||
spectatorUpdate();
|
||||
// Adjust for AC
|
||||
if (hacks::tf2::antianticheat::enabled)
|
||||
fov = std::min(fov > 0.0f ? fov : FLT_MAX, 10.0f);
|
||||
|
||||
if (CE_BAD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || CE_BAD(LOCAL_W))
|
||||
enable = false;
|
||||
|
54
src/hacks/AntiCheatBypass.cpp
Normal file
54
src/hacks/AntiCheatBypass.cpp
Normal file
@ -0,0 +1,54 @@
|
||||
#include "common.hpp"
|
||||
|
||||
namespace hacks::tf2::antianticheat
|
||||
{
|
||||
|
||||
settings::Boolean enabled("misc.antianticheat.enabled", "false");
|
||||
|
||||
// Always a good idea to spoof these
|
||||
void SendNetMsg(INetMessage &msg)
|
||||
{
|
||||
if (msg.GetType() == clc_RespondCvarValue)
|
||||
{
|
||||
CLC_RespondCvarValue *cvar_msg = (CLC_RespondCvarValue *) &msg;
|
||||
if (!cvar_msg->m_szCvarName)
|
||||
return;
|
||||
// Remove cat_ commands and the linux unique sdl_double_click_size from cvar list
|
||||
if (!strcmp(cvar_msg->m_szCvarName, "cat") || !strcmp(cvar_msg->m_szCvarName, "sdl_double_click_size"))
|
||||
cvar_msg->m_eStatusCode = EQueryCvarValueStatus::eQueryCvarValueStatus_CvarNotFound;
|
||||
|
||||
// Spoof ourselves as Windows, bypassing Linux detection addons
|
||||
else if (std::string(cvar_msg->m_szCvarName) == "windows_speaker_config")
|
||||
{
|
||||
cvar_msg->m_eStatusCode = EQueryCvarValueStatus::eQueryCvarValueStatus_ValueIntact;
|
||||
cvar_msg->m_szCvarValue = "8";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Currently unused, may be useful for stuff modifying cmdnum though.
|
||||
bool CanSetCmdNum(int new_cmdnum)
|
||||
{
|
||||
if (!enabled)
|
||||
return true;
|
||||
if (new_cmdnum - current_late_user_cmd->command_number >= 64)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void CreateMoveLate()
|
||||
{
|
||||
if (!enabled)
|
||||
return;
|
||||
static int silent_ticks = 0;
|
||||
// "Silent" detection mostly just checks if cursor was where it was 2 ticks ago while having moved 1 tick before
|
||||
if (silent_ticks == 1 && !g_pLocalPlayer->bUseSilentAngles)
|
||||
current_late_user_cmd->viewangles += Vector(RandomFloat(-1.0f, 1.0f));
|
||||
|
||||
silent_ticks++;
|
||||
if (!g_pLocalPlayer->bUseSilentAngles)
|
||||
silent_ticks = 0;
|
||||
}
|
||||
|
||||
static InitRoutine init([]() { EC::Register(EC::CreateMoveLate, CreateMoveLate, "acb_cml"); });
|
||||
} // namespace hacks::tf2::antianticheat
|
@ -1,5 +1,6 @@
|
||||
#include "common.hpp"
|
||||
#include "Backtrack.hpp"
|
||||
#include "AntiCheatBypass.hpp"
|
||||
|
||||
namespace hacks::tf2::backtrack
|
||||
{
|
||||
@ -106,7 +107,10 @@ float getLatency()
|
||||
bool isTickInRange(int tickcount)
|
||||
{
|
||||
int delta_tickcount = abs(tickcount - current_user_cmd->tick_count + TIME_TO_TICKS(getLatency() / 1000.0f));
|
||||
return TICKS_TO_TIME(delta_tickcount) <= 0.2f - TICKS_TO_TIME(2);
|
||||
if (!hacks::tf2::antianticheat::enabled)
|
||||
return TICKS_TO_TIME(delta_tickcount) <= 0.2f - TICKS_TO_TIME(2);
|
||||
else
|
||||
return delta_tickcount <= TICKS_TO_TIME(1);
|
||||
}
|
||||
|
||||
// Is backtrack enabled?
|
||||
@ -116,7 +120,11 @@ bool isEnabled()
|
||||
return false;
|
||||
CachedEntity *wep = LOCAL_W;
|
||||
if (CE_BAD(wep))
|
||||
{
|
||||
if (hacks::tf2::antianticheat::enabled)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
int slot = re::C_BaseCombatWeapon::GetSlot(RAW_ENT(wep));
|
||||
switch (*bt_slots)
|
||||
{
|
||||
@ -250,6 +258,8 @@ void RestoreEntity(int entidx)
|
||||
|
||||
void CreateMoveEarly()
|
||||
{
|
||||
if (hacks::tf2::antianticheat::enabled && *latency > 200.0f)
|
||||
latency = 200.0f;
|
||||
draw_positions.clear();
|
||||
isBacktrackEnabled = isEnabled();
|
||||
if (!isBacktrackEnabled)
|
||||
|
@ -1,4 +1,5 @@
|
||||
set(files "${CMAKE_CURRENT_LIST_DIR}/AutoJoin.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/AntiCheatBypass.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/CatBot.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/Spam.cpp"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/AutoItem.cpp"
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "core/sharedobj.hpp"
|
||||
#include "filesystem.h"
|
||||
#include "DetourHook.hpp"
|
||||
#include "AntiCheatBypass.hpp"
|
||||
|
||||
#include "hack.hpp"
|
||||
#include <thread>
|
||||
@ -85,28 +86,12 @@ static void updateAntiAfk()
|
||||
}
|
||||
else
|
||||
{
|
||||
Vector vel(0.0f);
|
||||
if (CE_GOOD(LOCAL_E) && LOCAL_E->m_bAlivePlayer())
|
||||
velocity::EstimateAbsVelocity(RAW_ENT(LOCAL_E), vel);
|
||||
// We are moving, make the timer a bit longer (only a bit to avoid issues with random movement)
|
||||
if (!vel.IsZero(1.0f))
|
||||
{
|
||||
anti_afk_timer.last += std::chrono::milliseconds(400);
|
||||
if (anti_afk_timer.last > std::chrono::system_clock::now())
|
||||
anti_afk_timer.update();
|
||||
}
|
||||
static auto afk_timer = g_ICvar->FindVar("mp_idlemaxtime");
|
||||
if (!afk_timer)
|
||||
afk_timer = g_ICvar->FindVar("mp_idlemaxtime");
|
||||
// Trigger 10 seconds before kick
|
||||
else if (afk_timer->GetInt() != 0 && anti_afk_timer.check(afk_timer->m_nValue * 60 * 1000 - 10000))
|
||||
{
|
||||
// Just duck tf
|
||||
if (current_user_cmd->buttons & (IN_DUCK | IN_JUMP))
|
||||
current_user_cmd->buttons &= ~(IN_DUCK | IN_JUMP);
|
||||
else
|
||||
current_user_cmd->buttons = IN_DUCK | IN_JUMP;
|
||||
|
||||
// Game also checks if you move if you are in spawn, so spam movement keys alternatingly
|
||||
bool flip = false;
|
||||
current_user_cmd->buttons |= flip ? IN_FORWARD : IN_BACK;
|
||||
@ -117,6 +102,7 @@ static void updateAntiAfk()
|
||||
anti_afk_timer.update();
|
||||
}
|
||||
}
|
||||
last_buttons = current_user_cmd->buttons;
|
||||
}
|
||||
}
|
||||
|
||||
@ -306,7 +292,7 @@ void CreateMove()
|
||||
teammatesPushaway = g_ICvar->FindVar("tf_avoidteammates_pushaway");
|
||||
|
||||
// Ping Reducer
|
||||
if (ping_reducer)
|
||||
if (ping_reducer && !hacks::tf2::antianticheat::enabled)
|
||||
{
|
||||
static ConVar *cmdrate = g_ICvar->FindVar("cl_cmdrate");
|
||||
if (cmdrate == nullptr)
|
||||
|
@ -6,11 +6,13 @@
|
||||
*/
|
||||
#include "HookedMethods.hpp"
|
||||
#include "Backtrack.hpp"
|
||||
#include "AntiCheatBypass.hpp"
|
||||
|
||||
namespace hooked_methods
|
||||
{
|
||||
DEFINE_HOOKED_METHOD(SendDatagram, int, INetChannel *ch, bf_write *buf)
|
||||
{
|
||||
if (!isHackActive() || !ch || CE_BAD(LOCAL_E) || std::floor(*hacks::tf2::backtrack::latency) == 0)
|
||||
if (!isHackActive() || !ch || (CE_BAD(LOCAL_E) && !hacks::tf2::antianticheat::enabled) || std::floor(*hacks::tf2::backtrack::latency) == 0)
|
||||
return original::SendDatagram(ch, buf);
|
||||
|
||||
int in = ch->m_nInSequenceNr;
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "e8call.hpp"
|
||||
#include "Warp.hpp"
|
||||
#include "nospread.hpp"
|
||||
#include "AntiCheatBypass.hpp"
|
||||
#include "SteamIDStealer.hpp"
|
||||
|
||||
static settings::Int newlines_msg{ "chat.prefix-newlines", "0" };
|
||||
@ -228,6 +229,8 @@ DEFINE_HOOKED_METHOD(SendNetMsg, bool, INetChannel *this_, INetMessage &msg, boo
|
||||
else
|
||||
hacks::tf2::warp::SendNetMessage(msg);
|
||||
|
||||
hacks::tf2::antianticheat::SendNetMsg(msg);
|
||||
|
||||
// net_StringCmd
|
||||
if (msg.GetType() == 4 && (newlines_msg || crypt_chat))
|
||||
{
|
||||
|
Reference in New Issue
Block a user