Quote:
Detour Type: JMP
Detour by: Croner
|
Code:
DWORD DetourCreate( DWORD dwOldFunc,DWORD dwNewFunc )
{
#define JMP_SIZE 5
DWORD DetourVA, dwProtect, i;
if ( dwOldFunc && dwNewFunc && JMP_SIZE >= JMP_SIZE )
{
DetourVA = (DWORD) VirtualAlloc( NULL, JMP_SIZE + JMP_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if ( DetourVA && VirtualProtect( (VOID*)dwOldFunc, JMP_SIZE, PAGE_EXECUTE_READWRITE, &dwProtect ) )
{
for ( i=0; i < JMP_SIZE; i++ )
{
*(BYTE*)( DetourVA + i ) = *(BYTE*)( dwOldFunc + i );
}
*(BYTE*)( DetourVA + JMP_SIZE + 0 ) = 0xE9;
*(DWORD*)( DetourVA + JMP_SIZE + 1 ) = ( dwOldFunc - DetourVA - JMP_SIZE );
*(BYTE*)( dwOldFunc + 0 ) = 0xE9;
*(DWORD*)( dwOldFunc + 1 ) = ( dwNewFunc - dwOldFunc - JMP_SIZE );
VirtualProtect( (VOID*)dwOldFunc, JMP_SIZE, dwProtect, &dwProtect );
VirtualProtect( (VOID*)DetourVA, JMP_SIZE + JMP_SIZE,PAGE_EXECUTE_READ, &dwProtect );
return DetourVA;
}
}
return (0);
}
Quote:
Detour Type: MOV_EAX --> JMP_EAX
Detour by: Croner
|
Code:
DWORD DetourCreate( DWORD dwOldFunc,DWORD dwNewFunc )
{
#define JMP_SIZE 7
DWORD DetourVA, dwProtect, i;
if ( dwOldFunc && dwNewFunc && JMP_SIZE >= JMP_SIZE )
{
DetourVA = (DWORD) VirtualAlloc( NULL, JMP_SIZE + JMP_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if ( DetourVA && VirtualProtect( (VOID*)dwOldFunc, JMP_SIZE, PAGE_EXECUTE_READWRITE, &dwProtect ) )
{
for ( i=0; i < JMP_SIZE; i++ )
{
*(BYTE*)( DetourVA + i ) = *(BYTE*)( dwOldFunc + i );
}
*(BYTE*)( DetourVA + JMP_SIZE + 0 ) = 0xB8;
*(DWORD*)( DetourVA + JMP_SIZE + 1 ) = ( dwOldFunc + JMP_SIZE );
*(WORD*)( DetourVA + JMP_SIZE + 5 ) = 0xE0FF;
*(BYTE*)( dwOldFunc + 0 ) = 0xB8;
*(DWORD*)( dwOldFunc + 1 ) = ( dwNewFunc );
*(WORD*)( dwOldFunc + 5 ) = 0xE0FF;
VirtualProtect( (VOID*)dwOldFunc, JMP_SIZE, dwProtect, &dwProtect );
VirtualProtect( (VOID*)DetourVA, JMP_SIZE + JMP_SIZE,PAGE_EXECUTE_READ, &dwProtect );
return DetourVA;
}
}
return (0);
}