我试图弄清楚如何在 C++ 中挂钩类成员函数。我已经连接了 vtable 和正常功能,但我很难过。我正在尝试使用与 C 函数挂钩相同的方法,用 jmp 调用覆盖函数的前 6 个字节。我可以使用__asm mov eax, 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 1\n";
}
void meth2() {
std::cout << "method 2\n";
}
};
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:我知道在真实场景中我必须将 this 指针传递给函数,但是在我让钩子工作之后应该很容易。