
void* DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp = (BYTE*)VirtualAlloc(NULL, len+5, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
DWORD dwback, dwback2;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
VirtualProtect(jmp, len+5, PAGE_READWRITE, &dwback2);
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(jmp, len+5, dwback2, &dwback2);
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}