MicrosoftのDetours。フックの話です。
  • APIフックとは?
雑に説明するとDLLインジェクションと呼ばれる方法で自作関数を定義したDLLをEXEに注入し、自作関数が呼び出されるようにすることをAPIフックと言います。IAT(インポートアドレステーブル)を書き換えたり、CreateRemoteThread関数を使ったりして実現します。


似てるものでメッセージフックというのがありますが、これはWindowプロシージャより前にWindowメッセージを横取りすることを意味しておりAPIフックとは違います、フックのしくみメッセージフック、あたりが参考になります。
  • Detoursとは?
実行中のプロセスをフックして任意のコードを実行する (Non-invasive instrumentation)によると「実行中のプロセスの任意の箇所をフックして、DLL に実装した任意のコードにジャンプして実行してから、元の処理に戻って動作を継続できる」ツールとのこと。一部抜粋しました。
Detours の動作原理は、インポートテーブルの書き換えなどという生ぬるい手段ではなく、フックする箇所の命令を逆アセンブルし、トランポリン関数として別の場所にうまいこと退避させ、元の箇所にフック先への jmp 命令を埋め込むという巧妙な方法です。Detours Wiki に図があります。
a

Detours の基本的な使い方は、関数全体をフックすることです。例えば Detours の simple というサンプルで実現しているのは、SleepEx の呼び出しをフックして TimedSleepEx という関数を実行し、その中でオリジナルの SleepEx と追加の処理が実行されるというものです。  Clove で実現できるようにしたのは、関数の先頭をフックして処理を置き換えるのではなく、関数の途中も含めた任意の箇所で新しいコードを実行し、その後でオリジナルの処理を継続することです。これはフックするコードを ret で終えるのではなく、トランポリン関数への jmp を埋め込むことで実現できるようにしました。Clove が使うための API を Detours に追加する PullRequest を投げたのですが、今のところ音沙汰がありません。
なるほど。関数をただ置き換えるだけでなく、オリジナル処理に戻ることが出来るんですね。こりゃ便利。

DetoursはフリーウェアなのでGitHubで公開されてます。Microsoftも太っ腹になりましたね。
  • トレースへの応用
Detoursを応用するとEXEを変えずにデバッグログを仕込めそうです。差をつけるデバッグ術! ~ 知られざるログ出力あたりを参考にして、Detoursで置き換えた自作関数の頭で、DebugViewにログを出すためのデバッグ出力(OutputDebugString)を呼び出した後、オリジナル関数を呼び出す。するとオリジナルの処理を実行しつつDebugViewでモニタできます。(遅くはなると思うけど)
  • ETW
ちょっと脱線しますがEvent Tracing for Windows (ETW)を参考に、ドライバにログを入れておくと、困ったときにlogmon.exeでモニタ出来るので便利みたい。regmon.exeってのもありましたね(レジストリへのアクセスをモニタする方法)。
  • 独りごと
最近サイバーセキュリティのリスクについて騒がれることが多いので、この手のハッキング技術に詳しくなっておくに越したことはありません。1つ前に書いた【Ghidra】無償のリバースエンジニアリングツールもその一つ。あと、ペネトレーションテスト(侵入テスト)するためのツールMetasploitが使えるKali Linuxにも興味あります。


続く

スポンサードリンク