DirectX hooking
- 基本
-
- DLL injectionでd3d8.dllのexport関数をフック
-
- d3d8.hからIDirect3D8インターフェイスの関数定義の所を持ってきて、proxyクラスを作成
- フックしたDirect3DCreateの所で、オリジナル関数の返り値(IDirect3D8*)を保存しておき、代わりに自分(proxyクラス)を返す
- 同様に、IDirect3DDevice8もproxyクラス作成
- IDirect3D8のCreateDeviceでこれを作成する
ということをやってるサンプル
[C++] Direct3D hooking sample - DirectX and XNA - GameDev.net
DLLInjectionにはAPIHijackっていうソースを使ってる
APIHijackは解除はしてないので必要なら自分で
こっちにもサンプル
KENJI'S HOMEPAGE -Windows API Hooking Tutorial
Windows API Hooking Tutorial
上手く動かないことがあったんでAPIHijackの方使ってますが
- 直接フック
アセンブリ言語とデバッガを使える程度の能力が必要です
-
- d3d8.dllのメモリ空間に直書き
- 例:Presentメソッドはアドレス0x〜〜〜
- メモリのアクセス権限はVirtualQuery,VirtualProtectで変更
- 先頭5バイトをジャンプ命令で上書きし、自前のDLLの関数へジャンプさせる
- 自前関数では引数は+1個になっていて、最初の1個はselfポインタ
- 例:Present(IDirect3DDevice8* self, あと4個);
- d3d8.dllのメモリ空間に直書き
-
- 自前の関数では、とりあえずPUSHAD
- やりたい処理をする
- POPADしてからオリジナル関数の引数をPUSH(後ろからPUSHですよ)
- PUSH RETURN (次のjmpの先のラベル)
- jmp oritinal_function
- RETURN:
- MOV hReturn, EAX // 返り値を保存
- やりたい処理をする
-
- で、selfを使えばいろいろとやり放題な訳です:)