2013-11-28 65 views
0

我按照这个教程:DirectX 9.0 Hooking via Injection via C++。因此,程序在启动过程中创建一个远程线程,注入我的钩子,调用它的DllMain并挂钩Direct3D9Create函数。 Detour Trampoline用于Direct3DCreate9挂钩。整个Direct3D接口和设备接口被封装。当游戏调用Direct3D9Create时,它应该调用我的挂钩函数而不是原来的。这是问题,因为游戏永远不会调用挂钩函数。但是,当我从dll中调用Direct3DCreate时,挂钩函数被调用。这是DllMain中:包装dx9接口和挂钩功能

... 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) 
    { 
    DisableThreadLibraryCalls(hModule); 
    HookHandle = hModule; 
    HookAPI(); 
    lpReserved; 
    //LPDIRECT3D9 pD3d9 = Direct3DCreate9(D3D_SDK_VERSION);//if I uncomment this line, hooked function is called 
    } 
    else if (ul_reason_for_call == DLL_PROCESS_DETACH) 
    { 
    UnhookAPI(); 
    lpReserved; 
    OutputDebugString(pszMessage); 
    } 
    return TRUE; 
} 
... 

这是包装的构造实现:

Direct3D9Wrapper::Direct3D9Wrapper(LPDIRECT3D9 pDirect3D) 
{  
    IDirect3DDevice9 * device = (IDirect3DDevice9 *)this; 
    Direct3D9 = pDirect3D; 
} 

DLL是在游戏运行时注入的,所以Direct3DCreate不能的DllMain完成后调用。我试图从dll手动调用CreateDevice函数,并且它也被正确地重定向,但是游戏本身从不会进行调用。如何在没有将CreateDevice函数调用首先重定向到我的dll的情况下甚至可以启动游戏?我尝试了几个DX9游戏,而且都是一样的。我错过了什么?

回答

1

我想你试图为你的游戏制作屏幕截图。 如果你想制作一个稳定的代码(不只是为了学习的目的),请使用Direct3DHook而不是处理API挂钩。

编辑:

更多控制使用EasyHook。 Direct3DHook在幕后使用EasyHook,除非你只是玩API挂钩...

0

一些猜测。

  • 你不处理GetProcAddress的的任一挂钩()和调用LoadLibrary()的变种
  • 你根本就没有进行遍历时,你正在加载的加载的模块和挂钩他们。