/************************************************/
/*************** DetoursXX - Release ****************/
/******* By Toxic for YOS ViP Members ***********/
/*************** Happy Detouring!! *****************/
/************************************************/
DWORD DetourCreate( DWORD SrcVA, DWORD DstVA, DWORD Size )
{
/* detour type: jmp rel */
/* it has no effect if you specify size below SIZEOF_JMP_REL */
DWORD DetourVA, dwProtect, i;
#define SIZEOF_JMP_REL 5
if ( SrcVA && DstVA && Size >= SIZEOF_JMP_REL )
{
DetourVA = (DWORD) VirtualAlloc(
NULL, Size + SIZEOF_JMP_REL,
MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if ( DetourVA && VirtualProtect( (VOID*)SrcVA, Size, PAGE_EXECUTE_READWRITE, &dwProtect ) )
{
for ( i=0; i < Size; i++ ) {
*(BYTE*)( DetourVA + i ) = *(BYTE*)( SrcVA + i );
}
*(BYTE*)( DetourVA + Size + 0 ) = 0xE9;
*(DWORD*)( DetourVA + Size + 1 ) = ( SrcVA - DetourVA - SIZEOF_JMP_REL );
*(BYTE*)( SrcVA + 0 ) = 0xE9;
*(DWORD*)( SrcVA + 1 ) = ( DstVA - SrcVA - SIZEOF_JMP_REL );
VirtualProtect( (VOID*)SrcVA, Size, dwProtect, &dwProtect );
VirtualProtect( (VOID*)DetourVA, Size +
SIZEOF_JMP_REL, PAGE_EXECUTE_READ, &dwProtect );
return DetourVA;
}
}
return (0);
}
BOOL DetourRemove( DWORD SrcVA, DWORD DetourVA , DWORD Size )
{
/* detour remove type: remove jmp rel */
/* it has no effect if you specify size below SIZEOF_JMP_REL */
DWORD dwProtect;
if ( SrcVA && DetourVA && Size >= SIZEOF_JMP_REL )
{
if ( VirtualProtect( (VOID*)SrcVA, Size, PAGE_EXECUTE_READWRITE, &dwProtect ) )
{
for ( DWORD i=0; i < Size; i++ ) {
*(BYTE*)( SrcVA + i ) = *(BYTE*)( DetourVA + i );
}
VirtualProtect( (VOID*) SrcVA, Size, dwProtect, &dwProtect );
return TRUE;
}
}
return FALSE;
}
have fun