我想从任意DirectX 9应用程序绕行EndScene
以创建一个小覆盖。举个例子,你可以采用FRAPS的帧计数器覆盖,当游戏被激活时显示。从注入的DLL中挂接DirectX EndScene
我知道下面的方法来做到这一点:
创建一个新的d3d9.dll,然后将其复制到游戏的路径。由于当前文件夹是首先搜索,在去system32等之前,我修改的DLL被加载,执行我的附加代码。
缺点:你必须在开始游戏之前把它放在那里。
- 与第一种方法相同,但直接替换system32中的DLL。
缺点:您无法添加特定于游戏的代码。您不能排除不希望加载DLL的应用程序。
- 使用IDA Pro 4.9 Free等工具直接从DLL获取EndScene偏移量。由于DLL是按原样加载的,因此可以将该偏移量添加到DLL起始地址,将其映射到游戏时获取实际偏移量,然后挂钩它。
缺点:每个系统的偏移量都不一样。
- 挂钩Direct3DCreate9得到D3D9,然后钩D3D9-> CreateDevice的来获得设备指针,然后通过虚拟表钩住设备 - > EndScene。
缺点:当进程已经运行时,DLL不能被注入。您必须使用
CREATE_SUSPENDED
标志启动该过程,以挂钩最初的Direct3DCreate9。- 在新窗口中创建一个新的设备,只要该DLL注入获取。然后,将
EndScene
从该设备偏移并挂钩,从而导致游戏使用的设备挂钩。
缺点:作为一些信息我已阅读,创建第二装置可以与现有的设备干涉,并且它可以与错误窗口与全屏模式等
- 相同第三种方法。但是,您将执行模式扫描以获得
EndScene
。
缺点:看起来并不可靠。
我怎样才能钩EndScene
从注入的DLL,其可以当游戏已经运行被加载,而不必处理与其他系统不同d3d9.dll的,并用的方法,其是可靠的?例如,FRAPS如何执行它的DirectX挂钩? DLL不应该适用于所有游戏,只适用于我通过CreateRemoteThread
注入的特定进程。
退房此了解更多详情: Windows通过C/C++,第22章 - DLL注入和API挂钩,注入DLL使用Windows钩子 – whunmr 2010-01-03 11:56:35
我想通过'CreateRemoteThread'注入DLL。我不想要一个全局钩子,只是针对特定的游戏。 – Etan 2010-01-03 12:35:33
然后就放下第一步。 – Christopher 2010-01-03 13:02:16