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.
Czy potrafisz przez to przejść w dezasembler? –
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