2010-03-23 9 views
6

Używam objazdów, aby podłączyć się do funkcji wiadomości wykonywalnej, ale muszę uruchomić mój własny kod, a następnie zadzwonić do oryginalnego kodu. Z tego, co widziałem w dokumentach Detours, brzmi zdecydowanie, że powinno to nastąpić automatycznie. Oryginalna funkcja drukuje wiadomość na ekranie, ale zaraz po dodaniu objazdu zaczyna działać mój kod i przestaje drukować.Muszę wywołać oryginalną funkcję z funkcji objazdu

Oryginalny kod funkcji jest grubsza:

void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB); 

Moja funkcja to:

void CGuiObject_AppendMsgToBuffer([same params, with names]); 

wiem pozycję pamięci pierwotna funkcja rezyduje w, więc przy użyciu:

DWORD OrigPos = 0x0040592C; 
DetourAttach((void*)OrigPos, CGuiObject_AppendMsgToBuffer); 

wprowadza mnie do funkcji. Ten kod działa prawie idealnie: moja funkcja jest wywoływana z odpowiednimi parametrami. Jednak wykonanie opuszcza moją funkcję, a oryginalny kod nie jest wywoływany. Próbowałem jmping z powrotem, ale to powoduje awarię programu (zakładam, że kod Detours przeniesiony w celu dopasowania do haka jest odpowiedzialny za awarię).

Edycja: Udało mi się naprawić pierwszy problem bez powracania do wykonywania programu. Wywołując wartość OrigPos jako funkcję, jestem w stanie przejść do funkcji "trampolina", a następnie przejść do oryginalnego kodu. Jednak gdzieś w kolejce rejestry się zmieniają i powoduje to awarię programu z segfaultem, jak tylko wrócę do oryginalnego kodu.

Edit2: Final kod roboczych:

class CGuiObject 
{ 
public: 
    void MyFunc([params]); 
}; 

DWORD TrueAddr = 0x0040592C; 

CGuiObject::MyFunc([params]) 
{ 
    _asm { pushad } 
    // process 
    _asm { 
     popad 
     leave 
     jmp TrueAddr 
    } 
} 

i korzystania TrueAddr za pierwszy param w DetourAttach.

+0

Czy potrafisz przez to przejść w dezasembler? –

+0

Tak, wbudowałem debugowanie i ustawiłem break-point na początku mojej funkcji. Wysyłanie kodu, które, pushad, wykonuje niektóre logowanie (wyślij wiadomość do strumienia przy użyciu operatora <<, popad i jmp na adres Zwrócony objazd. Wykonanie przechodzi przez skopiowane rzeczy i z powrotem do oryginalnego pliku wykonywalnego. Działa na kilka wierszy, ale jak widzę, ECX jest resetowany do 0 i jest używany jako wskaźnik, a więc segfault. Jeśli to nie pomoże, mogę opublikować pełny kod z ASM. – ssube

Odpowiedz

1

Biorąc pod uwagę, że próbujesz przechwycić wywołanie metody C++, prawdopodobnie masz problem z wywołaniem wywołania, gdy wywołujesz oryginalną funkcję.

Nie próbowałem robić tego osobiście z objazdami, ale ten post wskazuje na coś, co może ci pomóc. C++ — Detours (Win32 API Hijacking) — Hijack Class Methods Zobacz link w drugiej odpowiedzi.

+0

To zadziałało, w sposób okrągły. W końcu stworzyłem klasę szkieletu, która działa idealnie. Może nawet sam wywoływać wiadomości w kolejce lub pomijać końcowe części, aby zapobiec wiadomości. Dzięki za link! :) – ssube