lo que tenés que hacer es obtener la dirección de la función que te interesa interceptar, si estás en un sistema de 32 bits una dirección de memoria son 4 bytes, entonces vas a parchear los primeros 5 bytes de la función, con un JMP + dirección de memoria, lo que serían un total de 5 bytes.
Las consideraciones que te decía antes eran que, aunque sólo necesites 5 bytes, a veces es necesario parchear más, por ejemplo 6 o 7, dependiendo del contenido de la memoria en esas posiciones. Eso se rellena con NOPs en algunos casos o en otros se arregla de otra forma. No hay 1 sólo procedimiento específico para seguir cuando hacés un 'detour'.
Antes de parchear tenés que obtener los permisos de escritura en ese lugar de la memoria.
Los bytes que vas a reemplazar no se pierden, sino que los guardás porque necesitás ejecutarlos luego.
Fijate la información acerca de la instrucción JMP. Y lo de VA y RVA.
fijate, te dejo está función que hace todo directamente.
void* DetourFunc( BYTE* src, const BYTE* dst, const int len )
{
BYTE* jmp = (BYTE*)malloc( len + 5 );
DWORD dwback;
VirtualProtect( src, len, PAGE_READWRITE, &dwback );
memcpy( jmp, src, len );
jmp += len;
jmp[0] = 0xE9;
*(DWORD*)( jmp + 1 ) = (DWORD)( src + len - jmp ) - 5;
src[0] = 0xE9;
*(DWORD*)( src + 1 ) = (DWORD)( dst - src ) - 5;
VirtualProtect( src, len, dwback, &dwback );
return ( jmp - len );
}
Los argumentos son:
src: dirección de la función
dst: dirección de tu función de reemplazo
len: cantidad de bytes para parchear/guardar