[セキュリティブログ] Web ハッキングツールの攻撃手法と防御技術(1)
■メモリハッキング (Memory Hacking) とは
クライアントを解析し、メモリのどの領域に情報が入っているのかを把握し、その情報を任意に操作することです。
プロセスメモリにアクセスしてアドレスを盗み改ざんする攻撃手法で、ゲームのハッキングに多様されます。最近では、金融取引でのハッキングにも多く見られ、パスワード等のユーザー情報をハッキング[図 1]、株価や注文情報等を改ざんする危険性があります。プロセスのメモリにアクセスするには、ファイルを使用と似た方法を用い 「Open Process→Read Process Memory→Write Process Memory」 という工程をふみ、プロセスメモリにアクセス、重要情報を漏えい / 改ざんします。これを防ぐには、関数を監視する API フッキングという技術を使い、プロセスメモリへのアクセスに使われる API 関数の呼び出し過程を監視し、許可されていないプログラムのアクセスが検知されたら防御または危険を知らせる手法が使われます。

[図 1] ユーザーのID、パスワードがメモリ上にそのまま漏えい
■ API フッキング (Hooking) とは
特定の API を他の関数に変更し攻撃する方法で、ハッキングツールの重要機能です。ハッキングツールのゼウス (Zeus) は、WININET 系列の API 関数をフッキングする方法でインターネットにより送信情報を盗み、金融機関のサイトに入力されたすべての情報を収集し重要な個人情報を盗みます。
[図 2] ハッキングツールゼウス (Zeus) に感染したシステムからデバッグコマンドでメモリにロードされている Http Send Request API 関数のコード内容です。正常なシステムとは異なり関数のエントリポイントの部分に Jump Code (0xE9) が挿入されており、ここから関数が呼び出されても他のアドレスのコードに移動していることを示しています。
最近では、Zeus のソースコードがインターネット上に流出し話題になりました。[図 3] は流出された Zeus のソースコードの一部分です。
デバッグした結果 Zeus は関数のエントリポイントに Jump Code (0xE9) を書き込み、その後ジャンプ (Jump) するアドレスを入れる典型的なインラインフッキング(Inline Hooking) の手法を用いています。
API がフッキングされているか調べるには、関数のエントリポイントにジャンプコードが存在するか確認しますが、正確な方法ではありません。ジャンプコード以外のバイパスコードが使われることもあるからです。
ではどのような方法で API がフッキングされたのでしょうか?
一般的に EXE、 DLL 等のファイルは決められたフォーマットを持っていますが、実行ファイルは OS が読み込むドキュメントファイルだと考えればよいでしょう。EXE、DLL ファイルのフォーマットは PE (Portable Executable) 形式で、ここには実行ファイルに対する各種情報が保存されています。その中でも 「Export Address Table」 には、実行するための関数コードのアドレス値が保存されています。 この 「Export Address Table」 へアクセスするには、まずヘッダ部分の IMAGE_NT_HEADER を読みます。そして確認する関数のコードが保存されているアドレスを読み、関数コードへアクセスしコードを読み込んだ後、実際にメモリにロードされた関数のコードとを比較して関数フッキングの有無を確認します。関数がフッキングされていれば、読み込んだ本来のコードに復元します。
正常なプログラムのフッキング確認をするには、実際にジャンプされたアドレスがどのようなモジュールを指しているのか調べます。また正常なモジュールの場合には復元してはいけないのですが、これを確認する為に正常なプログラムのリストを持っている必要があります。

[図 2] ZeuS に感染されたメモリーにロードされている HttpSendRequest API 関数コード
