在c++中挂钩非虚成员函数
Hooking non-virtual member functions in C++
我想弄清楚如何在c++中挂钩类成员函数。我已经有了vtable和普通函数,但我被难住了。我试图使用与C函数挂钩相同的方法,用jmp调用覆盖函数的前6个字节。我能够找到我认为是类函数的地址与__asm mov ax, class::method。我能够使用获得的指针成功地调用函数。但是,当我使用上述方法编辑函数,创建类的实例并调用该方法时,它仍然运行钩子函数。但是当我从eax得到的点调用函数时它就被恰当地转移到了另一个函数上。我不知所措,怎么才能把这件事做好呢?谢谢你。
我的代码输出:
struct HOOKHANDLE {
DWORD addr;
char origcode[6];
BYTE jmp[6];
};
void hookFunc(void *detfunc,void *tarfunc,HOOKHANDLE *hh) {
hh->addr = (DWORD)detfunc;
hh->jmp[0] = 0xE9; //jmp
hh->jmp[5] = 0xC3; //ret
ReadProcessMemory((HANDLE)-1,(void*)hh->addr,hh->origcode,6,0);
DWORD calc = (DWORD)tarfunc - hh->addr - 5;
memcpy(&hh->jmp[1],&calc,4);
WriteProcessMemory((HANDLE)-1,(void*)hh->addr,hh->jmp,6,0);
}
class test {
public:
void meth1() {
std::cout << "method 1n";
}
void meth2() {
std::cout << "method 2n";
}
};
int main() {
test t;
void *mfptr;
void *tfptr;
__asm {
mov eax, test::meth1;
mov mfptr, eax;
mov eax, test::meth2;
mov tfptr, eax;
}
std::cout << "t.meth1() : ";
t.meth1();
std::cout << "pointer : ";
((void(*)())mfptr)();
HOOKHANDLE mhh;
hookFunc(mfptr,tfptr,&mhh);
std::cout << "t.meth1() : ";
t.meth1();
std::cout << "pointer : ";
((void(*)())mfptr)();
system("pause");
return 0;
}
输出:t.meth1() : method 1
pointer : method 1
t.meth1() : method 1
pointer : method 2
Press any key to continue . . .
PS:我知道我将不得不传递这个指针的函数在一个真实的场景,但这应该是相当容易后,我得到钩子工作。
我的问题是我的函数被自动设置为内联。当不是这种情况时,代码可以完美地工作。谢谢你,雷蒙德。杰森。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法