WINGDIAPI BOOL WINAPI LineTo(HDC, int, int);
など,GDI周りのAPI関数の呼び出しを監視したいのですが、どうしたら良いでしょうか。
呼び出されたAPI関数名と,引数の値も知りたいので,::SetWindowsHookEx関数とそのコールバック関数群では無理があるのではないかと思っています。
他のプロセスを監視したいんですよね?
API フックという方法を使います。
監視したい関数をエクスポートしている DLL の振りをする DLL を作り、それを対象プロセスにロードさせます。
Advanced Windows
http://www.amazon.co.jp/exec/obidos/ASIN/4756138055/
に詳しく載ってます。高いですけど…
1.インポートセクションを静的に書き換える方法
手動でゴリゴリやることもできますが、簡単にするツールがあります。
listexp / listexp2 というのを参照してください。
http://www.chiyoclone.net/details.html
2.インポートセクションを動的に書き換える方法
対象のプロセスのイメージを解析し、メモリを書き換えます。
解析は ImageDirectoryEntryToData という関数を使うと簡単です。
まず、PE ファイルの構造を学ばなければなりませんが…
詳細な資料はこのへんにあります。
http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx
http://msdn.microsoft.com/msdnmag/issues/02/03/PE2/default.aspx
対象のプロセスに、監視 DLL を動的に潜り込ませるには、いくつかの
方法があります。
2-a.SetWindowsHookEx を使う
別に何かをフックするわけではなくて、単に対象のプロセスに DLL をロードさせるためだけに使います。
2-b.レジストリを使う
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows\\AppInit_DLLs
ここに DLL を書いておくと、全てのプロセスがその DLL を自動的に読み込みます。
対象のプロセス以外も無差別にロードしてしまいますが…
2-c.CreateTemoteThread で LoadLibrary を実行する
最もスマートで柔軟な方法ですが、NT 系でしか使えないという欠点があります。
追記
"DLL Injection" というキーワードで検索するとサンプルが見つかります。
全部英語ですけどね…
シャノン様、早速のご返事ありがとうございます。
せっかく素早くお答えいただいたのに申し訳ないのですが、実は今日17:00で今年度の業務が終了でして、家のパソコンは開発環境が無いので、ご提示下さった内容を実行できるのは年明けになります。
「Advanced Windows」という本の内容はとても面白そうなので、是非買って正月休暇中に勉強したいと思います。
listexp.exeはDOS窓用のアプリケーションなのですね。これを使って、GDI32.dllにGDI関連の関数が纏まっている事を確認しました。
本当にありがとうございました。
年明けにまた質問するかもしれませんが、シャノン様、この記事を読んでいる皆様、どうか宜しくお願いします。
私が実現したかった機能は、
>2.インポートセクションを動的に書き換える方法
でないと実現できないようです。
DLLの注入については「Advanced Windows(改訂版第4版)」の第22章に、
色々と有用なサンプルのソースコードが掲載されていますね。
特に
>監視したい関数をエクスポートしている DLL の振りをする DLL を作り
という点においては、
P.795以降のLastMsgBoxInfoサンプルが非常に参考になるように思えます。
(メッセージボックスを表示するAPI関数をシステムフックによって監視するコードが書かれています。)
(APIフックを簡易に行うのに有用なCAPIHookクラスというコードも載っています)
しかしながら、GDI関連のAPIの実行を監視してテキストファイルなどの形でログを残すような作業をシステムフックで実現すると、
DLL注入中はGDI関連のAPIの実行が遅延するため、OSや他のアプリケーションの実行にどんな影響が出るのか予測できません。
いずれにしろ、APIフックはC++言語やDLL、Windowsの構造に精通した人間が行わないと、
どうしても危険だという印象を受けましたので、
私(本来はVBプログラマです)はAPIフックという手段を諦めたいと思います。
シャノン様、折角お答えいただいたのに、申し訳ありません。
追記
「Advanced Windows(改訂版第4版)」付属のCD-ROMの Readmej.txt によると、
>1. 必要なシステムについて
>
> 本書「序章」の「CD-ROM と必要なシステムについて」を参照してください。
> なお、すべてのソースファイルをコンパイルするには
>
> Microsoft Windows 2000
> Microsoft Visual C++ 6.0
> Microsoft Platform SDK October 2000 (Whistler Beta 1 Edition)
>
>が必要です。Platform SDK は http://msdn.microsoft.com/downloads/ から
>ダウンロードできます。
との事です。
環境の整っていない方はご注意下さい。
ツイート | ![]() |