包装dx9接口和挂钩功能

时间:2013-11-28 21:07:42

标签: c++ directx-9 dll-injection

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

...
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,因此在DllMain完成后无法调用Direct3DCreate。我试图从dll手动调用CreateDevice函数,它也被正确重定向,但游戏本身从不进行调用。如果没有首先将CreateDevice函数调用重定向到我的dll,游戏怎么能开始?我尝试了几个dx9游戏,它们都是一样的。我错过了什么?

2 个答案:

答案 0 :(得分:1)

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

修改

要获得更多控制权,请使用EasyHook。 Direct3DHook在幕后使用EasyHook,除非您只是玩API挂钩......

答案 1 :(得分:0)

一些猜测。

  • 你没有处理GetProcAddress()和LoadLibrary()变种的挂钩
  • 你只是没有迭代加载你时加载的模块并挂钩它们。