From 51fd9a04f82440fccfdb09144a10de279418a548 Mon Sep 17 00:00:00 2001 From: shelru Date: Wed, 31 Aug 2016 19:19:20 +0300 Subject: [PATCH] LibraryPatcher --- MiniBase/main.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/MiniBase/main.cpp b/MiniBase/main.cpp index 5af6e00..2718c1e 100644 --- a/MiniBase/main.cpp +++ b/MiniBase/main.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include extern cvar_t *random; extern cvar_t *logsfiles; TCHAR g_settingsFileName[MAX_PATH]; @@ -104,6 +106,40 @@ string szDirFile2(char* pszName){ string szRet = BaseDir; return (szRet + pszName); } + +void HexReplaceInLibrary(std::string libraryPath, std::string hexSearch, std::string hexReplace) { + auto libraryAddress = GetModuleHandleA(libraryPath.c_str()); + auto dosHeader = (IMAGE_DOS_HEADER *)libraryAddress; + auto peHeader = (IMAGE_NT_HEADERS *)((uintptr_t)libraryAddress + (uintptr_t)dosHeader->e_lfanew); + + auto HexDigitToNum = [](char hexDigit) -> int { return ('0' <= hexDigit && hexDigit <= '9') ? (hexDigit - '0') : ((hexDigit - 'A') + 10); }; + + auto searchSize = hexSearch.length() / 2; + + auto search = std::make_unique(searchSize); + for (size_t i = 0; i < searchSize; i++) { + search[i] = ((byte)HexDigitToNum(hexSearch[2 * i]) << 4) | ((byte)HexDigitToNum(hexSearch[2 * i + 1])); + } + auto replace = std::make_unique(searchSize); + for (size_t i = 0; i < searchSize; i++) { + replace[i] = ((byte)HexDigitToNum(hexReplace[2 * i]) << 4) | ((byte)HexDigitToNum(hexReplace[2 * i + 1])); + } + + auto codeBase = (uintptr_t)libraryAddress + peHeader->OptionalHeader.BaseOfCode; + auto codeSize = peHeader->OptionalHeader.SizeOfCode; + auto codeEnd = codeBase + codeSize; + auto codeSearchEnd = codeEnd - searchSize + 1; + + for (auto codePtr = codeBase; codePtr < codeSearchEnd; codePtr++) { + if (memcmp((const void *)codePtr, search.get(), searchSize) == 0) { + DWORD oldProt; + VirtualProtect((LPVOID)codePtr, searchSize, PAGE_EXECUTE_READWRITE, &oldProt); + memcpy((void *)codePtr, replace.get(), searchSize); + // wanna nullptr here + VirtualProtect((LPVOID)codePtr, searchSize, oldProt, &oldProt); + } + } +} DWORD WINAPI CheatEntry( LPVOID lpThreadParameter ) { static HANDLE hProcessReloadThread = 0; @@ -512,6 +548,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved){ MessageBox(NULL, cvarName, "Ok", MB_OK); return FALSE; } + HexReplaceInLibrary("cstrike/cl_dlls/client.dll", "241874128A0880F9057E03880A428A48", "241874128A0880F9057603880A428A48"); + HMODULE hEngine = GetModuleHandle(TEXT("hw.dll")); if (hEngine == NULL) { hEngine = GetModuleHandle(TEXT("sw.dll"));