DirectX 9 アプリケーションをフックして、スクリーンショットを取得しようとしています。それが私がすることです:
- 引数として渡されたアドレスをDLL に挿入
CreateRemoteThread
します。LoadLibraryW
この時点で、ターゲット アプリケーションは既に実行されていると仮定します。 DLL の
DllMain
I内CreateThread
で、一時的な Direct3D デバイスを作成して VMT を取得します。auto pID3D9 = Direct3DCreate9(D3D_SDK_VERSION); D3DPRESENT_PARAMETERS pp = { }; IDirect3DDevice9 *pID3DDevice = NULL; auto hr = pID3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_NULLREF, NULL, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, &pID3DDevice); auto pID3DDevicevt = *reinterpret_cast(pID3DDevice);
EndScene
Direct3D デバイスの関数へのポインターを書き換えようとしても、何も起こりません。// ここで '42' は VMT 内の EndScene のインデックスです (笑) pID3DDevicevt[42] = my_EndScene;
注:
VirtualProtect
書き換える前のポインターと書き換え た後VirtualProtect
で、そのコードを省略しただけです。私は「古典的な」フックに行き着きます: 元の関数の 6 バイトを書き直して、無条件に関数にジャンプするようにします。次に、元のバイトを復元し、独自の処理を行い、元の関数を呼び出して、関数を再度フックします。できます。
EndScene
Direct3D デバイスの関数へのポインタを書き換えようとしても何も起こらないのはなぜですか?
VMT フックを機能させるには、VMT フックを十分早く配置する必要があるという情報を検索して見ました。それが原因ですか?