D3D11挂钩;绕行功能Windows 8.1(x86)

时间:2014-10-16 12:28:48

标签: c++ windows hook wrapper directx-11

我在dxgi.dll包装程序库中实现了d3d11钩子和绕行函数,它在Windows 7(x86,x64)中运行良好。现在我试图将它移植到Windows 8.1但是我的钩子中的绕道似乎不起作用(没有错误/崩溃只是没有对我的目标fct执行jmp)。据我所知,这意味着我必须绕道而行(或原来的fct已被调用?)。

但是,我使用标准的绕行函数::

void *DetourFunc(BYTE *src, const BYTE *dst, const int len) 
{
   BYTE *jmp = (BYTE*)malloc(len+5);
   DWORD dwback;
   VirtualProtect(src, len, PAGE_READWRITE, &dwback);
   memcpy(jmp, src, len); jmp += len;
   jmp[0] = 0xE9;
   *(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
   src[0] = 0xE9;
   *(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
   VirtualProtect(src, len, dwback, &dwback);
   return (jmp-len);
}

要获取src的地址,我使用目标dll的HModule的GetProcAddress()(d3d11)::

DetourFunc(
( BYTE* ) GetProcAddress(HMD3D11, "D3D11CreateDeviceAndSwapChain"),
( BYTE* ) MyD3D11CreateDeviceAndSwapChain, 
5);

内存中的SRC地址显示::

0x72883937  8b ff 55 8b ec 51 e8 af 16 fe ff 5d ff e0 83 7c 24 24 00 0f 84 ce 06 fe ff e9 bc e2 fd ff 89 10 e9 6e 05 fe ff

内存中的DST地址显示::

0x092891B0  55 8b ec 83 ec 5c 56 57 8d 7d a4 b9 17 00 00 00 b8 cc cc cc cc f3 ab a1 68 5b 2e 09 33 c5 89 45 fc c7 45 f8 00

如前所述,这在Windows 7(x86或x64)中运行良好,但在Windows 8.1(x86)中失败。 我也不确定如何(什么工具)检查外部函数的地址空间。 在Win8.1中,D3D11CreateDeviceAndSwapChain签名可能也发生了变化?!

我很感激有关此事的任何帮助

0 个答案:

没有答案