0
我想弄清楚如何在C++中掛鉤類成員函數。我已經有了vtable和正常的函數掛鉤,但我很難過。我正在嘗試使用與C函數掛鉤相同的方法,用jmp調用覆蓋函數的前6個字節。我能夠找到我認爲是類功能的地址__asm mov eax,class :: method。我能夠使用獲得的指針成功調用函數。但是,當我用上述方法編輯函數時,創建一個類的實例,並調用它仍然運行掛鉤函數的方法。但是當我從eax獲得的指針調用函數時,它恰當地轉向了另一個函數。我不知所措,我該如何做到這一點呢?謝謝。在C++中掛鉤非虛擬成員函數
我的代碼/輸出:
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:我知道我必須通過這個函數指針在真實的情景,但應該是掛鉤工作後很容易。
我甚至都不知道這是如何工作的,因爲你沒有調用'VirtualProtect'來使內存可寫。你確定這是所有的代碼? –
你確定這個功能沒有被內聯? – JasonD
你的鉤子沒有效果,因爲'test'類方法被隱式聲明爲'inline'。 –