t5exp/t5exp/Hooking.cpp
2015-05-12 19:01:56 +02:00

157 lines
3.1 KiB
C++

#include "stdinc.h"
#pragma unmanaged
void CallHook::initialize(DWORD place, void *hookToInstall)
{
pPlace = (PBYTE)place;
memcpy(bOriginalCode, pPlace, sizeof(bOriginalCode));
pOriginal = pPlace + sizeof(bOriginalCode) + *(ptrdiff_t*) (bOriginalCode + 1);
hook = hookToInstall;
}
void CallHook::installHook(void *hookToInstall)
{
if (hookToInstall) hook = hookToInstall;
if (hook) {
*(ptrdiff_t*) (pPlace + 1) = (PBYTE) hook - pPlace - 5;
}
}
void CallHook::releaseHook()
{
//memcpy(pPlace + 1, bOriginalCode + 1, sizeof(bOriginalCode) - 1);
*(ptrdiff_t*) (pPlace + 1) = (PBYTE) pOriginal - pPlace - 5;
}
/*
void PointerHook::initialize(PVOID* place)
{
pPlace = place;
pOriginal = NULL;
}
int PointerHook::installHook(void (*hookToInstall)(), bool unprotect)
{
DWORD d = 0;
if (pOriginal)
return 0;
if (unprotect &&
!VirtualProtect(pPlace, sizeof(PVOID), PAGE_READWRITE, &d))
return 0;
pOriginal = *pPlace;
*pPlace = (PVOID) hookToInstall;
if (unprotect)
VirtualProtect(pPlace, sizeof(PVOID), d, &d);
return 1;
}
int PointerHook::releaseHook(bool unprotect)
{
DWORD d = 0;
if (!pOriginal)
return 0;
if (unprotect &&
!VirtualProtect(pPlace, sizeof(PVOID), PAGE_READWRITE, &d))
return 0;
*pPlace = pOriginal;
pOriginal = NULL;
if (unprotect)
VirtualProtect(pPlace, sizeof(PVOID), d, &d);
return 1;
}
*/
void StompHook::initialize(DWORD place, void *hookToInstall, BYTE countBytes, bool useJump)
{
pPlace = (PBYTE)place;
bCountBytes = countBytes < sizeof(bOriginalCode) ? countBytes : sizeof(bOriginalCode);
memcpy(bOriginalCode, pPlace, bCountBytes);
hook = hookToInstall;
jump = useJump;
}
void StompHook::installHook(void *hookToInstall)
{
if (hookToInstall) hook = hookToInstall;
if (hook) {
memset(pPlace, NOP, bCountBytes);
pPlace[0] = jump ? JMP_NEAR32 : CALL_NEAR32;
*(ptrdiff_t*) (pPlace + 1) = (PBYTE) hook - pPlace - 5;
}
}
void StompHook::releaseHook()
{
memcpy(pPlace, bOriginalCode, bCountBytes);
}
void HookInstall(DWORD address, DWORD hookToInstall, int bCountBytes)
{
PBYTE pPlace = (PBYTE)address;
memset(pPlace, NOP, bCountBytes);
pPlace[0] = CALL_NEAR32;
*(ptrdiff_t*) (pPlace + 1) = (PBYTE) hookToInstall - pPlace - 5;
}
void _patch(void* pAddress, DWORD data, DWORD iSize)
{
switch(iSize)
{
case 1: *(BYTE*)pAddress = (BYTE)data;
break;
case 2: *(WORD*)pAddress = (WORD)data;
break;
case 4: *(DWORD*)pAddress = (DWORD)data;
break;
}
}
void _nop(void* pAddress, DWORD size)
{
memset(pAddress, 0x90, size);
return;
DWORD dwAddress = (DWORD)pAddress;
if ( size % 2 )
{
*(BYTE*)pAddress = 0x90;
dwAddress++;
}
if ( size - ( size % 2 ) )
{
DWORD sizeCopy = size - ( size % 2 );
do
{
*(WORD*)dwAddress = 0xFF8B;
dwAddress += 2;
sizeCopy -= 2;
}
while ( sizeCopy );
}
}
void _call(void* pAddress, DWORD data, eCallPatcher bPatchType)
{
switch ( bPatchType )
{
case PATCH_JUMP:
*(BYTE*)pAddress = (BYTE)0xE9;
break;
case PATCH_CALL:
*(BYTE*)pAddress = (BYTE)0xE8;
break;
default:
break;
}
*(DWORD*)((DWORD)pAddress + 1) = (DWORD)data - (DWORD)pAddress - 5;
}
void _charptr(void* pAddress, const char* pChar)
{
*(DWORD*)pAddress = (DWORD)pChar;
}