Writing your own isn't terribly complicated.
Example.cpp:
Code:
#include "hiJackr.h"
PBYTE _LastFunction;
PBYTE _LastHook;
DWORD _LastReturnAddress;
CRITICAL_SECTION CS;
BOOL iCS = FALSE;
PBYTE Detour( PBYTE Offset, PBYTE Hook )
{
PBYTE _Prologue = new BYTE[_HookLength];
DWORD OldProtect;
if( !iCS )
{
InitializeCriticalSection( &CS );
iCS = TRUE;
}
memcpy( _Prologue, &Offset[0], _HookLength );
VirtualProtect( Offset, _HookLength, PAGE_EXECUTE_READWRITE, &OldProtect );
Offset[0] = 0xE8;
*( DWORD_PTR * ) ( &Offset[1] ) = ( DWORD_PTR ) ( Hook - Offset ) - _HookLength;
VirtualProtect( Offset, _HookLength, OldProtect, &OldProtect );
return( _Prologue );
}
void RepairFunction( BYTE *Offset, BYTE *Buffer )
{
DWORD OldProtect;
VirtualProtect( Offset, _HookLength, PAGE_EXECUTE_READWRITE, &OldProtect );
for( UINT i = 0; i < _HookLength; i++ )
*( ( PBYTE ) Offset + i ) = Buffer[i];
VirtualProtect( Offset, _HookLength, OldProtect, &OldProtect );
}
void RepairDetour( )
{
Detour( ( PBYTE ) _LastFunction, ( PBYTE ) &_LastHook );
*( ( DWORD_PTR * ) _AddressOfReturnAddress( ) ) = _LastReturnAddress;
LeaveCriticalSection( &CS );
}
Example.h:
Code:
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <intrin.h>
#ifndef _M_IX86
#ifndef _M_X64
#error Platform not supported: build for x86 or x86-64 only.
#endif
#endif
#ifdef _M_IX86
#define _HookLength 5
#elif _M_X64
#define _HookLength 9
#endif
#define _Prologue( _Prologue ) \
_LastFunction = ( PBYTE ) ( ( DWORD ) _ReturnAddress( ) - _HookLength ); \
RepairFunction( ( PBYTE ) _LastFunction, _Prologue );
#define _Epilogue( this ) \
EnterCriticalSection( &CS ); \
_LastHook = ( PBYTE ) this; \
*( ( DWORD_PTR * ) _AddressOfReturnAddress( ) ) -= _HookLength; \
_LastReturnAddress = ( DWORD ) *( ( ( DWORD_PTR * ) _AddressOfReturnAddress( ) ) \
+ 8 / sizeof( DWORD_PTR * ) ); \
*( ( DWORD_PTR * ) _AddressOfReturnAddress( ) + 4 / sizeof( DWORD_PTR * ) ) = ( DWORD_PTR ) RepairDetour; \
return;
extern PBYTE _LastFunction;
extern PBYTE _LastHook;
extern DWORD _LastReturnAddress;
extern CRITICAL_SECTION CS;
extern BOOL iCS;
PBYTE Detour( PBYTE Offset, PBYTE Hook );
void RepairFunction( PBYTE Offset, PBYTE Buffer );
void RepairDetour( );
Terribly organized, but this does serve well as an example.