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”函数并从那里转到原始代码。但是,在某些地方,寄存器正在发生变化,这导致程序在我回到原始代码后立即因段错误而崩溃。

Edit2:最终工作代码:

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

DWORD TrueAddr = 0x0040592C;

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

并使用 TrueAddr 作为 DetourAttach 中的第一个参数。

4

0 回答 0