Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++; 我试图找出如何在C++中钩住类成员函数。我已经有了vtable和normal函数,但是我被难住了。我尝试使用与C函数挂钩相同的方法,用jmp调用覆盖函数的前6个字节。我可以通过找到我认为是类函数的地址\uu asm mov eax,class::method。我能够使用获得的指针成功调用函数。但是当我用前面提到的方法编辑函数时,创建一个类的实例,并调用该方法,它仍然运行钩住的函数。但是,当我从eax获得的点调用函数时,它会正确地转移到另一个函数。我不知所措,我怎样才能正确地做到这一点?多谢各位_C++_Methods_Hook_Member - Fatal编程技术网

在C++; 我试图找出如何在C++中钩住类成员函数。我已经有了vtable和normal函数,但是我被难住了。我尝试使用与C函数挂钩相同的方法,用jmp调用覆盖函数的前6个字节。我可以通过找到我认为是类函数的地址\uu asm mov eax,class::method。我能够使用获得的指针成功调用函数。但是当我用前面提到的方法编辑函数时,创建一个类的实例,并调用该方法,它仍然运行钩住的函数。但是,当我从eax获得的点调用函数时,它会正确地转移到另一个函数。我不知所措,我怎样才能正确地做到这一点?多谢各位

在C++; 我试图找出如何在C++中钩住类成员函数。我已经有了vtable和normal函数,但是我被难住了。我尝试使用与C函数挂钩相同的方法,用jmp调用覆盖函数的前6个字节。我可以通过找到我认为是类函数的地址\uu asm mov eax,class::method。我能够使用获得的指针成功调用函数。但是当我用前面提到的方法编辑函数时,创建一个类的实例,并调用该方法,它仍然运行钩住的函数。但是,当我从eax获得的点调用函数时,它会正确地转移到另一个函数。我不知所措,我怎样才能正确地做到这一点?多谢各位,c++,methods,hook,member,C++,Methods,Hook,Member,我的代码/输出: 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

我的代码/输出:

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;
}

PS:我知道在实际场景中,我必须将this指针传递给函数,但在钩子工作后,这应该很容易。

我的问题是,我的函数被自动设置为内联。当情况并非如此时,代码可以完美地工作。谢谢Raymond&Jason。

我甚至不明白这是如何工作的,因为您没有调用
VirtualProtect
使内存可写。你确定这就是所有的代码吗?你确定函数没有内联吗?你的钩子没有效果,因为
test
类方法被隐式声明为
inline
。我想知道为什么会有人想这样做。我想这就是我所想的。我想真正的问题是如何获取特定实例的方法的内存位置?无效(测试::*tt)(=&t.meth1;不起作用。
t.meth1() : method 1
pointer   : method 1
t.meth1() : method 1
pointer   : method 2
Press any key to continue . . .