NetAgent Co., Ltd.
http://www.netagent.co.jp
Kenji Aiko1

API（関数）フックとは• アプリケーションが、外部ライブラリ（.dll、.soファイル）に存在する関数（命令コード）を呼び出す際、jmp命令やcall命令などを一時的に変更することで、別の関数へ処理を飛ばすテクニック• Linux（UNIX系）、Windowsそれぞれで、APIフックを実現するライブラリが存在する
2

APIフックの種類• 関数の先頭アドレス書き換えによるフック（Detours法）• プロセスのIAT（Import Address Table）書き換えによるフック• DLLの置き換えによるフック• SSDT変更によるSystemServicesフック
他にも多くの方法がある…
3

Windows CryptoAPI（1/2）• ADVAPI32.dllが提供する暗号処理系API• Windows2000以降で利用可能• 多くの暗号アルゴリズムを、専門知識なしに利用できる• ハッシュ、署名、検証など、暗号化に関連するライブラリも提供• Windows環境におけるSSL通信は、内部的にCryptoAPIを利用しているものが多い4

Windows Crypt APIs（2/2）• 暗号系はCrypt***という関数名でエクスポートされている
ADVAPI32.dll がエクスポートしているCrypto系関数群……………….

5

デモンストレーション（1/4）• SSL通信により送受信されるデータがCryptoAPIを通るため、プロセスのCrypto系関数をフックすれば、SSL通信をキャプチャできる
Demo 1
IEのSSL通信をキャプチャする
6

SSLにより暗号化されたデータ
IEのSSL（https）通信をWiresharkでキャプチャリングすると以下のように見える

detailhttp通信が暗号化されている！

7

CryptoAPIを通ったデータ• Crypt Encrypt/Decrypt を通ったデータが平文として確認できる■send data

■recv data

8

SSL通信の安全性• 暗号化されているため、通信を傍受しただけでは内容を確認できない• MITM（Man In The Middle）による通信の傍受は可能だが、正当なセキュリティ証明書を使って通信を行うことで、通信の信頼性、安全性は保たれる

9

APIフックの汎用性• アプリケーションがSSL通信を復号する瞬間をフックすれば、SSLの内容を確認できる• SSLの通信内容を改変することも可能• 内容を改変する場合も、セキュリティ証明書の正当性は関係ない
10

APIフックはとても簡単• Linux（UNIX系）OSでは、 LD_PRELOAD環
境変数を利用することで、実現できる• Windowsでは、Microsoft Research TeamからリリースされているDetoursライブラリをインストールすることで実現できる
Detoursライブラリ
http://research.microsoft.com/sn/detours/
11

LD_PRELOAD• Linux(UNIX)環境で使用可能• 使用方法は、LD_PRELOAD環境変数に、対象となるsoファイルを登録するだけ----- terminal% gcc –shared –fPIC –o intercept.so intercept.c –ldl
% LD_PRELOAD=./intercept.so target_prog----12

Detoursライブラリ（1/3）• Microsoft Research Teamから提供されているライブラリ• ターゲット関数の先頭数バイトを書き換えることでAPIフックを行う• 仕組みはシンプルで使いやすい13

Detoursライブラリ（2/3）• CryptEncrypt関数をフックする例
ADVAPI32.dll内にあるCryptEncrypt関数の先頭バイトを以下に示す• これは一般的な命令コードだが、Detoursによって関数フックを行うと、命令コードが次のように書き換わる
14

Detoursライブラリ（3/3）

detours.dllにより、先頭数バイトが変更される• detours.dllによって、CryptEncrypt関数の先頭5バイトがjmp命令に変更された
15

IAT書き換えによる関数フック• プロセス内のIAT（Import Address Table）を変更し、別の関数へ飛ばす方法（※）「Advanced Windows」 by Jeffrey Richterに詳細が記述されている。

16

DLLフック（1/2）• ターゲットとなる関数を持つDLLと同じエクスポート関数を持つ偽のDLLを作成し、偽のDLLをロードさせるようにEXEファイルを変更することでAPIフックを行う方法（DLLフック）■ normalcall or jmp

17

DLLフック（2/2）• prog.exeとkernel32.dllの間にダミーとなる関数を用意することで、APIフックを行える■ DLL intercepts
call or jmp

