比如说一个名为A的dll中导出了下面的类:
namespace B
{
_cdeclspec(dllexport) Class C
{
public:
function D();
function E();
}
}
如果我现在想HOOK第三方程序对函数D或者函数E的调用,该怎么写?
在detour库中使用DETOUR_TRAMPOLINE宏。
DETOUR_TRAMPOLINE有两个输入参数:trampoline的原型和目标函数的名字。
其中目标函数的名字该怎么写,我直接写D,好像不行,老说我函数D没有声明。

解决方案 »

  1.   

    Detours不是有例子的吗? 看看Sample 中的 Member 例子!
    ////////////////////////////////////////////////////////////////
    // Target Class. 也就是你DLL中的类:
    class CMember
    {
      public:
        void Target(void);
    };void CMember::Target(void)
    {
        printf("  CMember::Target!   (this:%p)\n", this);
    }////////////////////////////////////////////////////////////////
    // Detour Class. 也就是你自己编写来替代前面类的类:class CDetour /* add ": public CMember" to enable access to member variables... */
    {
      public:
        void Mine_Target(void);
        static void (CDetour::* Real_Target)(void);    // Class shouldn't have any member variables or virtual functions.
    };void CDetour::Mine_Target(void)
    {
        printf("  CDetour::Mine_Target! (this:%p)\n", this);
        (this->*Real_Target)();
    }void (CDetour::* CDetour::Real_Target)(void) = (void (CDetour::*)(void))&CMember::Target;// 然后在函数中这样调用:
        DetourAttach(&(PVOID&)CDetour::Real_Target, *(PBYTE*)&pfMine);
      

  2.   

    你得把DLL中类的定义(或头文件)得到。
      

  3.   

    没用过detour库。不过直接写D肯定不行,试试写B::C::D。
      

  4.   

    谢谢,明天去试试。
    如果导出的类位于dll中的一个命名空间namespace,该怎样hook,是否和上述方法一样?
      

  5.   

    访问名空间中的函数是要用这样的写法的,也可以在程序中using 名空间。
      

  6.   

    例子中的类不是dll中导出的,
    而我需要hook的是dll中导出的类,
    可以用例子中的方法吗?
      

  7.   

    没明白你的意思。你可以先试试调用要Hook的函数,只要调用没问题应该就可以Hook,Hook时函数的写法与调用时相同。
      

  8.   

    就是说被hook的函数D位于类C中,而类C是由动态链接库A导出的(可以看楼主的帖子)
      

  9.   

    你的项目可以隐式链接A.dll;或者查出要Hook的函数导出的名称,用GetProcAddress来获取地址。
      

  10.   


    有什么区别吗?按照通常的做法导入DLL A 必要的库就行了。
    #include ".h"
    #pragma comment(lib, ".lib")
      

  11.   

    可以,采用基本的修改jmp指令方式就可以
      

  12.   

    谢谢vcPlayer朋友的提示和各位朋友的支持,我看了下detour库里面的member例子,已经照着例子中的方法解决了hook类中函数的问题,而且发现即使多态,重载的成员函数也可以hook到,结贴了。