Нужно вызвать оригинальную функцию из обходной функции - PullRequest
6 голосов
/ 23 марта 2010

Я использую 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.

1 Ответ

1 голос
/ 23 марта 2010

Учитывая, что вы пытаетесь перехватить вызов метода C ++, у вас, вероятно, возникает проблема соглашения о вызовах при вызове исходной функции.

Я не пытался сделать это лично с обходными путями, но этот пост указывает на то, что может вам помочь. C ++ - Объезды (перехват Win32 API) - Методы класса Hijack См. Ссылку во втором ответить.

...