我在用微软的Detours库写程序。现在需要HOOK一个C++的类成员函数。我没有被HOOK程序的源码,所以就无法按照Detours2.1的sample里的member.cpp进行模仿了。
void (CDetour::* CDetour::Real_Target)(void) = (void (CDetour::*)(void))&CMember::Target;
这是他sample里的,后面的CMember::Target就是被HOOK的成员函数,当然这是再有代码的前提下才能这么写。如果我仅仅是知道某个成员函数的地址,如何才能赋值给Real_Target?

解决方案 »

  1.   

    试试用reinterpret_cast 强制转换一下
      

  2.   

    void (CDetour::* CDetour::Real_Target)(void) = (void (CDetour::*)(void))0x00410000就这样啊
      

  3.   

    这样吧,我把代码发上来,usingdetoursDlg.cpp里有句
    int (CDetour::* CDetour::Real_add)(int a,int b) = (int (CDetour::*)(int a,int b))&CusingdetoursDlg::add;
    谁能把CusingdetoursDlg::add换成地址并且还能编译通过就给分,同时为了答谢再送20QB。麻烦各位了
    http://www.wg1010.cn/upload/usingdetours.rar
      

  4.   


    typedef void (CDetour::*PFNCdetourMember)(void);
    DWORD dwXXX = 0x401234;// 对于普通函数转成员函数必须求地址在通过(指针到指针的强转)后解引用, 如;
    // 错误, 普通函数无法强转
    PFNCdetourMember CDetour::Real_Target = (PFNCdetourMember)dwXXX; 
    // 正确, 欺骗技巧, 指针可以互相强转,语法通过, 并且目前c++编译器类成员
    // 都是同样占据一个size_t的指针空间, 所以不出问题 
    // (注意:c++没有这样的规定,原先的编译器对于成员函数指针的内容出现过占据2个size_t的情况,一个是地址一个是描述)
    PFNCdetourMember CDetour::Real_Target = *(PFNCdetourMember *)&dwXXX;                                                                                
      

  5.   

    DWORD dwFuck = 0x12345;int (CDetour::* CDetour::Real_add)(int a,int b) = * ( (int (CDetour::*)(int a,int b)) *) &dwFuck;
      

  6.   

    上面打错了:DWORD dwFuck = 0x12345; 
    int (CDetour::* CDetour::Real_add)(int a,int b) = * ( (int (CDetour::**)(int a,int b)) ) &dwFuck;另外, 因为你这个是在定义的时候给赋值的,
    如果是在后面赋值, 可以用左值转换技巧,不需要那个dwFuck这样的thunk, 如* (DWORD *) &CDetour::Real_add = 0x12345;  
      

  7.   

    又多打了一对括号, csdn怎么不能修改啊,
    int (CDetour::* CDetour::Real_add)(int a,int b) = * (int (CDetour::**)(int a,int b)) &dwFuck;