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