之前我没接触过 detuor hook
我看了个HOOK CreateFile 的一个实例 如下:static HANDLE (WINAPI *SysCreateFile)(
 LPCTSTR lpFileName,                         // file name
 DWORD dwDesiredAccess,                      // access mode
 DWORD dwShareMode,                          // share mode
 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
 DWORD dwCreationDisposition,                // how to create
 DWORD dwFlagsAndAttributes,                 // file attributes
 HANDLE hTemplateFile                        // handle to template file
  )=CreateFileA;
HANDLE _stdcall HookCreateFileA(
   LPCTSTR lpFileName,                         // file name
   DWORD dwDesiredAccess,                      // access mode
   DWORD dwShareMode,                          // share mode
   LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
   DWORD dwCreationDisposition,                // how to create
   DWORD dwFlagsAndAttributes,                 // file attributes
   HANDLE hTemplateFile                        // handle to template file
   )
{
::MessageBox(NULL,"拦截成功",0,MB_OK);
return 0;
}
WinMain(....)
{
 .......
  DetourAttach(&(PVOID &)SysCreateFile,HookCreateFileA);
.....
}大致如上
这是一个HOOK CreateFileA 的一个实例 CreateFileA 是一个系统API函数
而我想HOOK 一个类的函数
比如   IDirect3D9* d3d9 = 0;
d3d9->CreateDevice(....)
我想HOOK CreateDevice 这函数 我就不知道怎么做了...求高手帮忙解答 万分感激
上面那个D3D9->CreateDevice (是一个D3D编程里面的函数)分是少了点 没办法╮(╯▽╰)╭ 我只剩下这么一点了

解决方案 »

  1.   

    detuors里面有hook类的示例代码member.c#include <stdio.h>#include <windows.h>#include <detours.h>#include "..\slept\verify.cpp"//////////////////////////////////////////////////////////////// Target Class.//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;////////////////////////////////////////////////////////////////////////////////int main(int argc, char **argv){    (void)argc;    (void)argv;    //////////////////////////////////////////////////////////////////////////    //#if (_MSC_VER < 1310)    void (CMember::* pfTarget)(void) = CMember::Target;    void (CDetour::* pfMine)(void) = CDetour::Mine_Target;    Verify("CMember::Target", *(PBYTE*)&pfTarget);    Verify("*CDetour::Real_Target", *(PBYTE*)&CDetour::Real_Target);    Verify("CDetour::Mine_Target", *(PBYTE*)&pfMine);#else    Verify("CMember::Target", (PBYTE)(&(PBYTE&)CMember::Target));    Verify("*CDetour::Real_Target", *(&(PBYTE&)CDetour::Real_Target));    Verify("CDetour::Mine_Target", (PBYTE)(&(PBYTE&)CDetour::Mine_Target));#endif    printf("\n");    DetourTransactionBegin();    DetourUpdateThread(GetCurrentThread());#if (_MSC_VER < 1310)    pfMine = CDetour::Mine_Target;    DetourAttach(&(PVOID&)CDetour::Real_Target,                 *(PBYTE*)&pfMine);#else    DetourAttach(&(PVOID&)CDetour::Real_Target,                 (PVOID)(&(PVOID&)CDetour::Mine_Target));#endif    LONG l = DetourTransactionCommit();    printf("DetourTransactionCommit = %d\n", l);    printf("\n");#if (_MSC_VER < 1310)    pfTarget = CMember::Target;    pfMine = CDetour::Mine_Target;    Verify("CMember::Target", *(PBYTE*)&pfTarget);    Verify("*CDetour::Real_Target", *(&(PBYTE&)CDetour::Real_Target));    Verify("CDetour::Mine_Target", *(PBYTE*)&pfMine);#else    Verify("CMember::Target", (PBYTE)(&(PBYTE&)CMember::Target));    Verify("*CDetour::Real_Target", *(&(PBYTE&)CDetour::Real_Target));    Verify("CDetour::Mine_Target", (PBYTE)(&(PBYTE&)CDetour::Mine_Target));#endif    printf("\n");    //////////////////////////////////////////////////////////////////////////    //    CMember target;    printf("Calling CMember (w/o Detour):\n");    (((CDetour*)&target)->*CDetour::Real_Target)();    printf("Calling CMember (will be detoured):\n");    target.Target();    return 0;}
      

  2.   

    另外,个人觉得,d3d9这样的com接口,其实就是指向函数指针表的,可以直接替换其中的函数指针,就等同于hook了。
    IDirect3D9* d3d9 = ...;
    (void*)&d3d9->CreateDevice = new_fun;大约这样就可以了。楼主可以试验试验。
      

  3.   


    *(void*)&d3d9->CreateDevice = new_fun;
      

  4.   

    new_fun 怎么声明呢static HRESULT( IDirect3D9::*SysCreateDevice)(
      UINT Adapter,
      D3DDEVTYPE DeviceType,
      HWND hFocusWindow,
      DWORD BehaviorFlags,
      D3DPRESENT_PARAMETERS * pPresentationParameters,
      IDirect3DDevice9 ** ppReturnedDeviceInterface
      IDirect3D9* d3d9 = ...;
      (void*)&d3d9->CreateDevice = SysCreateDevice;);
    这样吗?
      

  5.   

    我不知道怎么替换 不确定替换后 是不是相当于HOOK
    执行d3d9->CreateDevice 会执行 new_fun 还是detuor hook吧 呵呵声明一个 IDirect3D9::CreateDevice 的指针 但是通不过编译ingstatic HRESULT  (IDirect3D9::  *SysCreateDevice)(
    UINT Adapter,
            D3DDEVTYPE DeviceType,
    HWND hFocusWindow,
    DWORD BehaviorFlags,
    D3DPRESENT_PARAMETERS * pPresentationParameters,
    IDirect3DDevice9 ** ppReturnedDeviceInterface
    )=IDirect3D9::CreateDevice;
    也不知哪里错了
    C:\1\hxwdllwx\hxwdllwx.cpp(24) : error C2440: 'initializing' : cannot convert from 'long (__stdcall IDirect3D9::*)(unsigned int,enum _D3DDEVTYPE,struct HWND__ *,unsigned long,struct _D3DPRESENT_PARAMETERS_ *,struct IDirect3DDevice9 ** )' to 'long (_
    _thiscall IDirect3D9::*)(unsigned int,enum _D3DDEVTYPE,struct HWND__ *,unsigned long,struct _D3DPRESENT_PARAMETERS_ *,struct IDirect3DDevice9 ** )'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    执行 cl.exe 时出错.
      

  6.   

    求下哪位帮个忙啦
    我不知怎么声明了static HRESULT (WINAPI *SysCreateDevice)(
    UINT Adapter,
    D3DDEVTYPE DeviceType,
    HWND hFocusWindow,
    DWORD BehaviorFlags,
    D3DPRESENT_PARAMETERS * pPresentationParameters,
    IDirect3DDevice9 ** ppReturnedDeviceInterface
    )=IDirect3D9::CreateDevice;//这样通不过编译
    声明指向IDirect3D9::CreateDevice的指针