我想從任意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