Windows

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

MicrosoftのDetours。フックの話です。

この記事で解決できること

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

  • この記事を書いた人
  • 最新記事

ペイヴメント

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

-Windows

Copyright© ペイヴメントのエンジニア塾 , 2020 All Rights Reserved.