Witam. Mam prośbę: Czy ktoś mógłby mi wytłumaczyć działanie funkcji Detour:
VOID *Detour(BYTE *source, CONST BYTE *destination, CONST INT length)
{
DWORD back;
BYTE *jmp = (BYTE*)malloc(length + 5);
VirtualProtect(source, length, PAGE_EXECUTE_READWRITE, &back);
memcpy(jmp, source, length);
jmp += length;
jmp[0] = 0xE9;
*(DWORD*)(jmp + 1) = (DWORD)(source + length - jmp) - 5;
source[0] = 0xE9;
*(DWORD*)(source + 1) = (DWORD)(destination - source) - 5;
VirtualProtect(source, length, back, &back);
return (jmp - length);
}
I wytłumaczyć, dlaczego działa ona w programach 32bitowych, a w 64bitowych zwracany adres jest niepoprawny? Podejrzewam, że może chodzić o to, iż na 64bitowych rozmiar wskaźnika jest większy, ale nie jestem pewny. Oto w jaki sposób wywołuję funkcję:
RealFunction = (FunctionPtr)Detour((BYTE*)RealFunction, (BYTE*)&OurFunction, 5); //czy na 64bitowych nie powinna tutaj być dziewiątka zamiast piątki? :)
Z góry dziękuję :)
PS. Zadaniem funkcji jest podmiana adresów dwóch lokalnych funkcji.