#include "pch.h" #include "hooks.h" bool g_bBlockInput = false; namespace Hooks { bool bToggledDevFlags = true; bool bToggledNetTrace = false; } void Hooks::InstallHooks() { /////////////////////////////////////////////////////////////////////////////// // Initialize Minhook spdlog::debug("Hooking game functions now..\n"); MH_Initialize(); /////////////////////////////////////////////////////////////////////////////// // Hook Squirrel functions MH_CreateHook(addr_SQVM_Print, &Hooks::SQVM_Print, NULL); MH_CreateHook(addr_SQVM_Warning, &Hooks::SQVM_Warning, reinterpret_cast(&originalSQVM_Warning)); MH_CreateHook(addr_SQVM_LoadRson, &Hooks::SQVM_LoadRson, reinterpret_cast(&originalSQVM_LoadRson)); MH_CreateHook(addr_SQVM_LoadScript, &Hooks::SQVM_LoadScript, reinterpret_cast(&originalSQVM_LoadScript)); MH_CreateHook(addr_SQVM_RegisterOriginFuncs, &Hooks::SQVM_RegisterOriginFuncs, reinterpret_cast(&originalSQVM_RegisterOriginFuncs)); MH_CreateHook(addr_SQVM_RegisterCreatePlayerTasklist, &Hooks::SQVM_RegisterCreatePlayerTasklist, reinterpret_cast(&originalSQVM_RegisterCreatePlayerTasklist)); /////////////////////////////////////////////////////////////////////////////// // Hook various Game functions MH_CreateHook(addr_CHLClient_FrameStageNotify, &Hooks::FrameStageNotify, reinterpret_cast(&originalFrameStageNotify)); MH_CreateHook(addr_CVEngineServer_IsPersistenceDataAvailable, &Hooks::IsPersistenceDataAvailable, reinterpret_cast(&originalIsPersistenceDataAvailable)); MH_CreateHook(addr_CServer_ConnectClient, &Hooks::ConnectClient, reinterpret_cast(&originalConnectClient)); /////////////////////////////////////////////////////////////////////////////// // Hook Netchan functions MH_CreateHook(addr_NET_PrintFunc, &Hooks::NET_PrintFunc, reinterpret_cast(&originalNET_PrintFunc)); MH_CreateHook(addr_NET_ReceiveDatagram, &Hooks::NET_ReceiveDatagram, reinterpret_cast(&originalNET_ReceiveDatagram)); MH_CreateHook(addr_NET_SendDatagram, &Hooks::NET_SendDatagram, reinterpret_cast(&originalNET_SendDatagram)); MH_CreateHook(addr_NetChan_Shutdown, &Hooks::NetChan_Shutdown, reinterpret_cast(&originalNetChan_ShutDown)); /////////////////////////////////////////////////////////////////////////////// // Hook ConVar | ConCommand functions MH_CreateHook(addr_ConVar_IsFlagSet, &Hooks::ConVar_IsFlagSet, reinterpret_cast(&originalConVar_IsFlagSet)); MH_CreateHook(addr_ConCommand_IsFlagSet, &Hooks::ConCommand_IsFlagSet, reinterpret_cast(&originalConCommand_IsFlagSet)); /////////////////////////////////////////////////////////////////////////////// // Hook CMatSystemSurface functions MH_CreateHook(addr_CMatSystemSurface_LockCursor, &LockCursor, reinterpret_cast(&originalLockCursor)); /////////////////////////////////////////////////////////////////////////////// // Hook Utility functions MH_CreateHook(addr_MSG_EngineError, &Hooks::MSG_EngineError, reinterpret_cast(&originalMSG_EngineError)); MH_CreateHook(addr_LoadPlaylist, &Hooks::LoadPlaylist, reinterpret_cast(&originalLoadPlaylist)); MH_CreateHook(addr_CEngineVGui_Paint, &Hooks::CEngineVGui_Paint, reinterpret_cast(&originalCEngineVGui_Paint)); MH_CreateHook(addr_OriginGetErrorDescription, &Hooks::OriginGetErrorDescription, reinterpret_cast(&originalOriginGetErrorDescriptionWrapper)); /////////////////////////////////////////////////////////////////////////////// // Hook WinAPI if (Module user32dll = Module("user32.dll"); user32dll.GetModuleBase()) // Is user32.dll valid? { void* SetCursorPosPtr = user32dll.GetExportedFunction("SetCursorPos"); void* ClipCursorPtr = user32dll.GetExportedFunction("ClipCursor"); void* GetCursorPosPtr = user32dll.GetExportedFunction("GetCursorPos"); void* ShowCursorPtr = user32dll.GetExportedFunction("ShowCursor"); MH_CreateHook(SetCursorPosPtr, &Hooks::SetCursorPos, reinterpret_cast(&originalSetCursorPos)); MH_CreateHook(ClipCursorPtr, &Hooks::ClipCursor, reinterpret_cast(&originalClipCursor)); MH_CreateHook(GetCursorPosPtr, &Hooks::GetCursorPos, reinterpret_cast(&originalGetCursorPos)); MH_CreateHook(ShowCursorPtr, &Hooks::ShowCursor, reinterpret_cast(&originalShowCursor)); /////////////////////////////////////////////////////////////////////////// // Enable WinAPI hooks MH_EnableHook(SetCursorPosPtr); MH_EnableHook(ClipCursorPtr); MH_EnableHook(GetCursorPosPtr); MH_EnableHook(ShowCursorPtr); } /////////////////////////////////////////////////////////////////////////////// // Enable Squirrel hooks MH_EnableHook(addr_SQVM_Print); MH_EnableHook(addr_SQVM_Warning); MH_EnableHook(addr_SQVM_LoadRson); MH_EnableHook(addr_SQVM_LoadScript); MH_EnableHook(addr_SQVM_RegisterOriginFuncs); MH_EnableHook(addr_SQVM_RegisterCreatePlayerTasklist); /////////////////////////////////////////////////////////////////////////////// // Enable various Game hooks MH_EnableHook(addr_CHLClient_FrameStageNotify); MH_EnableHook(addr_CVEngineServer_IsPersistenceDataAvailable); MH_EnableHook(addr_CServer_ConnectClient); /////////////////////////////////////////////////////////////////////////////// // Enable Netchan hooks MH_EnableHook(addr_NET_PrintFunc); MH_EnableHook(addr_NetChan_Shutdown); /////////////////////////////////////////////////////////////////////////////// // Enable ConVar | ConCommand hooks MH_EnableHook(addr_ConVar_IsFlagSet); MH_EnableHook(addr_ConCommand_IsFlagSet); /////////////////////////////////////////////////////////////////////////////// // Enable CMatSystemSurface hooks MH_EnableHook(addr_CMatSystemSurface_LockCursor); /////////////////////////////////////////////////////////////////////////////// // Enabled Utility hooks MH_EnableHook(addr_MSG_EngineError); MH_EnableHook(addr_LoadPlaylist); MH_EnableHook(addr_CEngineVGui_Paint); MH_EnableHook(addr_OriginGetErrorDescription); } void Hooks::RemoveHooks() { spdlog::debug("Unhooking game functions..\n"); /////////////////////////////////////////////////////////////////////////////// // Unhook Squirrel functions MH_RemoveHook(addr_SQVM_Print); MH_RemoveHook(addr_SQVM_LoadRson); MH_RemoveHook(addr_SQVM_LoadScript); MH_RemoveHook(addr_SQVM_RegisterOriginFuncs); MH_RemoveHook(addr_SQVM_RegisterCreatePlayerTasklist); /////////////////////////////////////////////////////////////////////////////// // Unhook various Game Functions MH_RemoveHook(addr_CHLClient_FrameStageNotify); MH_RemoveHook(addr_CVEngineServer_IsPersistenceDataAvailable); MH_RemoveHook(addr_CServer_ConnectClient); /////////////////////////////////////////////////////////////////////////////// // Unhook Netchan functions MH_RemoveHook(addr_NET_PrintFunc); MH_RemoveHook(addr_NET_ReceiveDatagram); MH_RemoveHook(addr_NET_SendDatagram); MH_RemoveHook(addr_NetChan_Shutdown); /////////////////////////////////////////////////////////////////////////////// // Unhook ConVar | ConCommand functions MH_RemoveHook(addr_ConVar_IsFlagSet); MH_RemoveHook(addr_ConCommand_IsFlagSet); /////////////////////////////////////////////////////////////////////////////// // Unhook CMatSystemSurface functions MH_RemoveHook(addr_CMatSystemSurface_LockCursor); /////////////////////////////////////////////////////////////////////////////// // Unhook WinAPI if (Module user32dll = Module("user32.dll"); user32dll.GetModuleBase()) // Is user32.dll valid? { void* SetCursorPosPtr = user32dll.GetExportedFunction("SetCursorPos"); void* ClipCursorPtr = user32dll.GetExportedFunction("ClipCursor"); void* GetCursorPosPtr = user32dll.GetExportedFunction("GetCursorPos"); void* ShowCursorPtr = user32dll.GetExportedFunction("ShowCursor"); MH_RemoveHook(SetCursorPosPtr); MH_RemoveHook(ClipCursorPtr); MH_RemoveHook(GetCursorPosPtr); MH_RemoveHook(ShowCursorPtr); } /////////////////////////////////////////////////////////////////////////////// // Unhook Utility functions MH_RemoveHook(addr_MSG_EngineError); MH_RemoveHook(addr_LoadPlaylist); MH_RemoveHook(addr_CEngineVGui_Paint); MH_RemoveHook(addr_OriginGetErrorDescription); /////////////////////////////////////////////////////////////////////////////// // Reset Minhook MH_Uninitialize(); } void Hooks::ToggleNetTrace() { if (!bToggledNetTrace) { MH_EnableHook(addr_NET_ReceiveDatagram); MH_EnableHook(addr_NET_SendDatagram); spdlog::info("\n"); spdlog::info("+--------------------------------------------------------+\n"); spdlog::info("|>>>>>>>>>>>>>| NETCHANNEL TRACE ACTIVATED |<<<<<<<<<<<<<|\n"); spdlog::info("+--------------------------------------------------------+\n"); spdlog::info("\n"); } else { MH_DisableHook(addr_NET_ReceiveDatagram); MH_DisableHook(addr_NET_SendDatagram); spdlog::info("\n"); spdlog::info("+--------------------------------------------------------+\n"); spdlog::info("|>>>>>>>>>>>>| NETCHANNEL TRACE DEACTIVATED |<<<<<<<<<<<<|\n"); spdlog::info("+--------------------------------------------------------+\n"); spdlog::info("\n"); } bToggledNetTrace = !bToggledNetTrace; } void Hooks::ToggleDevCommands() { if (!bToggledDevFlags) { MH_EnableHook(addr_ConVar_IsFlagSet); MH_EnableHook(addr_ConCommand_IsFlagSet); spdlog::info("\n"); spdlog::info("+--------------------------------------------------------+\n"); spdlog::info("|>>>>>>>>>>>>>| DEVONLY COMMANDS ACTIVATED |<<<<<<<<<<<<<|\n"); spdlog::info("+--------------------------------------------------------+\n"); spdlog::info("\n"); } else { MH_DisableHook(addr_ConVar_IsFlagSet); MH_DisableHook(addr_ConCommand_IsFlagSet); spdlog::info("\n"); spdlog::info("+--------------------------------------------------------+\n"); spdlog::info("|>>>>>>>>>>>>| DEVONLY COMMANDS DEACTIVATED |<<<<<<<<<<<<|\n"); spdlog::info("+--------------------------------------------------------+\n"); spdlog::info("\n"); } bToggledDevFlags = !bToggledDevFlags; }