我正在尝试挂钩一个具有签名的未记录的函数:
(void(__thiscall*)(int arg1, int arg2))0x6142E0;
我看过弯路样品"会员"在哪里解释:
默认情况下,C ++成员函数使用__thiscall调用 惯例。为了绕道一个成员的功能,两个蹦床 并且绕行必须具有完全相同的调用约定 目标函数。不幸的是,VC编译器不支持 __这个呼叫,所以创建合法的绕道和蹦床功能的唯一方法是让他们成为绕道跑道的班级成员。类。
此外,C ++不支持将指针转换为成员 函数到任意指针。获取原始指针,地址 必须将成员函数移动到临时成员函数中 指针,然后通过获取它的地址,然后取消引用它。 幸运的是,编译器将优化代码以删除额外的代码 指针操作。
我已经从示例中复制了一些代码并对其进行了修改但我似乎无法将其工作(original example code here):
class CDetour {
public:
void Mine_Target(int arg1, int arg2);
static void (CDetour::* Real_Target)(int arg1, int arg2);
};
void CDetour::Mine_Target(int arg1, int arg2) {
printf(" CDetour::Mine_Target! (this:%p)\n", this);
(this->*Real_Target)(arg1, arg2);
}
void (CDetour::* CDetour::Real_Target)(int arg1, int arg2) = (void(CDetour::*)(int arg1, int arg2)) (0x6142E0);
void hoo()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)CDetour::Real_Target, (PVOID)(&(PVOID&)CDetour::Mine_Target));
DetourTransactionCommit();
}
我不知道如何让它发挥作用。弓形代码有两个编译器错误:
void (CDetour::* CDetour::Real_Target)(int arg1, int arg2) = (void(CDetour::*)(int arg1, int arg2)) (0x6142E0);
//Error C2440 'type cast': cannot convert from 'int' to 'void (__thiscall CDetour::* )(int,int)'
和
DetourAttach(&(PVOID&)CDetour::Real_Target, (PVOID)(&(PVOID&)CDetour::Mine_Target));
//Error C2440 'type cast': cannot convert from 'void (__thiscall CDetour::* )(int,int)' to 'PVOID &'
我希望有人可以帮助我朝着正确的方向前进,因为我很想放弃挂钩__thiscall功能......
我正在考虑编写全局" __ declspec(naken)void MyFunc(int,int)"具有内联汇编功能,以保留"此指针"按照建议here。
答案 0 :(得分:0)
Detours相当陈旧。明确的compiler support for __thiscall
是相当新的。看起来在Visual C ++ 2005及更高版本中支持它。似乎Detours文档从未更新过。
答案 1 :(得分:0)