Wytłumaczenie działania funkcji Detour

0

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.

0

jaki kompilator?
w Visualu 2008 kod działa i w 32 i w 64 bitach bez zmian.

0

TDM-GCC 64 bit - nie działa
GCC 32 bit - działa

Visuala nie chcę, i w najbliższej przyszłości nie planuję używać niestety. Chyba, że ktoś zna inny (dobry) 64-bitowy kompilator z rodziny GCC, wtedy prosiłbym o linka. Ale i tak byłbym wdzięczny za wytłumaczenie działania tej funkcji :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1