Я использую Detours для подключения к функции сообщения исполняемого файла, но мне нужно запустить собственный код и затем вызвать исходный код. Из того, что я видел в документах Detours, это определенно звучит так, как будто это должно произойти автоматически. Исходная функция выводит сообщение на экран, но как только я присоединяю объезд, он начинает выполнять мой код и останавливает печать.
Исходный код функции примерно равен:
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 обратно, но это приводит к сбою программы (я предполагаю, что код, перемещенный Detours для соответствия хуку, отвечает за сбой).
Edit: мне удалось исправить первую проблему, не возвращаясь к выполнению программы. Вызывая значение OrigPos как функцию, я могу перейти к функции «батут» и оттуда к исходному коду. Однако где-то вдоль строк регистры меняются, и это приводит к аварийному завершению работы программы с сегфоутом, как только я возвращаюсь к исходному коду.
Edit2: окончательный рабочий код:
class CGuiObject
{
public:
void MyFunc( [params] );
};
DWORD TrueAddr = 0x0040592C;
CGuiObject::MyFunc( [params] )
{
_asm { pushad }
// process
_asm {
popad
leave
jmp TrueAddr
}
}
и использование TrueAddr для первого параметра в DetourAttach.