Потребность вызвать исходную функцию от шедшей в обход функции

Я использую Обходы для сцепления в функцию сообщения исполняемого файла, но я должен выполнить свой собственный код и затем назвать исходный код. Из того, что я видел в документах Обходов, это определенно кажется, что это должно произойти автоматически. Исходная функция печатает сообщение на экран, но как только я присоединяю обход, это начинает выполнять мой код и прекращает печатать.

Исходный функциональный код примерно:

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.

6
задан ssube 24 March 2010 в 01:49
поделиться

1 ответ

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

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

1
ответ дан 17 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: