From 484c827a3b374c124c5ec2a7cf5e382205190b53 Mon Sep 17 00:00:00 2001 From: shelru Date: Sun, 30 Apr 2017 23:55:29 +0400 Subject: [PATCH 1/4] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MiniBase/MiniBase.vcxproj | 6 +- MiniBase/client.cpp | 177 ++++++++++++++--- MiniBase/client.h | 20 +- MiniBase/enginemsg.cpp | 402 +++++++++++++++++++++++++++++--------- MiniBase/enginemsg.h | 11 ++ MiniBase/main.cpp | 168 +++++++++++++++- MiniBase/main.h | 4 +- MiniBase/redirect.h | 80 ++++++++ 8 files changed, 741 insertions(+), 127 deletions(-) create mode 100644 MiniBase/redirect.h diff --git a/MiniBase/MiniBase.vcxproj b/MiniBase/MiniBase.vcxproj index e8fd6d9..bb62ef1 100644 --- a/MiniBase/MiniBase.vcxproj +++ b/MiniBase/MiniBase.vcxproj @@ -30,7 +30,7 @@ DynamicLibrary true v140_xp - Unicode + MultiByte DynamicLibrary @@ -70,6 +70,7 @@ true + .mix true @@ -190,6 +191,5 @@ - - + \ No newline at end of file diff --git a/MiniBase/client.cpp b/MiniBase/client.cpp index 0368c62..131c41c 100644 --- a/MiniBase/client.cpp +++ b/MiniBase/client.cpp @@ -18,9 +18,11 @@ cvar_t *random; map g_modelsHashMap; cvar_t *logsfiles; cvar_t *events_block; - cvar_t *ex_thud; cvar_t *motd_block; + +vector Cvars; + void HookEngineMessages(){ pEngineMsgBase = (PEngineMsg)offset.FindSVCMessages(); pSVC_StuffText = HookEngineMsg("svc_stufftext", SVC_StuffText); @@ -31,8 +33,14 @@ void HookEngineMessages(){ // pSVC_Resourcelist = HookEngineMsg("svc_resourcelist", SVC_Resourcelist); } -void ConsolePrintColor(BYTE R, BYTE G, BYTE B, char* string){ - TColor24 DefaultColor;PColor24 Ptr;Ptr = Console_TextColor;DefaultColor = *Ptr;Ptr->R = R;Ptr->G = G;Ptr->B = B;g_Engine.Con_Printf("%s", string);*Ptr = DefaultColor; + +void ConsolePrintColor(BYTE R, BYTE G, BYTE B, const char *fmt, ...){ + va_list va_alist; + char buf[256]; + va_start(va_alist, fmt); + _vsnprintf(buf, sizeof(buf), fmt, va_alist); + va_end(va_alist); + TColor24 DefaultColor; PColor24 Ptr; Ptr = Console_TextColor; DefaultColor = *Ptr; Ptr->R = R; Ptr->G = G; Ptr->B = B; g_Engine.Con_Printf(buf); *Ptr = DefaultColor; } void models(){ @@ -47,7 +55,10 @@ void models(){ } void Credits(){ ConsolePrintColor(255, 255, 255, "-- Thank's to");ConsolePrintColor(0, 255, 0, " [2010] Team\n");ConsolePrintColor(255, 255, 255, "-- Thank's to"); - ConsolePrintColor(0, 255, 0, " madotsuki-team < *\n");ConsolePrintColor(255, 255, 255, "-- Thank's to ");ConsolePrintColor(0, 255, 0, "or_75\n"); ConsolePrintColor(255, 255, 255, "-- Thank's to"); ConsolePrintColor(0, 255, 0, "Juice\n"); + ConsolePrintColor(0, 255, 0, " madotsuki-team < *\n");ConsolePrintColor(255, 255, 255, "-- Thank's to ");ConsolePrintColor(0, 255, 0, "or_75\n"); + ConsolePrintColor(255, 255, 255, "-- Thank's to "); ConsolePrintColor(0, 255, 0, "Juice\n"); + ConsolePrintColor(255, 255, 255, "-- Thank's to "); ConsolePrintColor(0, 255, 0, "Admrfsh\n"); + ConsolePrintColor(255, 255, 255, "-- Thank's to "); ConsolePrintColor(0, 255, 0, "Garey\n"); } int g_blockedCmdCount, g_serverCmdCount,g_anticheckfiles; char *g_blockedCmds[1024], *g_serverCmds[2048], *g_anticheckfiles2[2048]; @@ -61,15 +72,26 @@ int Callback(const char *section, const char *key, const char *value, const void return 1; } void Inject(){LoadLibraryA(g_Engine.Cmd_Argv(1)); } -int g_blockedCvarCount; -char *g_blockedCvars[512]; +/*int g_blockedCvarCount; +char *g_blockedCvars[512];*/ + +void DumpCmd() +{ + cmd_s *pCmd = g_Engine.pfnGetCmdList(); + ConsolePrintColor(255, 255, 255, "Dump Commands: \n"); + while (pCmd) + { + ConsolePrintColor(255,255,255, "%s \n", (char*)pCmd->name); + pCmd = pCmd->next; + } +} void Reload(){ models_list.clear(); ini_browse(Callback,NULL,g_settingsFileName); - memset(g_blockedCmds,0,sizeof(g_blockedCmds));memset(g_blockedCvars, 0, sizeof(g_blockedCvars)); + memset(g_blockedCmds,0,sizeof(g_blockedCmds));//memset(g_blockedCvars, 0, sizeof(g_blockedCvars)); memset(g_serverCmds, 0, sizeof(g_serverCmds)); memset(g_anticheckfiles2, 0, sizeof(g_anticheckfiles2)); - g_blockedCvarCount = 0; g_blockedCmdCount = 0; g_serverCmdCount = 0; g_anticheckfiles = 0; + g_blockedCmdCount = 0; g_serverCmdCount = 0; g_anticheckfiles = 0; static TCHAR sKeyNames[4096*3]; GetPrivateProfileSection(TEXT("ADetect"), sKeyNames, ARRAYSIZE(sKeyNames), g_settingsFileName); @@ -84,9 +106,17 @@ void Reload(){ char *psKeyName3 = sKeyNames; while (psKeyName3[0] != '\0') { g_serverCmds[g_serverCmdCount++] = strdup(psKeyName3); psKeyName3 += strlen(psKeyName3) + 1; } - GetPrivateProfileSection(TEXT("Blocked cvars"),sKeyNames,ARRAYSIZE(sKeyNames),g_settingsFileName); + /*GetPrivateProfileSection(TEXT("Blocked cvars"),sKeyNames,ARRAYSIZE(sKeyNames),g_settingsFileName); char *psKeyName2=sKeyNames; - while (psKeyName2[0]!='\0'){g_blockedCvars[g_blockedCvarCount++]=strdup(psKeyName2);psKeyName2+=strlen(psKeyName2)+1;} + while (psKeyName2[0]!='\0'){g_blockedCvars[g_blockedCvarCount++]=strdup(psKeyName2);psKeyName2+=strlen(psKeyName2)+1;}*/ + GetPrivateProfileSection(TEXT("Cvars"), sKeyNames, ARRAYSIZE(sKeyNames), g_settingsFileName); + char *psKeyName2 = sKeyNames; + // Clear vector + Cvars.clear(); + while (psKeyName2[0] != '\0'){ + AddOrModCvar(psKeyName2); + psKeyName2 += strlen(psKeyName2) + 1; + } TCHAR value[16];char cvarname[32]; GetPrivateProfileString(TEXT("Settings"), TEXT("sid_random"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); sprintf(cvarname, "sid_random %s", value);g_Engine.pfnClientCmd(cvarname); memset(value, 0, sizeof(value)); memset(cvarname, 0, sizeof(cvarname)); @@ -100,6 +130,13 @@ void Reload(){ sprintf(cvarname, "events_block %s", value); g_Engine.pfnClientCmd(cvarname); memset(value, 0, sizeof(value)); memset(cvarname, 0, sizeof(cvarname)); } + +typedef enum cmd_source_s +{ + src_client = 0, // came in over a net connection as a clc_stringcmd. host_client will be valid during this state. + src_command = 1, // from the command buffer. +} cmd_source_t; + void InitHack(){ static TCHAR sKeyNames[4096 * 3]; GetPrivateProfileSection(TEXT("Commands"), sKeyNames, ARRAYSIZE(sKeyNames), g_settingsFileName); @@ -132,24 +169,16 @@ void InitHack(){ while (psKeyName[0] != '\0') { LoadLibraryA(psKeyName); psKeyName += strlen(psKeyName) + 1; - } - GetPrivateProfileSection(TEXT("Custom Commands"), sKeyNames, ARRAYSIZE(sKeyNames), g_settingsFileName); - psKeyName = sKeyNames; - while (psKeyName[0] != '\0') { - g_pEngine->pfnAddCommand(strdup(psKeyName), DRC_CMD_NONE); - psKeyName += strlen(psKeyName) + 1; - } - ini_browse(Callback, NULL, g_settingsFileName); - GetPrivateProfileSection(TEXT("Blocked cvars"), sKeyNames, ARRAYSIZE(sKeyNames), g_settingsFileName); + } + GetPrivateProfileSection(TEXT("Cvars"), sKeyNames, ARRAYSIZE(sKeyNames), g_settingsFileName); char *psKeyName2 = sKeyNames; - g_blockedCvarCount = 0; - while (psKeyName2[0] != '\0') { - g_blockedCvars[g_blockedCvarCount++] = strdup(psKeyName2); + while (psKeyName2[0] != '\0') + { + AddOrModCvar(psKeyName2); psKeyName2 += strlen(psKeyName2) + 1; } - if (!(g_Engine.Con_IsVisible() != 0))g_Engine.pfnClientCmd("toggleconsole"); - ConsolePrintColor(0, 255, 11, "-- Extra Mirror v2.3\n"); + ConsolePrintColor(0, 255, 11, "-- Extra Mirror v2.6\n"); ConsolePrintColor(255, 255, 255, "-- Use 'credits' for more information\n"); ConsolePrintColor(255, 255, 255, "-- Thank's to Realwar for title\n"); ConsolePrintColor(255, 255, 255, "-- Thank's to FightMagister for functions\n"); @@ -164,7 +193,8 @@ void InitHack(){ GetPrivateProfileString(TEXT("Settings"), TEXT("events_block"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); events_block = g_pEngine->pfnRegisterVariable("events_block", value, 0); memset(value, 0, sizeof(value)); GetPrivateProfileString(TEXT("Settings"), TEXT("motd_block"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); - motd_block = g_pEngine->pfnRegisterVariable("motd_block", value, 0);memset(value, 0, sizeof(value)); + motd_block = g_pEngine->pfnRegisterVariable("motd_block", value, 0); memset(value, 0, sizeof(value)); + g_pEngine->pfnAddCommand("dump_cmd", DumpCmd); } void HookEventMessages(){ @@ -257,3 +287,100 @@ void HookFunction(){ g_pEngine->pfnDrawUnicodeCharacter = pfnDrawUnicodeCharacter; // g_pStudio->SetRenderModel = SetRenderModel; } + +// Parsing string into vector +void AddOrModCvar(const string line){ + m_Cvar temp; + // Set non-valid mode for future checks + temp.mode = -1; + // Search first occurance of space char + size_t start = line.find(' '); + // Set name + temp.name = line.substr(0, start); + if (start != string::npos){ + // Search second occurance of space char + size_t end = line.find(' ', start+1); + string Tag; + if (end != string::npos)Tag = line.substr(start + 1, end - start - 1); + else Tag = line.substr(start + 1); + + if (Tag == "BAD") { temp.mode = cvar_bad; } + else if (Tag == "FAKE") { temp.mode = cvar_fake; } + else if (Tag == "SERVERSIDE") { temp.mode = cvar_open; } + else { /* UNKNOWN MODE WE SHOULD NOTIFY */ }; + + // value + if (end != string::npos){ + size_t q_start = line.find("\"", end); + if (q_start != string::npos) + { + size_t q_end = line.find("\"", q_start + 1); + if (q_end != string::npos) + { + string Value = line.substr(q_start + 1, q_end - q_start - 1); + temp.value = Value; + temp.default = Value; + } + else + { + // Not closed quote :facepalm: notify? + } + } + else{ + // Value not in quotes or not appear at all? + // Check for spaces + size_t s_start = line.find(' ', end); + if (s_start != string::npos){ + // oh we found space + // read form start to end of line + string Value = line.substr(s_start + 1); + temp.value = Value; + temp.default = Value; + } + else{ + // nope there no delimiter + // Should we notify? + } + } + } + + } + else{ + // No delimiter??? wtf? Should we notify? possible todo + } + if (temp.mode == -1)temp.mode = cvar_fake; // todo: cvar for default mode + if (temp.value.length() == 0){ + // todo: cvar for default value + temp.value = "0"; + temp.default = temp.value; + } + auto pos = FindCvar(temp.name, Cvars); + if (pos != -1)Cvars[pos] = temp; + else Cvars.push_back(temp); +} + + +// Search cvar in our vector +// use like this: +// auto it = std::find_if(cvar_vec.begin(), cvar_vec.end(), finder_cvar(cvar_name)); +struct finder_cvar : std::unary_function { + string name; + finder_cvar(string name) :name(name) { } + bool operator()(m_Cvar const& m) const { + return m.name == name; + } +}; + +// Search cvar by name in given vector +ptrdiff_t FindCvar(string name, vector vec_cvar) +{ + ptrdiff_t pos; + pos = std::find_if(vec_cvar.begin(), vec_cvar.end(), finder_cvar(name)) - vec_cvar.begin(); + if (pos >= vec_cvar.size()) + { + return -1; + } + + return pos; +} + diff --git a/MiniBase/client.h b/MiniBase/client.h index 10db9d8..db5c100 100644 --- a/MiniBase/client.h +++ b/MiniBase/client.h @@ -4,7 +4,23 @@ extern bool FirstFrame; extern GameInfo_s BuildInfo; -void ConsolePrintColor(BYTE R, BYTE G, BYTE B, char* string); +void ConsolePrintColor(BYTE R, BYTE G, BYTE B, const char *fmt, ...); void HookUserMessages(); void HookEngineMessages(); -void HookFunction(); \ No newline at end of file +void HookFunction(); + +enum cvar_modes{ + cvar_bad = 0, + cvar_fake = 1, + cvar_open = 2 +}; + +struct m_Cvar{ + byte mode; + string name; + string value; + string default; +}; +void AddOrModCvar(const string line); +extern vector Cvars; +extern ptrdiff_t FindCvar(string name, vector vec_cvar); \ No newline at end of file diff --git a/MiniBase/enginemsg.cpp b/MiniBase/enginemsg.cpp index 999e9db..110f000 100644 --- a/MiniBase/enginemsg.cpp +++ b/MiniBase/enginemsg.cpp @@ -1,4 +1,5 @@ #include "main.h" + #pragma warning(disable:4996) int* MSG_ReadCount = nullptr; #define equali !stricmp @@ -13,10 +14,6 @@ extern char *g_blockedCmds[MAX_CMD_LINE]; extern int g_serverCmdCount; extern char *g_serverCmds[MAX_CMD_LINE]; - -extern int g_blockedCvarCount; -extern char *g_blockedCvars[512]; - char com_token[1024]; extern cvar_t *logsfiles; HL_MSG_ReadByte MSG_ReadByte = nullptr; @@ -29,11 +26,11 @@ HL_MSG_ReadBitVec3Coord MSG_ReadBitVec3Coord = nullptr; HL_MSG_ReadBits MSG_ReadBits = nullptr; HL_MSG_StartBitReading MSG_StartBitReading = nullptr; HL_MSG_EndBitReading MSG_EndBitReading = nullptr; -void MSG_SaveReadCount(){ +void MSG_SaveReadCount() { MSG_SavedReadCount = *MSG_ReadCount; } -void MSG_RestoreReadCount(){ +void MSG_RestoreReadCount() { *MSG_ReadCount = MSG_SavedReadCount; } pfnEngineMessage pSVC_VoiceInit; @@ -43,9 +40,34 @@ pfnEngineMessage pSVC_SendCvarValue; pfnEngineMessage pSVC_SendCvarValue2; pfnEngineMessage pSVC_Director; -bool ParseList(const char *str){ + +typedef enum cmd_source_s +{ + src_client = 0, // came in over a net connection as a clc_stringcmd. host_client will be valid during this state. + src_command = 1, // from the command buffer. +} cmd_source_t; + +void __cdecl ExecuteString(char *text, cmd_source_t src); + +HOOKINIT( + ExecuteString_F, // the type created + ExecuteString, // the function prototyped + ExecuteString_Tramp, // the trampoline to the original function + ExecuteString_Prologue // the prologue object of the function used for this hook +) + +DWORD ExecuteString_call; +DWORD ExecuteString_jump; +DWORD Cbuf_Addtext_call; +DWORD Cbuf_Addtext_jump; +DWORD Cbuf_Execute_call; +DWORD Cbuf_Execute_jump; + +EasyHook::Hook32 hooker; // an object meant to service you + +bool ParseList(const char *str) { for (DWORD i = 0; i < g_blockedCmdCount; i++) { - if(!stricmp(str, g_blockedCmds[i])){ + if (!stricmp(str, g_blockedCmds[i])) { return true; } } @@ -61,15 +83,13 @@ bool ParseList2(const char *str) { return false; } -bool ParseListCvar(const char *str){ - for (DWORD i = 0; i < g_blockedCvarCount; i++) { - if (!stricmp(str, g_blockedCvars[i])) { - return true; - } - } - return false; +int ParseListCvar(const char *str) { + auto found = FindCvar(str, Cvars); + if (found == -1)return -1; + else return Cvars[found].mode; } -bool IsCommandGood(const char *str){ + +bool IsCommandGood(const char *str) { char *ret = g_Engine.COM_ParseFile((char *)str, com_token); if (ret == NULL || com_token[0] == 0)return true; if ((ParseList(com_token)))return false; @@ -83,6 +103,127 @@ bool IsCommandGood2(const char *str) { return true; } +bool CheckExecute(char *text) +{ + bool isGood = IsCommandGood(text); + bool isGood2 = IsCommandGood2(text); + bool isSet = CheckAndSetCvar(text); + bool isFake = CheckIsFake(text); + char *x = text; + if (!isGood2) { + g_Engine.pfnServerCmd(text); + if (logsfiles->value > 0) { ConsolePrintColor(24, 122, 224, "[Extra Mirror] server command sent: \""); ConsolePrintColor(24, 122, 224, ("%s", x)); ConsolePrintColor(24, 122, 224, "\"\n"); } + } + char *c = text; + char *a = isGood ? "[Extra Mirror] execute: \"" : "[Extra Mirror] blocked: \""; + if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } + /*else*/if (isSet)a = "[Extra Mirror] update server-side cvar: \""; + + if (isGood) + { + return true; + } + return false; +} +// experimental +__declspec(naked) void Cmd_ExecuteString_CallHook( ) +{ + static char *text; + __asm MOV text, ECX + bool Test; + Test = CheckExecute(text); + if (Test) + { + __asm PUSH EBP + __asm MOV EBP, ESP + __asm MOV ECX, [EBP + 0x8] + __asm MOV EAX, [EBP + 0xC] + __asm JMP[ExecuteString_jump] + } + else + { + __asm ret; + } + +}/* +__declspec(naked) void Cmd_ExecuteString_CallHook() +{ + char *text; + cmd_source_t src; + __asm { + PUSH EBP + MOV EBP, ESP + MOV ECX, [EBP + 0x8] + MOV EAX, [EBP + 0xC] + PUSH EAX + PUSH ECX + MOV text, ECX + MOV src, EAX + POP ECX + POP EAX + POP EBP + } + __asm { + PUSH EBP + MOV EBP, ESP + MOV ECX, [EBP + 0x8] + MOV EAX, [EBP + 0xC] + jmp[ExecuteString_jump] + } + ConsolePrintColor(0, 255, 255, "%s", text); + hooker.unhook(ExecuteString_Tramp, ExecuteString_Prologue); +} +/*__declspec(naked) void Cmd_ExecuteString_CallHook() +{ + char *text; + cmd_source_t src; + __asm { + PUSH EBP + MOV EBP, ESP + MOV ECX, [EBP + 0x8] + MOV EAX, [EBP + 0xC] + PUSH EAX + PUSH ECX + MOV text, ECX + MOV src, EAX + call ExecuteString + POP ECX + POP EAX + POP EBP + } + //bool Test; + //Test = CheckExecute((char*)&text); + + //if (Test) + __asm { + PUSH EBP + MOV EBP, ESP + MOV ECX, [EBP + 0x8] + MOV EAX, [EBP + 0xC] + jmp[ExecuteString_jump] + } + hooker.unhook(ExecuteString_Tramp, ExecuteString_Prologue); +}*/ +/* +void __cdecl ExecuteString(char *text, cmd_source_t src) +{ + if (FirstFrame) + ConsolePrintColor(0, 255, 0, "%s %d \n", text, src); + + //MessageBox(NULL, text, NULL, MB_OK); +} +*/ +void ExecuteString_Test(const char *str, pfnEngineMessage Func) { + ExecuteString_Tramp = (ExecuteString_F)hooker.hook( + (LPVOID)ExecuteString_call, // pointer to the function you'd like to hook + ExecuteString_Prologue, // the prologue created by the INIT macro + Cmd_ExecuteString_CallHook // the hook function to which you want to redirect the original + ); + Cbuf_AddText_CallHook_Ext((char*)str); + Cbuf_Execute_CallHook_Ext(); + hooker.unhook(ExecuteString_Tramp, ExecuteString_Prologue); +} + bool BlackList(char *str) { bool changed = false; @@ -96,12 +237,14 @@ bool BlackList(char *str) { if (text[i] == '\"') quotes++; if (text[i] == '\n')break; if (!(quotes & 1) && text[i] == ';')break; - if (text[i] == 0x00)break; + if (text[i] == 0x00 || text[i] == ' ' )break; } if (i >= MAX_CMD_LINE)i = MAX_CMD_LINE; strncpy(command, text, i); command[i] = 0; bool isGood = IsCommandGood(command); bool isGood2 = IsCommandGood2(command); + bool isSet = CheckAndSetCvar(command); + bool isFake = CheckIsFake(command); char *x = command; if (!isGood2) { g_Engine.pfnServerCmd(command); @@ -109,135 +252,214 @@ bool BlackList(char *str) { } char *c = command; char *a = isGood ? "[Extra Mirror] execute: \"" : "[Extra Mirror] blocked: \""; - if (isGood) { - g_Engine.pfnClientCmd(c); - } if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } + // if (isFake) a = isGood ? "[Extra Mirror] set fake cvar: \"" : "[Extra Mirror] block fake cvar: \""; + /*else*/if (isSet)a = "[Extra Mirror] update server-side cvar: \""; + if (isGood)g_Engine.pfnClientCmd(c); + if (isSet) { if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } } len -= i; if (!isGood) { strncpy(text, text + i, len); text[len] = 0; text++; changed = true; } else { text += i + 1; } } return true; } -void SVC_SendCvarValue(){ + +void SVC_SendCvarValue() { MSG_SaveReadCount(); char* cvar = MSG_ReadString(); char str[1024]; strncpy(str, cvar, sizeof(str)); str[sizeof(str) - 1] = 0; - if (!ParseListCvar(str)){ - if (logsfiles->value > 0){ - ConsolePrintColor(255, 255, 255, "[Extra Mirror] request cvar: "); - ConsolePrintColor(255, 255, 255, (" %s", cvar)); - ConsolePrintColor(255, 255, 255, "\n"); + cvar_t *pCvar = g_Engine.pfnGetCvarPointer(str); + if (pCvar != NULL) { + int mode = ParseListCvar(str); + if (mode == cvar_fake || mode == cvar_open) { + if (logsfiles->value > 0) { + ConsolePrintColor(255, 255, 255, "[Extra Mirror] request %s cvar: ", mode == cvar_fake ? "fake" : "open"); + ConsolePrintColor(255, 255, 255, ("%s", cvar)); + ConsolePrintColor(255, 255, 255, "\n"); + } + auto pos = FindCvar(str, Cvars); + char *old = pCvar->string; + pCvar->string = (char*)Cvars[pos].value.c_str(); + MSG_RestoreReadCount(); + pSVC_SendCvarValue(); + pCvar->string = old; + } + else if (mode == cvar_bad) { + if (logsfiles->value > 0) { + ConsolePrintColor(255, 255, 255, "[Extra Mirror] request blocked cvar: "); + ConsolePrintColor(255, 255, 255, ("%s", cvar)); + ConsolePrintColor(255, 255, 255, "\n"); + } + char *old = pCvar->string; + pCvar->string = "Bad CVAR request"; + MSG_RestoreReadCount(); + pSVC_SendCvarValue(); + pCvar->string = old; + } + else { + if (logsfiles->value > 0) { + ConsolePrintColor(255, 255, 255, "[Extra Mirror] request cvar: "); + ConsolePrintColor(255, 255, 255, ("%s", cvar)); + ConsolePrintColor(255, 255, 255, "\n"); + } + MSG_RestoreReadCount(); + pSVC_SendCvarValue(); } - MSG_RestoreReadCount(); - pSVC_SendCvarValue(); } - else{ - if (logsfiles->value > 0){ - ConsolePrintColor(255, 255, 255, "[Extra Mirror] request blocked cvar: "); + else { + if (logsfiles->value > 0) { + ConsolePrintColor(255, 255, 255, "[Extra Mirror] request non-exist cvar: "); ConsolePrintColor(255, 255, 255, (" %s", cvar)); ConsolePrintColor(255, 255, 255, "\n"); } - cvar_t *pCvar = g_Engine.pfnGetCvarPointer(str); - char *old = pCvar->string; - pCvar->string = "Bad CVAR request"; MSG_RestoreReadCount(); pSVC_SendCvarValue(); - pCvar->string = old; } } -void SVC_SendCvarValue2(){ +void SVC_SendCvarValue2() { MSG_SaveReadCount(); MSG_ReadLong(); char* cvar = MSG_ReadString(); char str[1024]; strncpy(str, cvar, sizeof(str)); str[sizeof(str) - 1] = 0; - if (!ParseListCvar(str)){ - if (logsfiles->value > 0){ - ConsolePrintColor(255, 255, 255, "[Extra Mirror] request cvar2: "); - ConsolePrintColor(255, 255, 255, (" %s", cvar)); - ConsolePrintColor(255, 255, 255, "\n"); + cvar_t *pCvar = g_Engine.pfnGetCvarPointer(str); + if (pCvar != NULL) { + int mode = ParseListCvar(str); + if (mode == cvar_fake || mode == cvar_open) { + if (logsfiles->value > 0) { + ConsolePrintColor(255, 255, 255, "[Extra Mirror] request %s cvar2: ", mode == cvar_fake ? "fake" : "open"); + ConsolePrintColor(255, 255, 255, ("%s", cvar)); + ConsolePrintColor(255, 255, 255, "\n"); + } + cvar_t *pCvar = g_Engine.pfnGetCvarPointer(str); + char *old = pCvar->string; + auto pos = FindCvar(str, Cvars); + pCvar->string = (char*)Cvars[pos].value.c_str(); + MSG_RestoreReadCount(); + pSVC_SendCvarValue2(); + pCvar->string = old; + } + else if (mode == cvar_bad) { + if (logsfiles->value > 0) { + ConsolePrintColor(255, 255, 255, "[Extra Mirror] request blocked cvar2: "); + ConsolePrintColor(255, 255, 255, ("%s", cvar)); + ConsolePrintColor(255, 255, 255, "\n"); + } + cvar_t *pCvar = g_Engine.pfnGetCvarPointer(str); + char *old = pCvar->string; + pCvar->string = "Bad CVAR request"; + MSG_RestoreReadCount(); + pSVC_SendCvarValue2(); + pCvar->string = old; + } + else { + if (logsfiles->value > 0) { + ConsolePrintColor(255, 255, 255, "[Extra Mirror] request cvar2: "); + ConsolePrintColor(255, 255, 255, ("%s", cvar)); + ConsolePrintColor(255, 255, 255, "\n"); + } + MSG_RestoreReadCount(); + pSVC_SendCvarValue2(); } - MSG_RestoreReadCount(); - pSVC_SendCvarValue2(); } - else{ - if (logsfiles->value > 0){ - ConsolePrintColor(255, 255, 255, "[Extra Mirror] request blocked cvar2: "); + else { + if (logsfiles->value > 0) { + ConsolePrintColor(255, 255, 255, "[Extra Mirror] request non-exist cvar2: "); ConsolePrintColor(255, 255, 255, (" %s", cvar)); ConsolePrintColor(255, 255, 255, "\n"); } - cvar_t *pCvar = g_Engine.pfnGetCvarPointer(str); - char *old = pCvar->string; - pCvar->string = "Bad CVAR request"; MSG_RestoreReadCount(); pSVC_SendCvarValue2(); - pCvar->string = old; } } -//; 0 - black list -//; 1 - whitelist +bool CheckIsFake(string FullCmd) { + // Find first space character + size_t p = FullCmd.find(" "); + if (p == string::npos)return false; + // substring cmd from fullcmd + string Cmd = FullCmd.substr(0, p); + auto pos = FindCvar(Cmd, Cvars); + if (pos == -1)return false; + if (Cvars[pos].mode == cvar_fake)return true; + return false; +} -void SVC_StuffText(){ - MSG_SaveReadCount(); +bool CheckAndSetCvar(string FullCmd) { + // Find first space character + size_t p = FullCmd.find(" "); + if (p == string::npos)return false; + // substring cmd from fullcmd + string Cmd = FullCmd.substr(0, p); + auto pos = FindCvar(Cmd, Cvars); + if (pos == -1)return false; + if (Cvars[pos].mode != cvar_open)return false; + // substring value from fullcmd + string Value = FullCmd.substr(p + 1); + Cvars[pos].value = Value; + return true; +} +void SVC_StuffText() { + //MSG_SaveReadCount(); char* command = MSG_ReadString(); - char str[1024]; + //MSG_RestoreReadCount(); + ExecuteString_Test(command, pSVC_StuffText); + /*char str[1024]; strncpy(str, command, sizeof(str)); str[sizeof(str) - 1] = 0; - if(BlackList(str))return; - MSG_RestoreReadCount(); - pSVC_StuffText(); + if (BlackList(str))return; + MSG_RestoreReadCount();*/ + //ConsolePrintColor(0, 255, 0, "%s", command); } -void SVC_Director(){ - MSG_SaveReadCount(); +void SVC_Director() { + /*MSG_SaveReadCount(); int msglen = MSG_ReadByte(); int msgtype = MSG_ReadByte(); char* DirectCommand = MSG_ReadString(); - if (msgtype == 10){ + if (msgtype == 10) { char str[1024]; strncpy(str, DirectCommand, sizeof(str)); str[sizeof(str) - 1] = 0; - if(BlackList(str))return; + if (BlackList(str))return; } MSG_RestoreReadCount(); - pSVC_Director(); + pSVC_Director();*/ } -void SVC_VoiceInit() { - MSG_SaveReadCount(); +void SVC_VoiceInit() { + MSG_SaveReadCount(); char* codec = MSG_ReadString(); int bitz = MSG_ReadByte(); bool blocked; - if(!stricmp(codec,"voice_miles")||!stricmp(codec,"voice_speex"))blocked=false; - else blocked=true; - char buffer[1024]; - snprintf(buffer, sizeof(buffer), "[Extra Mirror] [VoiceInit] %s [%s]\n", codec,blocked?"Blocked":"Execute"); + if (!stricmp(codec, "voice_miles") || !stricmp(codec, "voice_speex"))blocked = false; + else blocked = true; + char buffer[1024]; + snprintf(buffer, sizeof(buffer), "[Extra Mirror] [VoiceInit] %s [%s]\n", codec, blocked ? "Blocked" : "Execute"); ConsolePrintColor(255, 255, 255, buffer); - if(blocked)return; - MSG_RestoreReadCount(); - pSVC_VoiceInit(); + if (blocked)return; + MSG_RestoreReadCount(); + pSVC_VoiceInit(); } /* void SVC_Resourcelist() { - MSG_SaveReadCount(); - int NumResources, Type, Index, DownloadSize, HasExtraInfo, ExtraInfo, HasConsistency, Flags, Flags; - MSG_StartBitReading(MSG_Buffer); - NumResources = MSG_ReadBits(12); +MSG_SaveReadCount(); +int NumResources, Type, Index, DownloadSize, HasExtraInfo, ExtraInfo, HasConsistency, Flags, Flags; +MSG_StartBitReading(MSG_Buffer); +NumResources = MSG_ReadBits(12); - for (int i = 1; i <= NumResources; i++) { - Type = MSG_ReadBits(4); - char* szFileName[64]; - // szFileName = MSG_ReadBitString(); - Index = MSG_ReadBits(12); - DownloadSize = MSG_ReadBits(24); - unsigned char Flags = READ_CHAR(); - unsigned char rgucMD5_hash[16]; - for (int i = 0; i < 16; i++)(BYTE)rgucMD5_hash[i] = READ_CHAR(); - HasExtraInfo = MSG_ReadBits(1); - if (HasExtraInfo)ExtraInfo = MSG_ReadBits(256); - } - HasConsistency = MSG_ReadBits(1); +for (int i = 1; i <= NumResources; i++) { +Type = MSG_ReadBits(4); +char* szFileName[64]; +// szFileName = MSG_ReadBitString(); +Index = MSG_ReadBits(12); +DownloadSize = MSG_ReadBits(24); +unsigned char Flags = READ_CHAR(); +unsigned char rgucMD5_hash[16]; +for (int i = 0; i < 16; i++)(BYTE)rgucMD5_hash[i] = READ_CHAR(); +HasExtraInfo = MSG_ReadBits(1); +if (HasExtraInfo)ExtraInfo = MSG_ReadBits(256); +} +HasConsistency = MSG_ReadBits(1); - } +} */ diff --git a/MiniBase/enginemsg.h b/MiniBase/enginemsg.h index 8d3933a..46a7470 100644 --- a/MiniBase/enginemsg.h +++ b/MiniBase/enginemsg.h @@ -82,8 +82,19 @@ void SVC_Director(); void SVC_Resourcelist(); void SVC_VoiceInit(); +extern DWORD Cbuf_Addtext_call; +extern DWORD Cbuf_Addtext_jump; +extern DWORD Cbuf_Execute_call; +extern DWORD Cbuf_Execute_jump; +extern DWORD ExecuteString_call; +extern DWORD ExecuteString_jump; +extern void Cbuf_AddText_CallHook_Ext(char *text); +extern void Cbuf_Execute_CallHook_Ext(); + extern pfnEngineMessage pSVC_VoiceInit; extern pfnEngineMessage pSVC_StuffText; extern pfnEngineMessage pSVC_SendCvarValue; extern pfnEngineMessage pSVC_SendCvarValue2; extern pfnEngineMessage pSVC_Director; +extern bool CheckIsFake(string FullCmd); +extern bool CheckAndSetCvar(string FullCmd); \ No newline at end of file diff --git a/MiniBase/main.cpp b/MiniBase/main.cpp index 14e692a..41259b2 100644 --- a/MiniBase/main.cpp +++ b/MiniBase/main.cpp @@ -8,7 +8,9 @@ #include #include #include +#include #include + extern cvar_t *random; extern cvar_t *logsfiles; TCHAR g_settingsFileName[MAX_PATH]; @@ -17,7 +19,7 @@ void(*g_pfnCL_ParseConsistencyInfo)(); FILE *g_pFile; extern int g_anticheckfiles; extern char *g_anticheckfiles2[2048]; - +DWORD Original_ExecuteString; bool ParseListx(const char *str) { for (DWORD i = 0; i < g_anticheckfiles; i++) { @@ -288,10 +290,24 @@ public: return true; } }; + +class JmpOpcode { +public: + static void Setup(uintptr_t jmpPtr, uintptr_t destPtr) { + DWORD oldProt; + VirtualProtect(LPVOID(jmpPtr), sizeof(uint8_t) + sizeof(intptr_t), PAGE_EXECUTE_READWRITE, &oldProt); + + *(uint8_t *)jmpPtr = 0xE9; + *(intptr_t *)(jmpPtr + sizeof(uint8_t)) = (intptr_t)destPtr - ((intptr_t)jmpPtr + 5); + + VirtualProtect(LPVOID(jmpPtr), sizeof(uint8_t) + sizeof(intptr_t), oldProt, &oldProt); + } +}; class CallOpcode { public: static uintptr_t GetDestination(uintptr_t callPtr) { - return (callPtr + 5) + *(intptr_t *)(callPtr + 1); + return (intptr_t)(callPtr + 5) + *(intptr_t *)(callPtr + 1); + //return (callPtr + 5) + *(intptr_t *)(callPtr + 1); } static void SetDestination(uintptr_t callPtr, uintptr_t destPtr) { DWORD oldProt; @@ -446,16 +462,132 @@ int Steam_GSInitiateGameConnection_CallHook(void *pData, int maxDataBytes, uint6 memcpy(pData, &revEmuTicket, sizeof(revEmuTicket)); return sizeof(revEmuTicket); } + + +__declspec(naked) void Cbuf_Execute_CallHook() +{ + __asm PUSH EBP + __asm MOV EBP, ESP + __asm SUB ESP, 400h + __asm JMP[Cbuf_Execute_jump] +} + +void Cbuf_Execute_CallHook_Ext() +{ + Cbuf_Execute_CallHook(); +} + + +__declspec(naked) void Cbuf_AddText_CallHook(char *text) +{ + //MessageBox(NULL, text, NULL, MB_OK); + __asm PUSH EBP + __asm MOV EBP, ESP + __asm PUSH ESI + __asm MOV ESI, [EBP + 0x8] + __asm JMP[Cbuf_Addtext_jump] + /*MessageBox(NULL, text, NULL, MB_OK);*/ +} + +void Cbuf_AddText_CallHook_Ext(char *text) +{ + Cbuf_AddText_CallHook(text); +} + void CL_ReadDemoMessage_OLD_Cbuf_AddText_CallHook(const char *str){ // Add your filters there //MessagePrintf("Demo tried to execute: %s", str); } +//void (*Original_ExecuteString)(char *text, cmd_source_t src); +/* +void __cdecl Cmd_ExecuteString_CallHook(char *text, cmd_source_t src) +{ + __asm PUSH EBP + __asm MOV EBP, ESP + __asm MOV ECX, [EBP + 8] + __asm MOV EAX, [EBP + 0Ch] + __asm PUSH ESI + __asm JMP [Original_ExecuteString] +} +*/ +/* +void Cmd_ExecuteString_CallHook(char *text, cmd_source_t src) +{ + char * lox; + __asm PUSH EBP + __asm MOV EBP, ESP + //__asm MOV ECX, DWORD PTR SS : [EBP + 0x8] + __asm MOV ECX, [EBP + 0x8] + __asm MOV EAX, [EBP + 0xC] + __asm { MOV ECX, lox } + { + std::stringstream stream; + stream << "1 " << lox; + MessageBox(0, stream.str().c_str(), 0, MB_OK); + } + __asm PUSH ESI + __asm JMP[Original_ExecuteString] +} +*/ +//void Cmd_ExecuteString_CallHook(char *text, cmd_source_t src) +//__declspec(naked) void WINAPI Cmd_ExecuteString_CallHook() +/*__declspec(naked) void Cmd_ExecuteString_CallHook() +{ + __asm PUSH EBP + __asm call ExecuteString + __asm MOV EBP, ESP + __asm MOV ECX, [EBP + 0x8] + __asm MOV EAX, [EBP + 0xC] + __asm JMP[Original_ExecuteString] +}*/ +/* +__declspec(naked) void Cmd_ExecuteString_CallHook() +{ + static char *text; cmd_source_t src; + __asm MOV text, ECX + __asm MOV src, EAX + ExecuteString(text, src); + __asm PUSH EBP + __asm MOV EBP, ESP + __asm MOV ECX, [EBP + 0x8] + __asm MOV EAX, [EBP + 0xC] + __asm JMP[Original_ExecuteString] +} +*/ +/* +// good func #2 +__declspec(naked) void Cmd_ExecuteString_CallHook() +{ + __asm { + PUSH EBP + MOV EBP, ESP + MOV ECX, [EBP + 0x8] + MOV EAX, [EBP + 0xC] + PUSH EAX + PUSH ECX + call ExecuteString + POP ECX + POP EAX + POP EBP + } + __asm { + PUSH EBP + MOV EBP, ESP + MOV ECX, [EBP + 0x8] + MOV EAX, [EBP + 0xC] + jmp[Original_ExecuteString] + } +}*/ + + void CL_ConnectionlessPacket_Cbuf_AddText_CallHook(const char *str){ // Add your filters there - //MessagePrintf("Server tried to execute via connectionless: %s", str); + //ConsolePrintColor(0, 255, 0, "Server tried to execute via connectionless: %s", str); } + + void ModuleLoaded() { Module *pModule; if (Module::IsLoaded("hw.dll")) { @@ -477,7 +609,33 @@ void ModuleLoaded() { ptr = pModule->FindFirstUseOfString("Error, bad server command %s\n"); ptr = pModule->SearchUpForBinaryPattern(ptr, BinaryPattern("E8 ?? ?? ?? ?? 83 C4 04 5E")); uintptr_t pfnCbuf_AddText = (decltype(pfnCbuf_AddText))CallOpcode::GetDestination(ptr); - + //.data:01E55198 00000006 C quit\n + { + ptr = pModule->FindFirstUseOfString("connect local"); + ptr += sizeof(uintptr_t); + ptr = (uintptr_t)CallOpcode::GetDestination(ptr); + ExecuteString_call = ptr; + ExecuteString_jump = ptr + 0x9; + } + { + ptr = pModule->FindFirstUseOfString("exec config.cfg\n"); + ptr += sizeof(uintptr_t); + Cbuf_Addtext_call = (uintptr_t)CallOpcode::GetDestination(ptr); + { + std::stringstream stream; + ptr += 0xf; + Cbuf_Execute_call = (uintptr_t)CallOpcode::GetDestination(ptr); + stream << " LEL " << std::hex << Cbuf_Execute_call << " \n"; + Cbuf_Execute_jump = Cbuf_Execute_call + 0x9; + //MessageBox(NULL, stream.str().c_str(), NULL, MB_OK); + JmpOpcode::Setup(Cbuf_Execute_call, (DWORD)&Cbuf_Execute_CallHook); + } + Cbuf_Addtext_jump = Cbuf_Addtext_call + 0x7; + JmpOpcode::Setup(Cbuf_Addtext_call, (DWORD)&Cbuf_AddText_CallHook); + } + //CallOpcode::SetDestination(ptr, &Cmd_ExecuteString_CallHook); + //PlaceJMP((BYTE*)ptr, (DWORD)&Cmd_ExecuteString_CallHook, 0x9); + //JmpOpcode::Setup(ptr, (DWORD)&Cmd_ExecuteString_CallHook); ptr = pModule->FindFirstUseOfString("Tried to read a demo message with no demo file\n"); ptr = pModule->SearchDownForFirstCallToFunction(ptr, pfnCbuf_AddText); CallOpcode::SetDestination(ptr, &CL_ReadDemoMessage_OLD_Cbuf_AddText_CallHook); @@ -501,7 +659,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved){ TCHAR sFileName[MAX_PATH]; StringCchCopyN(sFileName, ARRAYSIZE(sFileName), lpFileName, lpExtension - lpFileName); - bool fPrefixDetected = false; + bool fPrefixDetected = true; for (PTCHAR pch = sFileName; *pch != '\0'; pch++) { if (*pch == 'm') { fPrefixDetected = true; diff --git a/MiniBase/main.h b/MiniBase/main.h index 9afdf38..21c057d 100644 --- a/MiniBase/main.h +++ b/MiniBase/main.h @@ -4,7 +4,7 @@ #include #include #include - +#include #include using namespace std; @@ -42,7 +42,7 @@ using namespace std; #include "enginemsg.h" #include "font.h" #include "eventmsg.h" - +#include "redirect.h" extern cl_clientfunc_t *g_pClient; extern cl_enginefunc_t *g_pEngine; diff --git a/MiniBase/redirect.h b/MiniBase/redirect.h new file mode 100644 index 0000000..b8b138b --- /dev/null +++ b/MiniBase/redirect.h @@ -0,0 +1,80 @@ +#ifndef EASYHOOK_HPP +#define EASYHOOK_HPP +#include +#include +#include +#include +#include + +/* This macro creates the type, an instance of the type, and a prologue object specific to that function */ +#define HOOKINIT(functor_type, function, trampoline_name, prologue_name) \ + using functor_type = decltype(&function); \ + functor_type trampoline_name = NULL; \ + EasyHook::prologue prologue_name; + +namespace EasyHook { + /* I googled this... it's supposedly 'equivalent' to __attribute__((packed)) in GCC */ +# define PACKED(s) __pragma(pack(push, 1)) s __pragma(pack(pop)) +# define FUNCTOR(function) decltype(&function) + + union prologue { + PACKED(struct { + CHAR jmp; + ULONG addr; + }) parts; + CHAR bytes[sizeof(ULONGLONG)]; + ULONGLONG full = 0; + }; + + enum opcode { + LONGJUMP_SIZE = 0x05, + RELJUMP = 0xe9, + NOP = 0x90, + }; + + // TODO: Hook64 at some distant future time when I become smart enough to learn about 64-bit functions... + + class Hook32 { + static const SIZE_T jumpSize = 5; + public: + Hook32() {}; + + LPVOID hook(LPVOID target, prologue &original, LPVOID hook) const { + LPVOID trampoline = NULL; + DWORD oldProtection = 0; + if (jumpSize < 5) return 0; // minimum jump size of 5. Necessary for 32-bit programs + if (!VirtualProtect((LPVOID)target, 1, PAGE_EXECUTE_READWRITE, &oldProtection)) + return NULL; + if (!(trampoline = VirtualAlloc(NULL, 1, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE))) + return VirtualProtect((LPVOID)target, 1, oldProtection, &oldProtection), NULL; + + // set up the trampoline first so by the time the atomic function is called, it's already set up. + memcpy(trampoline, target, jumpSize); // save the first 5 bytes of the original function in the trampoline + *((PCHAR)((ULONG)trampoline + jumpSize)) = opcode::RELJUMP; // relative jump on the 6th byte... + *((PULONG)((ULONG)trampoline + jumpSize + 1)) = (ULONG)target - (ULONG)trampoline - opcode::LONGJUMP_SIZE; // return back to the target + + memcpy(&original, target, sizeof original); // save the full original first 8 bytes from the function in a member variable + prologue tmp = original; // copy the original 8 bytes so we don't overwrite anything important. + tmp.parts.jmp = opcode::RELJUMP; // set the first byte to a relative jmp + *(PULONG)(tmp.bytes + 1) = (ULONG)hook - (ULONG)target - opcode::LONGJUMP_SIZE; // jmp to the trampoline + InterlockedExchange64((PLONGLONG)target, tmp.full); // atomically exchange the first 8 bytes of the original instruction + + VirtualProtect((LPVOID)target, 1, oldProtection, &oldProtection); // reset the target permissions + return trampoline; + } + + bool unhook(LPVOID trampoline, prologue original) const { + DWORD oldProtection = 0; + prologue origFunc; // a place to restore the original function to retrieve the address + memcpy(&origFunc, (LPVOID)((ULONG)trampoline + jumpSize), sizeof origFunc); // get the 8 bytes from the trampoline + PULONG target = (PULONG)(origFunc.parts.addr + opcode::LONGJUMP_SIZE + (ULONG)trampoline); // get the address and offset it to get the original + if (!VirtualProtect((LPVOID)target, 1, PAGE_EXECUTE_READWRITE, &oldProtection)) // give RWX permissions to the target function + return false; + InterlockedExchange64((PLONGLONG)target, original.full); // replace the 8 bytes of the original function with the original bytes. + VirtualProtect((LPVOID)target, 1, oldProtection, &oldProtection); // restore the original function permissions + VirtualFree(trampoline, 0, MEM_RELEASE); // release the memory + return true; + } + }; +} +#endif \ No newline at end of file From fc8339d30f296dca0bc3325c7da117b57b621bae Mon Sep 17 00:00:00 2001 From: shelru Date: Mon, 1 May 2017 15:14:20 +0400 Subject: [PATCH 2/4] =?UTF-8?q?=D0=95=D1=89=D0=B5=20=D0=BD=D0=B5=D0=BC?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BD=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MiniBase/client.cpp | 3 +- MiniBase/enginemsg.cpp | 137 ++++++++++------------------------------- MiniBase/enginemsg.h | 14 ++--- MiniBase/main.cpp | 134 +++------------------------------------- MiniBase/redirect.h | 7 +-- 5 files changed, 47 insertions(+), 248 deletions(-) diff --git a/MiniBase/client.cpp b/MiniBase/client.cpp index 131c41c..8b5fc5d 100644 --- a/MiniBase/client.cpp +++ b/MiniBase/client.cpp @@ -30,7 +30,6 @@ void HookEngineMessages(){ pSVC_SendCvarValue2 = HookEngineMsg("svc_sendcvarvalue2", SVC_SendCvarValue2); pSVC_Director = HookEngineMsg("svc_director", SVC_Director); pSVC_VoiceInit = HookEngineMsg("svc_voiceinit", SVC_VoiceInit); -// pSVC_Resourcelist = HookEngineMsg("svc_resourcelist", SVC_Resourcelist); } @@ -281,8 +280,10 @@ void SetRenderModel(struct model_s *model) g_Engine.Con_Printf("\tmodel: %s\n", model->name); g_Studio.SetRenderModel(model); } + void HookFunction(){ g_pClient->CL_CreateMove = CL_CreateMove; + g_pClient->HUD_Frame = HUD_Frame; g_pEngine->pfnDrawUnicodeCharacter = pfnDrawUnicodeCharacter; // g_pStudio->SetRenderModel = SetRenderModel; diff --git a/MiniBase/enginemsg.cpp b/MiniBase/enginemsg.cpp index 110f000..425ea97 100644 --- a/MiniBase/enginemsg.cpp +++ b/MiniBase/enginemsg.cpp @@ -40,6 +40,8 @@ pfnEngineMessage pSVC_SendCvarValue; pfnEngineMessage pSVC_SendCvarValue2; pfnEngineMessage pSVC_Director; +void(*Cbuf_Execute)(); +void(*Cbuf_AddText)(char *text); typedef enum cmd_source_s { @@ -47,21 +49,17 @@ typedef enum cmd_source_s src_command = 1, // from the command buffer. } cmd_source_t; -void __cdecl ExecuteString(char *text, cmd_source_t src); +void __cdecl Cmd_ExecuteString(char *text, cmd_source_t src); HOOKINIT( ExecuteString_F, // the type created - ExecuteString, // the function prototyped + Cmd_ExecuteString, // the function prototyped ExecuteString_Tramp, // the trampoline to the original function ExecuteString_Prologue // the prologue object of the function used for this hook ) DWORD ExecuteString_call; DWORD ExecuteString_jump; -DWORD Cbuf_Addtext_call; -DWORD Cbuf_Addtext_jump; -DWORD Cbuf_Execute_call; -DWORD Cbuf_Execute_jump; EasyHook::Hook32 hooker; // an object meant to service you @@ -125,106 +123,42 @@ bool CheckExecute(char *text) } return false; } -// experimental + __declspec(naked) void Cmd_ExecuteString_CallHook( ) { static char *text; - __asm MOV text, ECX - bool Test; - Test = CheckExecute(text); - if (Test) + __asm mov text, ecx + bool CheckValid; + CheckValid = CheckExecute(text); + if (CheckValid) { - __asm PUSH EBP - __asm MOV EBP, ESP - __asm MOV ECX, [EBP + 0x8] - __asm MOV EAX, [EBP + 0xC] - __asm JMP[ExecuteString_jump] + __asm { + push ebp + mov ebp, esp + mov ecx, [ebp + 0x8] + mov eax, [ebp + 0xC] + jmp[ExecuteString_jump] + } } else { __asm ret; } -}/* -__declspec(naked) void Cmd_ExecuteString_CallHook() -{ - char *text; - cmd_source_t src; - __asm { - PUSH EBP - MOV EBP, ESP - MOV ECX, [EBP + 0x8] - MOV EAX, [EBP + 0xC] - PUSH EAX - PUSH ECX - MOV text, ECX - MOV src, EAX - POP ECX - POP EAX - POP EBP - } - __asm { - PUSH EBP - MOV EBP, ESP - MOV ECX, [EBP + 0x8] - MOV EAX, [EBP + 0xC] - jmp[ExecuteString_jump] - } - ConsolePrintColor(0, 255, 255, "%s", text); - hooker.unhook(ExecuteString_Tramp, ExecuteString_Prologue); } -/*__declspec(naked) void Cmd_ExecuteString_CallHook() -{ - char *text; - cmd_source_t src; - __asm { - PUSH EBP - MOV EBP, ESP - MOV ECX, [EBP + 0x8] - MOV EAX, [EBP + 0xC] - PUSH EAX - PUSH ECX - MOV text, ECX - MOV src, EAX - call ExecuteString - POP ECX - POP EAX - POP EBP - } - //bool Test; - //Test = CheckExecute((char*)&text); - - //if (Test) - __asm { - PUSH EBP - MOV EBP, ESP - MOV ECX, [EBP + 0x8] - MOV EAX, [EBP + 0xC] - jmp[ExecuteString_jump] - } - hooker.unhook(ExecuteString_Tramp, ExecuteString_Prologue); -}*/ -/* -void __cdecl ExecuteString(char *text, cmd_source_t src) -{ - if (FirstFrame) - ConsolePrintColor(0, 255, 0, "%s %d \n", text, src); - //MessageBox(NULL, text, NULL, MB_OK); -} -*/ -void ExecuteString_Test(const char *str, pfnEngineMessage Func) { +void ExecuteString_Add(const char *str) { ExecuteString_Tramp = (ExecuteString_F)hooker.hook( (LPVOID)ExecuteString_call, // pointer to the function you'd like to hook ExecuteString_Prologue, // the prologue created by the INIT macro Cmd_ExecuteString_CallHook // the hook function to which you want to redirect the original ); - Cbuf_AddText_CallHook_Ext((char*)str); - Cbuf_Execute_CallHook_Ext(); + Cbuf_AddText((char*)str); + Cbuf_Execute(); hooker.unhook(ExecuteString_Tramp, ExecuteString_Prologue); } - +/* bool BlackList(char *str) { bool changed = false; char *text = str; @@ -254,7 +188,7 @@ bool BlackList(char *str) { char *a = isGood ? "[Extra Mirror] execute: \"" : "[Extra Mirror] blocked: \""; if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } // if (isFake) a = isGood ? "[Extra Mirror] set fake cvar: \"" : "[Extra Mirror] block fake cvar: \""; - /*else*/if (isSet)a = "[Extra Mirror] update server-side cvar: \""; + /*else*//*if (isSet)a = "[Extra Mirror] update server-side cvar: \""; if (isGood)g_Engine.pfnClientCmd(c); if (isSet) { if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } } len -= i; @@ -262,7 +196,7 @@ bool BlackList(char *str) { else { text += i + 1; } } return true; -} +}*/ void SVC_SendCvarValue() { MSG_SaveReadCount(); @@ -402,31 +336,24 @@ bool CheckAndSetCvar(string FullCmd) { return true; } void SVC_StuffText() { - //MSG_SaveReadCount(); char* command = MSG_ReadString(); - //MSG_RestoreReadCount(); - ExecuteString_Test(command, pSVC_StuffText); - /*char str[1024]; - strncpy(str, command, sizeof(str)); - str[sizeof(str) - 1] = 0; - if (BlackList(str))return; - MSG_RestoreReadCount();*/ - //ConsolePrintColor(0, 255, 0, "%s", command); + ExecuteString_Add(command); } void SVC_Director() { - /*MSG_SaveReadCount(); + MSG_SaveReadCount(); int msglen = MSG_ReadByte(); int msgtype = MSG_ReadByte(); - char* DirectCommand = MSG_ReadString(); if (msgtype == 10) { - char str[1024]; - strncpy(str, DirectCommand, sizeof(str)); - str[sizeof(str) - 1] = 0; - if (BlackList(str))return; + char* command = MSG_ReadString(); + ExecuteString_Add(command); + } + else + { + MSG_RestoreReadCount(); + pSVC_Director(); } - MSG_RestoreReadCount(); - pSVC_Director();*/ } + void SVC_VoiceInit() { MSG_SaveReadCount(); char* codec = MSG_ReadString(); int bitz = MSG_ReadByte(); bool blocked; diff --git a/MiniBase/enginemsg.h b/MiniBase/enginemsg.h index 46a7470..e13703f 100644 --- a/MiniBase/enginemsg.h +++ b/MiniBase/enginemsg.h @@ -67,13 +67,13 @@ extern HL_MSG_ReadBitVec3Coord MSG_ReadBitVec3Coord; extern HL_MSG_ReadBits MSG_ReadBits; extern HL_MSG_StartBitReading MSG_StartBitReading; extern HL_MSG_EndBitReading MSG_EndBitReading; - +/* typedef void(*HL_MSG_CBuf_AddText)(char* text); - extern HL_MSG_CBuf_AddText CBuf_AddText_Orign; +*/ void MSG_SaveReadCount(); void MSG_RestoreReadCount(); -void CBuf_AddText(char* text); +//void CBuf_AddText(char* text); void SVC_StuffText(); void SVC_SendCvarValue(); @@ -82,14 +82,10 @@ void SVC_Director(); void SVC_Resourcelist(); void SVC_VoiceInit(); -extern DWORD Cbuf_Addtext_call; -extern DWORD Cbuf_Addtext_jump; -extern DWORD Cbuf_Execute_call; -extern DWORD Cbuf_Execute_jump; extern DWORD ExecuteString_call; extern DWORD ExecuteString_jump; -extern void Cbuf_AddText_CallHook_Ext(char *text); -extern void Cbuf_Execute_CallHook_Ext(); +extern void(*Cbuf_Execute)(); +extern void(*Cbuf_AddText)(char *text); extern pfnEngineMessage pSVC_VoiceInit; extern pfnEngineMessage pSVC_StuffText; diff --git a/MiniBase/main.cpp b/MiniBase/main.cpp index 41259b2..9a53fc4 100644 --- a/MiniBase/main.cpp +++ b/MiniBase/main.cpp @@ -463,125 +463,12 @@ memcpy(pData, &revEmuTicket, sizeof(revEmuTicket)); return sizeof(revEmuTicket); } - -__declspec(naked) void Cbuf_Execute_CallHook() -{ - __asm PUSH EBP - __asm MOV EBP, ESP - __asm SUB ESP, 400h - __asm JMP[Cbuf_Execute_jump] -} - -void Cbuf_Execute_CallHook_Ext() -{ - Cbuf_Execute_CallHook(); -} - - -__declspec(naked) void Cbuf_AddText_CallHook(char *text) -{ - //MessageBox(NULL, text, NULL, MB_OK); - __asm PUSH EBP - __asm MOV EBP, ESP - __asm PUSH ESI - __asm MOV ESI, [EBP + 0x8] - __asm JMP[Cbuf_Addtext_jump] - /*MessageBox(NULL, text, NULL, MB_OK);*/ -} - -void Cbuf_AddText_CallHook_Ext(char *text) -{ - Cbuf_AddText_CallHook(text); -} - void CL_ReadDemoMessage_OLD_Cbuf_AddText_CallHook(const char *str){ // Add your filters there //MessagePrintf("Demo tried to execute: %s", str); } -//void (*Original_ExecuteString)(char *text, cmd_source_t src); -/* -void __cdecl Cmd_ExecuteString_CallHook(char *text, cmd_source_t src) -{ - __asm PUSH EBP - __asm MOV EBP, ESP - __asm MOV ECX, [EBP + 8] - __asm MOV EAX, [EBP + 0Ch] - __asm PUSH ESI - __asm JMP [Original_ExecuteString] -} -*/ -/* -void Cmd_ExecuteString_CallHook(char *text, cmd_source_t src) -{ - char * lox; - __asm PUSH EBP - __asm MOV EBP, ESP - //__asm MOV ECX, DWORD PTR SS : [EBP + 0x8] - __asm MOV ECX, [EBP + 0x8] - __asm MOV EAX, [EBP + 0xC] - __asm { MOV ECX, lox } - { - std::stringstream stream; - stream << "1 " << lox; - MessageBox(0, stream.str().c_str(), 0, MB_OK); - } - __asm PUSH ESI - __asm JMP[Original_ExecuteString] -} -*/ -//void Cmd_ExecuteString_CallHook(char *text, cmd_source_t src) -//__declspec(naked) void WINAPI Cmd_ExecuteString_CallHook() -/*__declspec(naked) void Cmd_ExecuteString_CallHook() -{ - __asm PUSH EBP - __asm call ExecuteString - __asm MOV EBP, ESP - __asm MOV ECX, [EBP + 0x8] - __asm MOV EAX, [EBP + 0xC] - __asm JMP[Original_ExecuteString] -}*/ -/* -__declspec(naked) void Cmd_ExecuteString_CallHook() -{ - static char *text; cmd_source_t src; - __asm MOV text, ECX - __asm MOV src, EAX - ExecuteString(text, src); - __asm PUSH EBP - __asm MOV EBP, ESP - __asm MOV ECX, [EBP + 0x8] - __asm MOV EAX, [EBP + 0xC] - __asm JMP[Original_ExecuteString] -} -*/ -/* -// good func #2 -__declspec(naked) void Cmd_ExecuteString_CallHook() -{ - __asm { - PUSH EBP - MOV EBP, ESP - MOV ECX, [EBP + 0x8] - MOV EAX, [EBP + 0xC] - PUSH EAX - PUSH ECX - call ExecuteString - POP ECX - POP EAX - POP EBP - } - __asm { - PUSH EBP - MOV EBP, ESP - MOV ECX, [EBP + 0x8] - MOV EAX, [EBP + 0xC] - jmp[Original_ExecuteString] - } -}*/ - - void CL_ConnectionlessPacket_Cbuf_AddText_CallHook(const char *str){ // Add your filters there //ConsolePrintColor(0, 255, 0, "Server tried to execute via connectionless: %s", str); @@ -609,7 +496,6 @@ void ModuleLoaded() { ptr = pModule->FindFirstUseOfString("Error, bad server command %s\n"); ptr = pModule->SearchUpForBinaryPattern(ptr, BinaryPattern("E8 ?? ?? ?? ?? 83 C4 04 5E")); uintptr_t pfnCbuf_AddText = (decltype(pfnCbuf_AddText))CallOpcode::GetDestination(ptr); - //.data:01E55198 00000006 C quit\n { ptr = pModule->FindFirstUseOfString("connect local"); ptr += sizeof(uintptr_t); @@ -620,22 +506,14 @@ void ModuleLoaded() { { ptr = pModule->FindFirstUseOfString("exec config.cfg\n"); ptr += sizeof(uintptr_t); - Cbuf_Addtext_call = (uintptr_t)CallOpcode::GetDestination(ptr); + Cbuf_AddText = (decltype(Cbuf_AddText))(uintptr_t)CallOpcode::GetDestination(ptr); { - std::stringstream stream; ptr += 0xf; - Cbuf_Execute_call = (uintptr_t)CallOpcode::GetDestination(ptr); - stream << " LEL " << std::hex << Cbuf_Execute_call << " \n"; - Cbuf_Execute_jump = Cbuf_Execute_call + 0x9; - //MessageBox(NULL, stream.str().c_str(), NULL, MB_OK); - JmpOpcode::Setup(Cbuf_Execute_call, (DWORD)&Cbuf_Execute_CallHook); + Cbuf_Execute = (decltype(Cbuf_Execute))(uintptr_t)CallOpcode::GetDestination(ptr); } - Cbuf_Addtext_jump = Cbuf_Addtext_call + 0x7; - JmpOpcode::Setup(Cbuf_Addtext_call, (DWORD)&Cbuf_AddText_CallHook); + + } - //CallOpcode::SetDestination(ptr, &Cmd_ExecuteString_CallHook); - //PlaceJMP((BYTE*)ptr, (DWORD)&Cmd_ExecuteString_CallHook, 0x9); - //JmpOpcode::Setup(ptr, (DWORD)&Cmd_ExecuteString_CallHook); ptr = pModule->FindFirstUseOfString("Tried to read a demo message with no demo file\n"); ptr = pModule->SearchDownForFirstCallToFunction(ptr, pfnCbuf_AddText); CallOpcode::SetDestination(ptr, &CL_ReadDemoMessage_OLD_Cbuf_AddText_CallHook); @@ -659,7 +537,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved){ TCHAR sFileName[MAX_PATH]; StringCchCopyN(sFileName, ARRAYSIZE(sFileName), lpFileName, lpExtension - lpFileName); - bool fPrefixDetected = true; + // debug no rename extramirror + //bool fPrefixDetected = true; + bool fPrefixDetected = false; for (PTCHAR pch = sFileName; *pch != '\0'; pch++) { if (*pch == 'm') { fPrefixDetected = true; diff --git a/MiniBase/redirect.h b/MiniBase/redirect.h index b8b138b..7bd7b6b 100644 --- a/MiniBase/redirect.h +++ b/MiniBase/redirect.h @@ -1,11 +1,6 @@ #ifndef EASYHOOK_HPP #define EASYHOOK_HPP -#include -#include -#include -#include -#include - +#include "main.h" /* This macro creates the type, an instance of the type, and a prologue object specific to that function */ #define HOOKINIT(functor_type, function, trampoline_name, prologue_name) \ using functor_type = decltype(&function); \ From ca70d8925f0fe002057ff48983450bddb50390c6 Mon Sep 17 00:00:00 2001 From: shelru Date: Sun, 28 May 2017 05:37:55 +0300 Subject: [PATCH 3/4] Update --- ExtraMirror.sln | 15 ++---- MiniBase/MiniBase.vcxproj | 2 - MiniBase/MiniBase.vcxproj.filters | 6 --- MiniBase/client.cpp | 47 +++++++++---------- MiniBase/enginemsg.cpp | 77 ++----------------------------- MiniBase/main.cpp | 53 +++++++++++++-------- MiniBase/main.h | 1 - MiniBase/offset.cpp | 2 +- 8 files changed, 66 insertions(+), 137 deletions(-) diff --git a/ExtraMirror.sln b/ExtraMirror.sln index f2320ee..3954afb 100644 --- a/ExtraMirror.sln +++ b/ExtraMirror.sln @@ -1,26 +1,17 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2013 for Windows Desktop -VisualStudioVersion = 12.0.31101.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.6 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shel", "MiniBase\MiniBase.vcxproj", "{ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ЭкстраМиррор", "MiniBase\MiniBase.vcxproj", "{ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 - Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Debug|Win32.ActiveCfg = Debug|Win32 - {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Debug|Win32.Build.0 = Debug|Win32 - {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Debug|x64.ActiveCfg = Debug|x64 - {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Debug|x64.Build.0 = Debug|x64 {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Release|Win32.ActiveCfg = Release|Win32 {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Release|Win32.Build.0 = Release|Win32 - {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Release|x64.ActiveCfg = Release|x64 - {ED77F24F-5F18-4201-B6B4-EE4E5352EEF2}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MiniBase/MiniBase.vcxproj b/MiniBase/MiniBase.vcxproj index bb62ef1..8fb3727 100644 --- a/MiniBase/MiniBase.vcxproj +++ b/MiniBase/MiniBase.vcxproj @@ -170,7 +170,6 @@ - @@ -181,7 +180,6 @@ - diff --git a/MiniBase/MiniBase.vcxproj.filters b/MiniBase/MiniBase.vcxproj.filters index 5aed8dc..3233a2c 100644 --- a/MiniBase/MiniBase.vcxproj.filters +++ b/MiniBase/MiniBase.vcxproj.filters @@ -26,9 +26,6 @@ Файлы исходного кода - - Файлы исходного кода - Заголовочные файлы\msg @@ -58,9 +55,6 @@ Заголовочные файлы - - Заголовочные файлы - Заголовочные файлы\msg diff --git a/MiniBase/client.cpp b/MiniBase/client.cpp index 8b5fc5d..f92081f 100644 --- a/MiniBase/client.cpp +++ b/MiniBase/client.cpp @@ -9,12 +9,11 @@ #include #pragma warning(disable:4996) - extern TCHAR g_settingsFileName[MAX_PATH]; bool FirstFrame = false; pfnUserMsgHook pMOTD; GameInfo_t BuildInfo; -cvar_t *random; +cvar_t *steamid_r; map g_modelsHashMap; cvar_t *logsfiles; cvar_t *events_block; @@ -46,12 +45,15 @@ void models(){ for (DWORD i = 0; i < 32; i++){ player_info_s* player = g_pStudio->PlayerInfo(i); if (player && (lstrlenA(player->name)>1) && player->model){ - char buffer[128]; - sprintf_s(buffer, "NAME -> [ %s ] | MODEL -> [ %s ]\n", player->name, player->model); - ConsolePrintColor(255, 255, 15, buffer); + ConsolePrintColor(255, 255, 15, "NAME -> [ %s ] | MODEL -> [ %s ]\n", player->name, player->model); } } } +string filename; +void Set_Ticket() { + filename = g_Engine.Cmd_Argv(1); + ConsolePrintColor(255, 255, 255, "[ExtraMirror] Ticket set -> \"%s\"\n", filename.c_str()); +} void Credits(){ ConsolePrintColor(255, 255, 255, "-- Thank's to");ConsolePrintColor(0, 255, 0, " [2010] Team\n");ConsolePrintColor(255, 255, 255, "-- Thank's to"); ConsolePrintColor(0, 255, 0, " madotsuki-team < *\n");ConsolePrintColor(255, 255, 255, "-- Thank's to ");ConsolePrintColor(0, 255, 0, "or_75\n"); @@ -71,11 +73,8 @@ int Callback(const char *section, const char *key, const char *value, const void return 1; } void Inject(){LoadLibraryA(g_Engine.Cmd_Argv(1)); } -/*int g_blockedCvarCount; -char *g_blockedCvars[512];*/ -void DumpCmd() -{ +void DumpCmd(){ cmd_s *pCmd = g_Engine.pfnGetCmdList(); ConsolePrintColor(255, 255, 255, "Dump Commands: \n"); while (pCmd) @@ -88,9 +87,12 @@ void DumpCmd() void Reload(){ models_list.clear(); ini_browse(Callback,NULL,g_settingsFileName); - memset(g_blockedCmds,0,sizeof(g_blockedCmds));//memset(g_blockedCvars, 0, sizeof(g_blockedCvars)); - memset(g_serverCmds, 0, sizeof(g_serverCmds)); memset(g_anticheckfiles2, 0, sizeof(g_anticheckfiles2)); - g_blockedCmdCount = 0; g_serverCmdCount = 0; g_anticheckfiles = 0; + memset(g_blockedCmds,0,sizeof(g_blockedCmds)); + memset(g_serverCmds, 0, sizeof(g_serverCmds)); + memset(g_anticheckfiles2, 0, sizeof(g_anticheckfiles2)); + g_blockedCmdCount = 0; + g_serverCmdCount = 0; + g_anticheckfiles = 0; static TCHAR sKeyNames[4096*3]; GetPrivateProfileSection(TEXT("ADetect"), sKeyNames, ARRAYSIZE(sKeyNames), g_settingsFileName); @@ -105,20 +107,14 @@ void Reload(){ char *psKeyName3 = sKeyNames; while (psKeyName3[0] != '\0') { g_serverCmds[g_serverCmdCount++] = strdup(psKeyName3); psKeyName3 += strlen(psKeyName3) + 1; } - /*GetPrivateProfileSection(TEXT("Blocked cvars"),sKeyNames,ARRAYSIZE(sKeyNames),g_settingsFileName); - char *psKeyName2=sKeyNames; - while (psKeyName2[0]!='\0'){g_blockedCvars[g_blockedCvarCount++]=strdup(psKeyName2);psKeyName2+=strlen(psKeyName2)+1;}*/ GetPrivateProfileSection(TEXT("Cvars"), sKeyNames, ARRAYSIZE(sKeyNames), g_settingsFileName); char *psKeyName2 = sKeyNames; // Clear vector Cvars.clear(); - while (psKeyName2[0] != '\0'){ - AddOrModCvar(psKeyName2); - psKeyName2 += strlen(psKeyName2) + 1; - } + while (psKeyName2[0] != '\0'){AddOrModCvar(psKeyName2);psKeyName2 += strlen(psKeyName2) + 1;} TCHAR value[16];char cvarname[32]; - GetPrivateProfileString(TEXT("Settings"), TEXT("sid_random"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); - sprintf(cvarname, "sid_random %s", value);g_Engine.pfnClientCmd(cvarname); memset(value, 0, sizeof(value)); memset(cvarname, 0, sizeof(cvarname)); + GetPrivateProfileString(TEXT("Settings"), TEXT("steamid"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); + sprintf(cvarname, "steamid %s", value);g_Engine.pfnClientCmd(cvarname); memset(value, 0, sizeof(value)); memset(cvarname, 0, sizeof(cvarname)); GetPrivateProfileString(TEXT("Settings"), TEXT("cust_hud"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); sprintf(cvarname, "cust_hud %s", value); g_Engine.pfnClientCmd(cvarname);memset(value, 0, sizeof(value)); memset(cvarname, 0, sizeof(cvarname)); GetPrivateProfileString(TEXT("Settings"), TEXT("logs"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); @@ -176,15 +172,16 @@ void InitHack(){ AddOrModCvar(psKeyName2); psKeyName2 += strlen(psKeyName2) + 1; } - if (!(g_Engine.Con_IsVisible() != 0))g_Engine.pfnClientCmd("toggleconsole"); - ConsolePrintColor(0, 255, 11, "-- Extra Mirror v2.6\n"); + g_pEngine->pfnAddCommand("set_ticket", Set_Ticket); + if (g_Engine.Con_IsVisible() == 0)g_Engine.pfnClientCmd("toggleconsole"); + ConsolePrintColor(0, 255, 11, "-- Extra Mirror v2.7\n", BuildInfo.Build); ConsolePrintColor(255, 255, 255, "-- Use 'credits' for more information\n"); ConsolePrintColor(255, 255, 255, "-- Thank's to Realwar for title\n"); ConsolePrintColor(255, 255, 255, "-- Thank's to FightMagister for functions\n"); ConsolePrintColor(255, 255, 255, "-- Thank's to Spawner { Kiass }\n"); g_pEngine->pfnAddCommand("credits", Credits); g_pEngine->pfnAddCommand("inject", Inject); g_pEngine->pfnAddCommand("modelsn", models); g_pEngine->pfnAddCommand("update", Reload);TCHAR value[16]; - GetPrivateProfileString(TEXT("Settings"), TEXT("sid_random"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); - random = g_pEngine->pfnRegisterVariable("sid_random", strdup(value), 0);memset(value, 0, sizeof(value)); + GetPrivateProfileString(TEXT("Settings"), TEXT("steamid"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); + steamid_r = g_pEngine->pfnRegisterVariable("steamid", strdup(value), 0);memset(value, 0, sizeof(value)); GetPrivateProfileString(TEXT("Settings"), TEXT("cust_hud"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); ex_thud = g_pEngine->pfnRegisterVariable("cust_hud", value, 0);memset(value, 0, sizeof(value)); GetPrivateProfileString(TEXT("Settings"), TEXT("logs"), TEXT("0"), value, ARRAYSIZE(value), g_settingsFileName); diff --git a/MiniBase/enginemsg.cpp b/MiniBase/enginemsg.cpp index 425ea97..a8df72f 100644 --- a/MiniBase/enginemsg.cpp +++ b/MiniBase/enginemsg.cpp @@ -115,12 +115,9 @@ bool CheckExecute(char *text) char *c = text; char *a = isGood ? "[Extra Mirror] execute: \"" : "[Extra Mirror] blocked: \""; if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } - /*else*/if (isSet)a = "[Extra Mirror] update server-side cvar: \""; - - if (isGood) - { - return true; - } + if (isSet)a = "[Extra Mirror] update server-side cvar: \""; + if (isSet) { if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } } + if (isGood)return true; return false; } @@ -158,46 +155,6 @@ void ExecuteString_Add(const char *str) { hooker.unhook(ExecuteString_Tramp, ExecuteString_Prologue); } -/* -bool BlackList(char *str) { - bool changed = false; - char *text = str; - char command[MAX_CMD_LINE]; - int i, quotes; - int len = strlen(str); - while (text[0] != 0) { - quotes = 0; - for (i = 0; i < len; i++) { - if (text[i] == '\"') quotes++; - if (text[i] == '\n')break; - if (!(quotes & 1) && text[i] == ';')break; - if (text[i] == 0x00 || text[i] == ' ' )break; - } - if (i >= MAX_CMD_LINE)i = MAX_CMD_LINE; - strncpy(command, text, i); command[i] = 0; - bool isGood = IsCommandGood(command); - bool isGood2 = IsCommandGood2(command); - bool isSet = CheckAndSetCvar(command); - bool isFake = CheckIsFake(command); - char *x = command; - if (!isGood2) { - g_Engine.pfnServerCmd(command); - if (logsfiles->value > 0) { ConsolePrintColor(24, 122, 224, "[Extra Mirror] server command sent: \""); ConsolePrintColor(24, 122, 224, ("%s", x)); ConsolePrintColor(24, 122, 224, "\"\n"); } - } - char *c = command; - char *a = isGood ? "[Extra Mirror] execute: \"" : "[Extra Mirror] blocked: \""; - if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } - // if (isFake) a = isGood ? "[Extra Mirror] set fake cvar: \"" : "[Extra Mirror] block fake cvar: \""; - /*else*//*if (isSet)a = "[Extra Mirror] update server-side cvar: \""; - if (isGood)g_Engine.pfnClientCmd(c); - if (isSet) { if (logsfiles->value > 0) { ConsolePrintColor(255, 255, 255, ("%s", a)); ConsolePrintColor(255, 255, 255, ("%s", c)); ConsolePrintColor(255, 255, 255, "\"\n"); } } - len -= i; - if (!isGood) { strncpy(text, text + i, len); text[len] = 0; text++; changed = true; } - else { text += i + 1; } - } - return true; -}*/ - void SVC_SendCvarValue() { MSG_SaveReadCount(); char* cvar = MSG_ReadString(); @@ -335,7 +292,7 @@ bool CheckAndSetCvar(string FullCmd) { Cvars[pos].value = Value; return true; } -void SVC_StuffText() { +void SVC_StuffText() { char* command = MSG_ReadString(); ExecuteString_Add(command); } @@ -365,28 +322,4 @@ void SVC_VoiceInit() { if (blocked)return; MSG_RestoreReadCount(); pSVC_VoiceInit(); -} -/* -void SVC_Resourcelist() { -MSG_SaveReadCount(); -int NumResources, Type, Index, DownloadSize, HasExtraInfo, ExtraInfo, HasConsistency, Flags, Flags; -MSG_StartBitReading(MSG_Buffer); -NumResources = MSG_ReadBits(12); - -for (int i = 1; i <= NumResources; i++) { -Type = MSG_ReadBits(4); -char* szFileName[64]; -// szFileName = MSG_ReadBitString(); -Index = MSG_ReadBits(12); -DownloadSize = MSG_ReadBits(24); -unsigned char Flags = READ_CHAR(); -unsigned char rgucMD5_hash[16]; -for (int i = 0; i < 16; i++)(BYTE)rgucMD5_hash[i] = READ_CHAR(); -HasExtraInfo = MSG_ReadBits(1); -if (HasExtraInfo)ExtraInfo = MSG_ReadBits(256); -} -HasConsistency = MSG_ReadBits(1); - - -} -*/ +} \ No newline at end of file diff --git a/MiniBase/main.cpp b/MiniBase/main.cpp index 9a53fc4..a023cfb 100644 --- a/MiniBase/main.cpp +++ b/MiniBase/main.cpp @@ -11,7 +11,7 @@ #include #include -extern cvar_t *random; +extern cvar_t *steamid_r; extern cvar_t *logsfiles; TCHAR g_settingsFileName[MAX_PATH]; typedef void *HOOKSERVERMSG(const char *pszMsgName, void *pfnCallback); @@ -444,27 +444,44 @@ uint32_t RevHash(const char *str) { } return hash; } - +extern string filename; int Steam_GSInitiateGameConnection_CallHook(void *pData, int maxDataBytes, uint64_t steamID, uint32_t serverIP, uint16_t serverPort, bool isSecure) { int ret = (*g_pfnSteam_GSInitiateGameConnection)(pData, maxDataBytes, steamID, serverIP, serverPort, isSecure); - if (random->value == 0) return ret; - for (size_t i = 0; i < 7; i++) { - revEmuTicket.hash[i] = g_hashSymbolTable[rand() % 36]; - } - revEmuTicket.hash[7] = '\0'; - - revEmuTicket.version = 'J'; - revEmuTicket.highPartAuthID = RevHash((const char *)revEmuTicket.hash) & 0x7FFFFFFF; - revEmuTicket.signature = 'rev'; - revEmuTicket.secondSignature = 0; - revEmuTicket.authID = RevHash((const char *)revEmuTicket.hash) << 1; - revEmuTicket.thirdSignature = 0x01100001; -memcpy(pData, &revEmuTicket, sizeof(revEmuTicket)); -return sizeof(revEmuTicket); + if (steamid_r->value == 0) return ret; + else if (steamid_r->value == 1) { + for (size_t i = 0; i < 7; i++) { + revEmuTicket.hash[i] = g_hashSymbolTable[rand() % 36]; + } + revEmuTicket.hash[7] = '\0'; + + revEmuTicket.version = 'J'; + revEmuTicket.highPartAuthID = RevHash((const char *)revEmuTicket.hash) & 0x7FFFFFFF; + revEmuTicket.signature = 'rev'; + revEmuTicket.secondSignature = 0; + revEmuTicket.authID = RevHash((const char *)revEmuTicket.hash) << 1; + revEmuTicket.thirdSignature = 0x01100001; + memcpy(pData, &revEmuTicket, sizeof(revEmuTicket)); + return sizeof(revEmuTicket); + } + else if (steamid_r->value >= 2) { + ifstream file(filename.c_str(), ios::in | ios::binary | ios::ate); + ifstream::pos_type size; + char * bufferzz; + if (file.is_open()){ + size = file.tellg(); + bufferzz = new char[size]; + file.seekg(0, ios::beg); + file.read(bufferzz, size); + file.close(); + memcpy(pData, bufferzz, size); + delete[] bufferzz; + return size; + } + } } void CL_ReadDemoMessage_OLD_Cbuf_AddText_CallHook(const char *str){ - // Add your filters there + // Add your filters there //MessagePrintf("Demo tried to execute: %s", str); } @@ -513,7 +530,7 @@ void ModuleLoaded() { } - } + } ptr = pModule->FindFirstUseOfString("Tried to read a demo message with no demo file\n"); ptr = pModule->SearchDownForFirstCallToFunction(ptr, pfnCbuf_AddText); CallOpcode::SetDestination(ptr, &CL_ReadDemoMessage_OLD_Cbuf_AddText_CallHook); diff --git a/MiniBase/main.h b/MiniBase/main.h index 21c057d..28ebf29 100644 --- a/MiniBase/main.h +++ b/MiniBase/main.h @@ -40,7 +40,6 @@ using namespace std; #include "utils.h" #include "usermsg.h" #include "enginemsg.h" -#include "font.h" #include "eventmsg.h" #include "redirect.h" diff --git a/MiniBase/offset.cpp b/MiniBase/offset.cpp index f70ebd9..b97164f 100644 --- a/MiniBase/offset.cpp +++ b/MiniBase/offset.cpp @@ -243,7 +243,7 @@ DWORD cOffset::FindEventMsgBase() { DWORD PatternAddress = FindPattern(OFF_EVENT_MSG_BASE, HwBase, HwEnd, 0); DWORD ReferenAddress; - if (equali(BuildInfo.GameVersion,"1.1.2.6")){ + if (BuildInfo.Build<6027){ ReferenAddress = FindReference(HwBase, HwEnd, PatternAddress) - 0x06; } else { ReferenAddress = FindReference(HwBase, HwEnd, PatternAddress) - 0x07; } From 054b1cd7bc0bb6304d25dfb488e8ee219d49deed Mon Sep 17 00:00:00 2001 From: shelru Date: Sun, 28 May 2017 05:56:17 +0300 Subject: [PATCH 4/4] Update --- Release/ЭкстраМиррор.ini | 44 ++++++++++++++++----------- Release/ЭкстраМиррор.mix | Bin 239104 -> 251392 bytes 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Release/ЭкстраМиррор.ini b/Release/ЭкстраМиррор.ini index 4adf884..67f63f4 100644 --- a/Release/ЭкстраМиррор.ini +++ b/Release/ЭкстраМиррор.ini @@ -1,5 +1,5 @@ [Settings] -sid_random = 0 +steamid = 0 cust_hud = 0 motd_block = 0 logs = 1 @@ -29,13 +29,19 @@ events_block = 0 ;test.dll or test, dll's for auto inject; such as C:\sdasad.dll ;like that ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;C:\Program Files (x86)\Steam\steamapps\common\Half-Life\Vermillion_free.dll -[Blocked cvars] -; Send Bad CVAR request -sid_random -cust_hud -motd_block -logs -events_block +[Cvars] +; Available mods: +; BAD - Response Bad cvar request +; FAKE - Response immutable Fake value +; SERVERSIDE - Response Fake value, mutable by server +steamid BAD +cust_hud BAD +motd_block BAD +logs BAD +events_block BAD +ex_interp SERVERSIDE 0.1 +fps_max SERVERSIDE "99.5" +developer FAKE 0 [Models] ;original = changed ;like that ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ @@ -45,29 +51,33 @@ events_block ;modelsn - в консоль, отобразит список игроков и моделей [Send Commands] ;g_Engine.pfnServerCmd(cmd) +dump_cmd +update +modelsn inject credits -update -sid_random +set_tick +steamid cust_hud -motd_block logs -modelsn events_block +motd_block [Custom Commands] ;There are add custom command's such as will be register in cmdlist ;like that ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ;amxmodmenu [Commands] +dump_cmd +update +modelsn inject credits -update -sid_random +set_tick +steamid cust_hud -motd_block logs -modelsn events_block +motd_block _cl_autowepswitch _snd_mixahead ambient_fade @@ -744,4 +754,4 @@ wait waveplaylen writecfg writeid -writeip +writeip \ No newline at end of file diff --git a/Release/ЭкстраМиррор.mix b/Release/ЭкстраМиррор.mix index dabeea5d298eb14a93657f3ffc3d3d0737c8cc85..500db4187e4512ce3a68c96dc32afbb5098de1e5 100644 GIT binary patch delta 100740 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⋙XZsrEGY5rtSm!_{Y;TrKCc4 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