【※ 当記事は2020年7月2日時点の情報です】
ペイヴメント(@pavement1234)です。
フックの概要を知りたい。
APIフックとは?
雑に説明するとDLLインジェクションと呼ばれる方法で
自作関数を定義したDLLをEXEに注入し、
自作関数が呼び出されるようにすることをAPIフックと言います。
IAT(インポートアドレステーブル)を書き換えたり、
CreateRemoteThread関数を使ったりして実現します。
APIフックに負けない強い体づくり、
APIフック (Cライブラリ関数やWindowsAPIの書き換え) と、その応用例、
インポートアドレステーブルとAPIフック、
DLLインジェクションとAPIフック、
PE(Portable Executable)ファイルフォーマット その2 ~ インポート情報とインポート関数の列挙 ~、
あたりが参考になるかと。
似てるもので
メッセージフックというのがありますが、これはWindowプロシージャより前に
Windowメッセージを横取りすることを意味しておりAPIフックとは違います。
フックのしくみ、
メッセージフック、
あたりが参考になります。
Detoursとは?
実行中のプロセスをフックして任意のコードを実行する (Non-invasive instrumentation)によると
「実行中のプロセスの任意の箇所をフックして、
DLL に実装した任意のコードにジャンプして実行してから、
元の処理に戻って動作を継続できる」ツールとのこと。
一部抜粋しました。
Detours の動作原理は、
インポートテーブルの書き換えなどという生ぬるい手段ではなく、
フックする箇所の命令を逆アセンブルし、
トランポリン関数として別の場所にうまいこと退避させ、
元の箇所にフック先への jmp 命令を埋め込むという巧妙な方法です。
Detours Wiki に図があります。
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ってのもありましたね
(レジストリへのアクセスをモニタする方法)。
まとめ
最近サイバーセキュリティのリスクについて騒がれることが多いので、
この手のハッキング技術に詳しくなっておくに越したことはありません。
前に書いた
【セキュリティ】Ghidra、Kali Linux、ゼロトラストネットワークについて調べてみた
のGhidraもその一つ。
あと、ペネトレーションテスト(侵入テスト)するためのツール
Metasploitが使えるKali Linuxにも興味あります。
Metasploitのインストール方法と設定方法、
ちょこっとホワイトハッカーになった気持ちになって、VirtualBox上にKali Linuxをインストールし、Metasploitを使ったペネトレーションテスト(脆弱性診断)をやってみた ※最後に「Star Wars」ネタもあるよ!※、
あたりを読みながら、
自分vs自分でハッキングバトルしてみようかな。
関連記事(プログラミング)
【プログラミング】マルチコア環境における排他制御の課題
【プログラミング】gccの基本オプションの使い方
【C言語】デバッグのテクニック(標準関数のスタブ作成、動的ライブラリのデバッグ方法)
【プログラミング】迂回(Detours)という技術について
【プログラミング】64bit OSの32bitエミュレーションの状況