TASさんのメモ帳

TAS動画作成などをしております。動画一覧: http://www.nicovideo.jp/mylist/18908465

DirectX hooking

  • 基本
    • DLL injectionでd3d8.dllのexport関数をフック
    1. d3d8.hからIDirect3D8インターフェイスの関数定義の所を持ってきて、proxyクラスを作成
    2. フックしたDirect3DCreateの所で、オリジナル関数の返り値(IDirect3D8*)を保存しておき、代わりに自分(proxyクラス)を返す
    3. 同様に、IDirect3DDevice8もproxyクラス作成
    4. 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のメモリ空間に直書き
    • メモリのアクセス権限はVirtualQuery,VirtualProtectで変更
    • 先頭5バイトをジャンプ命令で上書きし、自前のDLLの関数へジャンプさせる
    • 自前関数では引数は+1個になっていて、最初の1個はselfポインタ
      • 例:Present(IDirect3DDevice8* self, あと4個);
    1. 自前の関数では、とりあえずPUSHAD
    2. やりたい処理をする
    3. POPADしてからオリジナル関数の引数をPUSH(後ろからPUSHですよ)
    4. PUSH RETURN (次のjmpの先のラベル)
    5. jmp oritinal_function
    6. RETURN:
    7. MOV hReturn, EAX // 返り値を保存
    8. やりたい処理をする
    • で、selfを使えばいろいろとやり放題な訳です:)