我正在使用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中的第一个参数。
答案 0 :(得分:1)
假设您正在尝试拦截C ++方法调用,则在调用原始函数时可能会出现调用约定问题。
我没有试图亲自去做弯路,但是这篇文章指的是可以帮助你的东西。C++ — Detours (Win32 API Hijacking) — Hijack Class Methods见第二个答案中的链接。