#pragma once #include template T readMemory(DWORD address) { return *((T*)address); } template T* pointMemory(DWORD address) { return ((T*)address); } template void writeMemory(DWORD address, T value) { *((T*)address) = value; } template DWORD protectMemory(DWORD address, DWORD prot) { DWORD oldProt; VirtualProtect((LPVOID)address, sizeof(T), prot, &oldProt); return oldProt; } DWORD getVF(DWORD classInst, DWORD funcIndex) { DWORD VFTable = readMemory(classInst); DWORD hookAddress = VFTable + funcIndex * sizeof(DWORD); return readMemory(hookAddress); } DWORD hookVF(DWORD classInst, DWORD funcIndex, DWORD newFunc) { DWORD VFTable = readMemory(classInst); DWORD hookAddress = VFTable + funcIndex * sizeof(DWORD); auto oldProtection = protectMemory(hookAddress, PAGE_READWRITE); DWORD originalFunc = readMemory(hookAddress); writeMemory(hookAddress, newFunc); protectMemory(hookAddress, oldProtection); return originalFunc; } unsigned char* hookWithJump(DWORD hookAt, DWORD newFunc) { DWORD newOffset = newFunc - hookAt - 5; auto oldProtection = protectMemory(hookAt, PAGE_EXECUTE_READWRITE); unsigned char* originals = new unsigned char[5]; for (unsigned int i = 0; i < 5; i++) originals[i] = readMemory(hookAt + i); writeMemory(hookAt, 0xE9); writeMemory(hookAt + 1, newOffset); protectMemory(hookAt + 1, oldProtection); return originals; } void unhookWithJump(DWORD hookAt, unsigned char* originals) { auto oldProtection = protectMemory(hookAt, PAGE_EXECUTE_READWRITE); for (unsigned int i = 0; i < 5; i++) writeMemory(hookAt + i, originals[i]); protectMemory(hookAt + 1, oldProtection); delete [] originals; }