2010-03-23 3 views
6

Я использую 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, перемещенный в соответствии с крюком, несет ответственность за сбой).

Редактировать: мне удалось исправить первую проблему без возврата к выполнению программы. Вызывая значение OrigPos как функцию, я могу перейти к функции «trampoline» и оттуда к исходному коду. Однако где-то вдоль строк регистры меняются, и это приводит к сбою программы с segfault, как только я вернусь к исходному коду.

Edit2: Заключительный рабочий код:

class CGuiObject 
{ 
public: 
    void MyFunc([params]); 
}; 

DWORD TrueAddr = 0x0040592C; 

CGuiObject::MyFunc([params]) 
{ 
    _asm { pushad } 
    // process 
    _asm { 
     popad 
     leave 
     jmp TrueAddr 
    } 
} 

и используя TrueAddr первых паров в DetourAttach.

+0

Можете ли вы пройти через это в дизассемблере? –

+0

Да, я построил debug и установил точку прерывания в начале моей функции. Коды попадают, что я проталкиваю, делаю некоторые протоколирования (отправляю сообщение в fstream с помощью оператора <<), popad и jmp на возвращаемый адрес. Выполнение выполняется через скопированный файл и обратно в исходный исполняемый файл. Он работает для нескольких строк, но, насколько я вижу, ECX сбрасывается на 0 и используется как указатель, следовательно, segfault. Если это не поможет, я могу опубликовать полный код с помощью asm. – ssube

ответ

1

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

Я не пытался сделать это лично с обходами, но этот пост указывает на то, что может вам помочь. C++ — Detours (Win32 API Hijacking) — Hijack Class Methods См. Ссылку во втором ответе.

+0

Это работало, округленно. В конце концов, я создал класс скелета, который отлично работает. Он может даже позвонить себе, чтобы вставлять сообщения в очередь или пропускать последние части, чтобы предотвратить сообщение. Спасибо за ссылку! :) – ssube

Смежные вопросы