35 lines
992 B
C++
35 lines
992 B
C++
#include "vmthook.h"
|
|
|
|
VMTHook::VMTHook(void* vmt_addy)
|
|
{
|
|
vmt = (void**)vmt_addy;
|
|
}
|
|
|
|
void* VMTHook::Hook(int index, void* hk)
|
|
{
|
|
// Store the index and original function address
|
|
hooked_funcs.insert(std::make_pair(index, vmt[index]));
|
|
printf("vmt hook at: %p \n", vmt[index]);
|
|
|
|
// Change the memory's access rights, patch the address to our hook, restore original rights
|
|
DWORD old;
|
|
VirtualProtect(&vmt[index], sizeof(void*), PAGE_EXECUTE_READWRITE, &old);
|
|
vmt[index] = hk;
|
|
VirtualProtect(&vmt[index], sizeof(void*), old, NULL);
|
|
return hooked_funcs[index];
|
|
}
|
|
|
|
void VMTHook::ClearHooks()
|
|
{
|
|
for (func_iterator = hooked_funcs.begin(); func_iterator != hooked_funcs.end(); func_iterator++)
|
|
{
|
|
DWORD old;
|
|
VirtualProtect(&vmt[func_iterator->first], sizeof(void*), PAGE_EXECUTE_READWRITE, &old);
|
|
vmt[func_iterator->first] = func_iterator->second;
|
|
VirtualProtect(&vmt[func_iterator->first], sizeof(void*), old, NULL);
|
|
}
|
|
hooked_funcs.clear();
|
|
vmt = nullptr;
|
|
}
|
|
|
|
VMTHook::~VMTHook() {} |