Protect .text segment

This commit is contained in:
momo5502 2016-02-29 15:49:27 +01:00
parent 6fdf7f887a
commit daa87d2a50
5 changed files with 31 additions and 4 deletions

View File

@ -51,8 +51,7 @@ namespace Components
lastCheck = Game::Com_Milliseconds();
// Get base module
const uint8_t* module = reinterpret_cast<const uint8_t*>(GetModuleHandle(NULL));
std::string hash = Utils::Cryptography::SHA512::Compute(module + 0x1000, 0x2D6000, false);
std::string hash = Utils::Cryptography::SHA512::Compute(reinterpret_cast<uint8_t*>(GetModuleHandle(NULL)) + 0x1000, 0x2D6000, false);
// Set the hash, if none is set
if (AntiCheat::Hash.empty())

View File

@ -206,7 +206,7 @@ namespace Components
Colors::Colors()
{
// Disable SV_UpdateUserinfo_f, to block changing the name ingame
*(BYTE*)0x6258D0 = 0xC3;
Utils::Hook::Set<BYTE>(0x6258D0, 0xC3);
// Allow colored names ingame
Utils::Hook(0x5D8B40, Colors::ClientUserinfoChanged, HOOK_JUMP).Install()->Quick();

View File

@ -43,7 +43,9 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReser
}
DWORD oldProtect;
VirtualProtect(GetModuleHandle(NULL), 0x6C73000, PAGE_EXECUTE_READWRITE, &oldProtect);
uint8_t* module = reinterpret_cast<uint8_t*>(GetModuleHandle(NULL));
VirtualProtect(module, 0x6C73000, PAGE_EXECUTE_READWRITE, &oldProtect); // Unprotect the entire process
VirtualProtect(module + 0x1000, 0x2D6000, PAGE_EXECUTE_READ, &oldProtect); // Protect the .text segment
Main::EntryPointHook.Initialize(0x6BAC0F, [] ()
{

View File

@ -104,7 +104,13 @@ namespace Utils
void Hook::Nop(void* place, size_t length)
{
DWORD oldProtect;
VirtualProtect(place, length, PAGE_EXECUTE_READWRITE, &oldProtect);
memset(place, 0x90, length);
VirtualProtect(place, length, oldProtect, &oldProtect);
FlushInstructionCache(GetCurrentProcess(), place, length);
}
void Hook::Nop(DWORD place, size_t length)

View File

@ -49,7 +49,12 @@ namespace Utils
template <typename T> static void Set(void* place, T value)
{
DWORD oldProtect;
VirtualProtect(place, sizeof(T), PAGE_EXECUTE_READWRITE, &oldProtect);
*static_cast<T*>(place) = value;
VirtualProtect(place, sizeof(T), oldProtect, &oldProtect);
FlushInstructionCache(GetCurrentProcess(), place, sizeof(T));
}
@ -60,7 +65,12 @@ namespace Utils
template <typename T> static void Xor(void* place, T value)
{
DWORD oldProtect;
VirtualProtect(place, sizeof(T), PAGE_EXECUTE_READWRITE, &oldProtect);
*static_cast<T*>(place) ^= value;
VirtualProtect(place, sizeof(T), oldProtect, &oldProtect);
FlushInstructionCache(GetCurrentProcess(), place, sizeof(T));
}
@ -71,7 +81,12 @@ namespace Utils
template <typename T> static void Or(void* place, T value)
{
DWORD oldProtect;
VirtualProtect(place, sizeof(T), PAGE_EXECUTE_READWRITE, &oldProtect);
*static_cast<T*>(place) |= value;
VirtualProtect(place, sizeof(T), oldProtect, &oldProtect);
FlushInstructionCache(GetCurrentProcess(), place, sizeof(T));
}
@ -82,7 +97,12 @@ namespace Utils
template <typename T> static void And(void* place, T value)
{
DWORD oldProtect;
VirtualProtect(place, sizeof(T), PAGE_EXECUTE_READWRITE, &oldProtect);
*static_cast<T*>(place) &= value;
VirtualProtect(place, sizeof(T), oldProtect, &oldProtect);
FlushInstructionCache(GetCurrentProcess(), place, sizeof(T));
}