在c++中挂钩非虚成员函数

Hooking non-virtual member functions in C++

本文关键字:成员 函数 c++      更新时间:2023-10-16

我想弄清楚如何在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:我知道我将不得不传递这个指针的函数在一个真实的场景,但这应该是相当容易后,我得到钩子工作。

我的问题是我的函数被自动设置为内联。当不是这种情况时,代码可以完美地工作。谢谢你,雷蒙德。杰森。