Windows

【プログラミング】迂回(Detours)という技術について

【※ 当記事は2020年7月2日時点の情報です】

ペイヴメント(@pavement1234)です。

エンジニア
エンジニア
MicrosoftのDetours、
フックの概要を知りたい。

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自分でハッキングバトルしてみようかな。

ABOUT ME
ペイヴメント
ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。
error: Content is protected !!