
DWORD DetourFunc(DWORD src, DWORD dst, DWORD size)
{
int Pointer = { 0xE9 };
#define jmp 5
DWORD len, dwProtect, i;
if(src && dst && size >= jmp)
{
len = (DWORD) VirtualAlloc(NULL, size + jmp, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if(len && VirtualProtect((PVOID) src, size, PAGE_EXECUTE_READWRITE, &dwProtect))
{
for(i = 0; i < size; i++) {
*(PBYTE)(len + i) = *(PBYTE)(src + i);
}
*(PBYTE) (len + size + 0) = Pointer;
*(PDWORD)(len + size + 1) = (src - len - jmp);
*(PBYTE) (src + 0) = Pointer;
*(PDWORD)(src + 1) = (dst - src - jmp);
VirtualProtect((PVOID)src, size, dwProtect, &dwProtect);
VirtualProtect((PVOID)len, size + jmp, PAGE_EXECUTE_READ, &dwProtect);
return len;
}
}
return(0);
}

mais ou menos como o TokolocoSK falo 
Lug Podre
148 linhas Quase Morri Contando

é um super desvio