Я использую Обходы для сцепления в функцию сообщения исполняемого файла, но я должен выполнить свой собственный код и затем назвать исходный код. Из того, что я видел в документах Обходов, это определенно кажется, что это должно произойти автоматически. Исходная функция печатает сообщение на экран, но как только я присоединяю обход, это начинает выполнять мой код и прекращает печатать.
Исходный функциональный код примерно:
void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB);
Моя функция:
void CGuiObject_AppendMsgToBuffer( [same params, with names] );
Я знаю положение памяти, которое исходная функция находится в, таким образом с помощью:
DWORD OrigPos = 0x0040592C;
DetourAttach( (void*)OrigPos, CGuiObject_AppendMsgToBuffer);
получает меня в функцию. Этот код работает почти отлично: моя функция вызвана с надлежащими параметрами. Однако выполнение оставляет мою функцию, и исходный код не называют. Я попробовал jmping, въезжают задним ходом, но это разрушает программу (я предполагаю, что Обходы кода, перемещенные для установки рычагу, ответственны за катастрофический отказ).
Править: Мне удалось устранить первую проблему без возврата выполнению программы. Путем вызова OrigPos оценивают как функция, я могу перейти к функции "батута" и оттуда в на исходном коде. Однако где-нибудь вдоль строк регистры изменяются, и это заставляет программу отказывать с segfault, как только я возвращаюсь в исходный код.
Edit2: Заключительный рабочий код:
class CGuiObject
{
public:
void MyFunc( [params] );
};
DWORD TrueAddr = 0x0040592C;
CGuiObject::MyFunc( [params] )
{
_asm { pushad }
// process
_asm {
popad
leave
jmp TrueAddr
}
}
и использование TrueAddr для первого параметрического усилителя в DetourAttach.
Учитывая, что вы пытаетесь перехватить вызов метода C ++, у вас, вероятно, возникает проблема соглашения о вызовах при вызове исходной функции.
Я не пробовал делать это лично с обходными путями, но этот пост указывает на кое-что, что может вам помочь. C ++ - Объезды (захват Win32 API) - методы взлома класса См. Ссылку во втором ответе.