kernel32.dllがエクスポートしている関数の呼び出しをすべて確認できる
call or jmp

18

SystemServicesフック（1/2）• SSDT(System Service Descriptor Table)を変更することによるSystemService（システムコールと同義）のフック• 処理はカーネルランドで行う
Hooking Windows NT System Services
http://www.windowsitlibrary.com/Content/356/06/2.htmlに詳細が記述されている。
19

SystemServicesフック（2/2）
1. hook_createfileに変更する

SSDTNtCreateFile

hook_createfile

NtDeleteFile

real_deletefile

……….
SDT
……….

Real code

Fake code

real_deletefile

hook_createfile

real_createfile
20sysenterフック（1/4）• WindowsXP/2003(x86)環境では、sysenter命令によりカーネルへ処理が渡る• sysenterはntdll.dll内で呼び出される• sysenterはMSRに設定された値にジャンプする21

Sysenterフック（2/4）
ntdll.dll（ZwCreateFile）

Jump!
ntdll.dll（sysenter）

eaxレジスタの値がシステムコール番号22

Sysenterフック（3/4）■sysenter実行時の処理
1.CSレジスタに (MSR-174H) の値 をロード
2.EIPレジスタに (MSR-176H) の値 をロード
3.SSレジスタに (MSR-174H) の値+8 をロード
4.ESPレジスタに (MSR-175H) の値 をロード

つまり、CPUごとの(MSR-176H)を変更することでsysenterフックが可能
23

sysenterフック（4/4）
nt!hook_KiFastCallEntry(804e0f6f) に変更する

CPUMSR-175H

f9e73000

MSR-176H

804e0f6f……….

normalhooking

nt!KiFastCallEntry:

nt!hook_KiFastCallEntry:

mov ecx,23h
push 30h
pop fs…………….

xor eax, eax
………….
24

デモンストレーション（2/4）• APIフックを利用することで、MITM（Man InThe Middle）による通信の傍受も可能

Demo 2
P2Pソフトの通信をキャプチャする25

電子マネー Edy（エディ）• プリペイド型の電子マネー（suicaと同じ）• 銀行口座からEdyへ入金（チャージ）できる• Edyの残高を専用のソフトによって確認、再入金できる

26

FeliCaポート（PaSoRi）• SONYが開発した、ICカードを直接パソコンで読み込むシステム• USBで外付けできるものも販売されている• FeliCaポートを利用して、ICカードの情報を読み込むライブラリもある（BSDライセンス）
27

EdyViewer.exe• Edyの情報を確認、管理するソフトウェア• ユーザーの銀行口座を登録することで、口座からEdyへの入金を行える• Windows上で動作する• 公式のFeliCaポート対応ソフトウェア
28felicalibライブラリ• USB接続の読み込みツール（PaSoRi）を使い、ICカードへアクセスするためのライブラリ（BSDライセンスで提供）
http://felicalib.tmurakam.org/• Suica、Edy、nanacoなどの電子マネーへのアクセスに使用できる。
• 非公式のFeliCaポート対応ライブラリ29

デモンストレーション（3/4）• felicalibを利用することで、ICカードの情報を閲覧するツールを作成できる

Demo 3
ICカードの情報を取得する
30

ICカードのセキュリティ（1/2）• 読み込み可能なブロックと不可のブロックがある• 一部、暗号化されているブロックがある• felicalibでは、書き込みができない• felicalibでは、暗号化ブロックへアクセスできない31

ICカードのセキュリティ（2/2）• 公式ツールEdyViewer.exeでは、暗号化部分の読み込み、書き込みを含め、すべてが可能• 公式ツールEdyViewer.exeは、管理サーバへの通信にSSL（https）を使用

32

デモンストレーション（4/4）• ICカードへの入金（チャージ）時に発生するSSL通信を見る

Demo 4
公式ツールのSSL通信をキャプチャ
33

今後の展望（1/2）• APIフックならば、ユーザーランドとカーネルランドの通信もキャプチャできる• EdyViewer.exeとFeliCaポートドライバとの会話をキャプチャできないか？

34

今後の展望（2/2）• sysenterフックで、システムコール呼び出しを監視できる• システムコール呼び出し履歴から、通常のAPIの呼び出し履歴を推測できないか？

35Thank you!

Any questions?

36