SpyEye ボットによるリソースデータの使用
IIR Vol.13 の1.4.2節では SpyEye ボットの動作概要について説明しましたが、このエントリでは IIR に書ききれなかった SpyEye ボットの動作について書かせていただきます。
SpyEye ボットは感染動作の過程で、その内部に保持している合計で5つのリソースデータを使用します。リソース名と対応するデータを以下の図に示します。
「C+数字」はデータを保持するリソースであることを意味し、C1/C2/C3 の3つがあります。C1 にはインストール時に収集するコンピュータ名やボットの実行パス、ビルド時に指定したフォルダ名やミューテックス名などが格納されます。C2 には各種設定ファイルとプラグインの DLL を含む zip データを XOR キーでエンコードした、いわゆる config.bin と呼ばれるデータファイルが格納されます。そして C3 には C2 の zip を解凍するために必要なパスワードが入っています。一方、「SC+数字」はコードを保持するリソースをあらわします。SC1 はボットのインストールを目的とした、explorer.exe に行うインジェクションによって実行されるコードの本体になります。SC2 は C1 のデータを収集するためのコードです。
以上のことを踏まえたうえで、動作概要を IIR 版よりも少しだけ詳細に解説します。ボットは実行されるとリソース C1/SC2 をロードして、SC2 を実行することによって C1 fにコンピュータ名やボリュームのシリアルナンバー、OS のバージョンなどの端末情報を格納します。次に explorer.exe に SC1 をインジェクションします。蛇足ですが、このインジェクションの手法は、SpyEye ボットのバージョンによっては少し変わった手法を採用しているようです。他のプロセスにインジェクションしたコードを実行する際には、一般的に CreateRemoteThread 関数が使われることが多いですが、1.3.45 では NtClose 関数にジャンプコードを埋め込むことで、インジェクトしたコードを実行させています。
explorer.exe にインジェクトされたコードは、ボットを C:\ビルド時の指定フォルダ名
にコピーし、オリジナルを削除します。その後コピーしたボットを起動します。以上で最初のインストール動作は完了します。コピーされたボットは、C3 を環境変数にセットし、インラインの実行ファイルをそのPEヘッダを解析してロードした後に、そのエントリポイントをコールします。
インラインの exe のエントリポイントからの実行は、先ほどセットした環境変数から C3 を取得しつつ、C2 をロードして同じフォルダに保存します。C2 はパスワードつき zip の XOR エンコードデータになっており、そのパスワード解除に C3 が利用されます。この後再び explorer.exe へインラインの実行ファイルをインジェクションします。
二度目に explorer.exe にインジェクションされたインラインの実行ファイルのコードは、config.bin に含まれているプラグインを起動するとともに、その他のプロセスへさらにインジェクションを行い、最終的にそのインジェクトされたコードが情報の搾取やボットの隠蔽に必要な関数をフックすることになります。
このように、5つのリソースデータは SpyEye ボットの感染動作と密接に関連しており、ロードされたリソースがどういう目的で使われるデータ(もしくはコード)なのかを理解しておくと、解析を楽に進めることができます。ちなみに、なぜ SpyEye の作者はリソースデータを使っているのでしょうか? config.bin や端末情報を収集するデータ構造とそれに付随するコードは、頻繁にサイズや構造が変化するため、おそらく作者は本体の実行ファイルの汎用性を保つために、それらを本体から分離したかったのではないでしょうか。
今回は、IIR に書けなかった SpyEye のリソースデータとそれを使った動作についてご説明しました。SpyEye の検出方法についてはもう少し書いてみたいことがありますので、機会があれば書かせていただきたいと思います。