掲示板投稿ネタその2 : APIフック

http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=11260
ここで紹介しているBBXでのやりとりですが,どうも質問者さんはとあるMMORPGの画面に色々表示させたかったようですね.MMORPGのマクロ系ツールやブラウザ用のBookmarkletは作る側も使う側も元気があっていいですなぁ.
さて,DirectX Graphicsのオブジェクトは

  • CoCreateInstanceを使わない (COMの標準ファクトリクラスを使わない)
  • マーシャリングが期待されていない (これも標準ファクトリクラスを使わないのと関連)
  • IUnknown::QueryInterfaceでは単継承ツリーを移動することのみを考えればよい

という特徴があって,インターフェースを実装した自前実装クラスのポインタに差し替えるだけで簡単にフックが行えます*1
次にDirect3DCreate9の置き換えですが,WindowsではDLLがエクスポートしている関数を自前関数で置き換える方法はいくつか存在します.1つはDLLの検索順序を利用する方法で,通常DLLが置かれている場所よりも早く検索される場所にProxy DLLを配置することで関数の乗っ取りを行います.
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_the_search_path_used_by_windows_to_locate_a_dll.asp
ここに紹介していた URL は内容が古いので,こちら(id:NyaRuRu:20040931#p2)を参照のこと
もう1つの方法は,何らかの方法で対象アプリケーションのメモリ空間にあるインポートセクションを書き換えてしまう方法です.これについては『Advanced Windows 改訂第4版(asin:4756138055)』第22章「DLLの注入とAPIフック」が参考になるでしょう.このようなAPIフック用のライブラリとしてはCodeProjectで公開されているAPIHijackも有名ですね.
http://www.codeproject.com/dll/apihijack.asp

*1:一般の場合はUniversal Delegatorを参照のこと