hotpatchによるDirectDraw/Inputのプロキシコード挿入、実践コード

これはこの記事を見ている方達の力量を判断するための教材的なコードです、処理としては導入部にあたります。
RCXのコア部分に使っていたものでは無く、前回の記事の手法で、あらたにコア部分から書き起こしてあります。CBTフック(ウインドウの構築、破棄などを起点にdllの処理を起動できるもの)を想定したDllMain部分のコアを極限まで単純化、かつ効率化してあります。

dll上のコードを書き換えるのでアプリケーションに依存しません。hotpatch自体はMicrosoftが想定しているコードのため、決まり事を守っていれば何重にもフックすることが可能で、他人のフックコードを更にフックすることもできます。コード上ではDirectDrawとDirectInputをフックしていますが、同様の書き方でDirect3D9~のフック、およびhotpatch機構のくみ込まれたファンクションはフックが可能です。

 

DLL_PROCESS_ATTACHを捕捉、IsAppCheck() でexe判定、その後、スレッドを起動して新しいウインドウを作成していますが、これはデバッグ出力用の簡易コンソールです。AllocConsole()でコンソールを出してもいいですが、最悪nProtectに感知されるため独自で実装します。

その後、InstallProxyFunctionでCOMオブジェクトを作成する関数をフックして終了します。
あとはフックされたコードが実行されればプロキシコードが無事挿入され、各dllのメモリ内容がnProtectにより修復されてもプロキシコードは生き続けます。

InstallProxyFunctionは前回のアプリケーションに依存しないAPIフックをコード化したものなので説明は割愛します。

ProxyDirectDrawCreateEx、ProxyDirectInputCreateAに関してはプロキシコードを挟み込む処理をしています。今回は保留にしますがCProxy_IDirectDraw7、CProxy_IDirectInput7はそれぞれIDirectDraw7、IDirectInput7(ヘッダファイルを探して定義を見てみると良いでしょう)を基底としたラッパークラスです。

ProxyDirectInputCreateAの冒頭でコードセッションの情報を取得してメモリを捜索していますが、これはRO内部コードのCMouseのインスタンスポインタを検索しています。マウスの座標が保存されているアドレスを取得し、書き換えることでFreeMouseを実現するためのものです。

じつの所、他の処理を用意して、このコードを適切に使えればFreeMouseとクラー位は容易に作れます。
今回の内容の理解次第で今後どのように展開していくかを考えるつもりです。ROに限らず何か作りたい人のためにと、

あとは基本的に体が癒えていませんので気長にお待ちください。

コメントを残す