在C ++中挂钩非虚拟成员函数

时间:2012-12-28 12:19:23

标签: c++ methods hook member

我试图弄清楚如何在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指针传递给函数,但是在我使钩子工作之后这应该很容易。

1 个答案:

答案 0 :(得分:0)

我的问题是我的功能被自动设置为内联。在不是这种情况下,代码可以很好地工作。谢谢Raymond&amp;杰森。