アプリケーションが完成すると、仕様が固定されていることはエンジニアにとっての常識です。プログラムは組み込んだロジックに従って動作するので、ソースコードを編集して再コンパイルしない限り、プログラムの既定フローを変更できません。例えば、Notepad.exeは設計上、ハードディスク上の任意のファイルを開くことができます。C:\Securityディレクトリにあるファイルを開けないようにしたい場合、当然元の仕様に違反します。この目的を達成するには、Notepadの動作を強制的に変更する必要があり、この時にAPIフックの技術を使用することになります。ハッカーやセキュリティ保護の攻防もしばしばAPIフックの技術で特定アプリケーションの動作を変更することがあり、APIフックの技術を詳しく理解することは情報セキュリティを理解するために不可欠なことです。
Windowsのアーキテクチャ概要
APIフックのプロセスをより明確に理解するためには、Windowsのアーキテクチャについて簡単に説明する必要があります。
下図はWindowsにおけるアプリケーションMyhook.exeとNotepad.exeのメモリ分布図です。まず、メモリが上半分と下半分に分割されていることがわかります。上半分はユーザー空間であり、一般的なアプリケーションがここにロードされます。下半分はカーネル空間であり、さまざまなソフトウェアやハードウェアドライバが含まれています。
上半分のユーザー空間には、仮想メモリを利用してアプリケーションを同じ場所の異なる空間に隔離するという特徴があります。隔離により各アプリケーションは専用のユーザー空間のみを参照できるため、たとえMyhookがクラッシュしてもNotepadに影響を与えることはありません。
ただし、ユーザー空間はAPIフックにとって非常に不便です。Myhookを実行してNotepadの動作を変更したいのに、2つのプログラムが異なる世界で実行されているためMyhookはNotepadにアクセスできません。

プログラム挿入という方法
プログラム挿入という別世界を探索するためのツールがあります。簡単に説明すると、コードを別世界に投げ込んで実行するためのツールです。以下の図で示したように、MyHookがInject DLLを使用してMyHook.dllをNotepadの世界に送信できます。
Inject DLLはプログラム挿入を記述する方法の1つであり、魔法のような方法でプログラムに干渉します。一般的に2つの実装方法があります。

実装案1:Windowsの標準のフックであるCBTフック・マウスフック・キーボードフックなどを使用します。これらのフックを適切に設定すれば、Notepadが実行されると対応するフックが触発されて自動的にHook.dllがロードされます。
実装案2:十分な権限がある場合、CreateRemoteThread APIを使用すると、Myhookが能動的にNotepadにリモートでHook.dll注入できます。
上記の2つの実装案を使用することで、Windowsのユーザー空間の隔離を越えて実行可能なプログラムをNotepadに送信できます。
有名なランサムウェアNetWalkerは、まさに実装案2を利用してExplorerにリモートで挿入したランサムウェアの本体を攻撃に使用しています。一度挿入に成功すると、ランサムウェアはExplorerの皮を被って破壊工作もできます。しかも、多くのセキュリティソフトウェアはExplorerを安全なプログラムと見なしているため、NetWalkerをブロックすることができません。
APIフック
Windowsの仮想メモリ構造を理解し、Hook.dllをNotepadの世界に挿入することで、挿入という侵入が達成されます。
挿入が完了すれば、APIフックの前準備ができたと言えます。
下図はAPIフックを実行する方法を示しています。NotepadのCreateFile APIをフックします。

処理後は元のCreateFile APIに戻ります。(上記の例ではChainOldCreateFile)APIフック時はフックするAPIの進入ポイントを変更します。(上記の例ではJmp MyCreateFile)NotepadのCreateFileのアクションはすべて、Hook.DLL内のMyCreateFileにリダイレクトされます。このポイントでNotepadがどのファイルを開くかを確認できます。例えば、CreateFileのパラメーターをチェックして、C:\ Security下のファイルが開かれたかどうかを確認できます。
APIフックプロセス中にNotepadは全く感知できず、自分がWindows API CreateFileを使用したことしか知りません。フックされたCreateFileは作成したHook.dllの代替プログラムMyCreateFileに密かにリダイレクトされます。結果、NotepadのCreateFileのすべてのアクションに対して記録またはブロックすることができるようになります。
結論
本文では、MyHook.exeを使用してNotepad.exeに侵入し、APIフックの技術を使用してNotepadのCreateFileをインターセプトしてHook.dllにリダイレクトする挿入プロセスについて説明しました。この手法でNotepad.exeの動作を変更し、C:\Securityディレクトリ下のファイル読み込みをブロックできます。
APIフックには様々な利用法があります。例えば、翻訳ソフトはテキストにマウスを重ねるだけで翻訳する機能があり、これもAPIフックを使った応用例です。
一方、APIフックは凶器にもなりえます。ハッカーたちはこの技術を利用して強力なハッキングツールを作成します。例えば、一般的なハッキング手法であるパスワード盗難機能やユーザの行動ログ、Windowsのアクセス制御を回避して管理者権限を取得するなど、すべてAPIフックで実現できるので運用するには気をつけなければいけません。

