Packer Detection and Generic Unpacking Techniques」より
February 29,2008 posted by Joren McReynolds

 マルウエアの作者は,実行可能ファイルの自動アンパックを防ぐために独自の策やパッカーを利用することが多い。これはアンチウイルス用のシグネチャの開発や,詳細な解析を遅らせるための試みである。シグネチャ・ベースのスキャナを回避するためにパックされたバイナリを変更するツール「スクランブラー」も同様に使用される。実際,「[MSLRH]」という公開されているプロテクタは,実行可能ファイルをパックしてデバッグやダンプといった解析手法から逃れ,バイト奪取機構でファイルを保護するだけでなく,解析ツール「PEiD」やその他シグネチャ・ベースのスキャナと同様,実行可能ファイルを表示させるプロテクタを選べる。[MSLRH]は一部のアナリストと自動アンパッカーを払いのけ,実行可能ファイルのエントリ・ポイントに同パッカーの一般的なバイト・シーケンスを格納する。また,このタイプのツールは,正当なソフトウエアの作者達が,彼らの知的所有権を保護するのにも使われる。

[MSLRH]のスクリーン・ショットとシグネチャ選択オプション
[MSLRH]のスクリーン・ショットとシグネチャ選択オプション

 インターネット上には非常にたくさんのプロテクタ,パッカー,スクランブラーが出回っているため,何を利用するか決める上で注意が必要だ。一般的にパッカーよりも,マルウエアそのものと,マルウエアが個人や企業に与える影響の方に多くの関心が集まるため,筆者は今回,大半のパッカーに有効な,よく知られているアンパックのトリックを取り上げる。これは「ESPトリック」と呼ばれるもので,たくさんのリバーサで利用されており,オンラインで多数入手可能なOllyScriptのアンパック・スクリプトにも出てくる。当記事では,このESPトリックの具体的な内容について説明する。

ESPトリックとは

 デバッガ「OllyDbg」でパックされた実行可能ファイルを開くと,通常は以下のようなメッセージが表示される。

 パッカー/プロテクタではたいていの場合,上のようにEPの近くにPUSH命令(例:PUSHAD)がある。PUSHADは,すべてのレジスタ(EAX,ECXなど)をスタック上に格納する。なぜこの処理が重要なのだろうか。それはレジスタをバックアップしてからアンパック・ルーチンを実行することで,アンパック処理中に全レジスタの値を好きなように変更して使えるからだ。このルーチンが完了し,すべてのセクションがアンパック/非プロテクトとなれば,POPAD命令で元のレジスタ値をスタックから取得できる。

 つまり,以下の手順を実行することで,大半のパッカーでアンパックされたバイナリを取得できる。

・PUSHADを実行する
・ESPにハードウエア・ブレークポイントを設定する
・実行する
・到達したブレークポイントを探す。OEPにつながっていないようであれば,再び実行して次のブレークポイントを待つ

 画面で手順をひとつずつ説明する前に,ESPレジスタにハードウエア・ブレークポイントを設定する理由を説明したい。ESPはスタック・ポインタで,常に最上位スタックを指す。ESPにブレークポイントを設定しておくと,元のレジスタ値が再び取得されたときに通知される。なお,標準的なソフトウエア・ブレークポイントはプログラムの処理を停止したい場所に割り込み命令「INT3」を設定するので,コードを変えてしまう。そのため,コード変更のともなわないハードウエア・ブレークポイントを使うことが大切なのだ。

 今回の例では,以下の理由から,圧縮/展開プログラム「UPX」でパック(圧縮)した実行可能ファイル「calc.exe」を使用する。

・UPXが商用ソフトウエアでないこと
・UPXはすぐれた圧縮ツールであるため,悪意のあるソフトウエアとそうでないソフトウエアの両方で用いられることが多い
・calc.exeはどのWindowsマシンにもあるため,読者がすぐに同ファイルを利用して以下の手順を実行できる

 UPXには展開オプションがあり,UPX形式で圧縮された実行可能ファイルに使用できる。UPX形式で圧縮された実行可能ファイルを変更して展開オプションを使用できないようにするスクランブラーもいくつかある。このようなケースの場合,以下に示される通り自動アンパックツール(UPX展開オプションなど)が動作しない際,ESPトリックが非常に役立つ。

ESPトリックの利用方法

 はじめに,PUSHADをステップ・オーバーで実行する。次にESPの値を右クリックし,[Follow In Dump] をクリックする。

 左下部のダンプ・ウィンドウで最初のDWORD(ESPの値)を強調表示し,ハードウエア・ブレークポイントを設定する。

 実行を再開するには,[Run]をクリックする。以下の通り,ブレークポイントに到達する(上にスクロールすると結果が確認できる)

 POPAD命令は,上記したように通り使われている点に注意してほしい。このJMP命令ではOriginal Entry Point(OEP)に移動するため,プロセスをダンプまたは分析することができる。今後のブログ記事では,デバッグ済みプロセスのダンプ,さらにはその他のパッカーで見つかったImport Address Table(IAT)破壊などの問題について取り上げる。

結論

 マルウエアの作者は,その他のソフトウエア作者と同様,自家製または商用のツールを利用して,自分の作品を守ろうとしている。パッカー,プロテクタ,またはスクランブラーの利用によって分析やアンチウイルス・シグネチャに混乱が生じると,脅威の分析が遅れる可能性がある。この結果,ユーザーが一定期間マルウエアの脅威にさらされることになりかねない。これらがどのような働きをするのか,さらにどのように対処すればよいのかを十分に理解することで,自らの安全を一層高めることができる。


Copyrights (C) 2008 Websense, Inc. All rights reserved.
本記事の内容は執筆時点のものであり,含まれている情報やリンクの正確性,完全性,妥当性について保証するものではありません。
◆この記事は,ウェブセンスの許可を得て,米国のセキュリティ・ラボの研究員が執筆するブログWebsense Security Labs Blogの記事を抜粋して日本語化したものです。オリジナルの記事は,Packer Detection and Generic Unpacking Techniquesでお読みいただけます。