PEヘッダでパッカーの有無を見分ける方法
マルウェアの多くはパッカーというツールで圧縮され、検知や解析を免れます。今回はそのパッカーで処理されているかどうかを簡単に見分ける方法をご紹介します。
■パッカーとは
パッカーは圧縮ツールの一種でもともとハードディスクのサイズを抑えたり、ダウンロード時の通信量を減らしたりする目的で利用されてきました。しかし、近年ではマルウェアに悪用されるケースが非常に目立ってきております。マルウェア開発者は主にウィルス対策製品の検知を免れたり、解析をしづらくさせたりする目的でパッカーを利用します。そのため、パックされていることはマルウェアである可能性が高いということになります。
パッカーは圧縮ツールですが、zipや自己解凍形式などの圧縮とは少し異なります。パックされる対象は実行ファイル(.exe)のみです。そしてパックされて出来上がったファイルも実行ファイルとなります。その中に圧縮された元の実行ファイルが収められています。
図1)パックされたファイルのイメージ
パックされたファイルを実行すると最初に解凍プログラムと元のファイルがメモリ上に展開されます。次に、解凍プログラムがメモリ上に元のファイルを解凍し、最後に元のファイルが実行されます。
図2)パックされたファイルを実行する様子
パックされた元のファイルはメモリ上の実行セクション(命令が格納される領域)に解凍された後、実行されます。
■見分け方の概念
通常のファイルとパックされたファイルは実行セクションに対する権限が異なります。
図3)セクションに対する権限の比較
上記の通り、実行セクションにおいて書き込み権限がある実行ファイルはパックされていると判断することができます。
Windowsではセクション用にメモリを確保する際、上記のような権限をセクションごとに設定します。書き込み権限がないセクションにデータを書き込もうとした場合は、アクセス保護違反が発生し、プログラムは強制終了します。そのため、パックされたファイルの実行セクションには必ず書き込み権限があります。
■見分け方の詳細
各セクションにどの権限を割り当てるかは実行ファイルのPEヘッダという領域に記されています。まずは、パックされていない一般的なファイルとして、Windowsのメモ帳(notepad.exe)を見てみましょう。以下はPEヘッダを確認する「PEView」というツールで開いた結果です。
図4)メモ帳の命令セクション(.text)
左側ツリーの「IMAGE_SECTION_HEADER」から始まる項目がセクションを定義している箇所になります。メモ帳の場合は、セクションが4つあります。最初のセクションは「.text」という名前がついています。通常、「.text」や「.code」という名前を持つセクションは命令セクションとなりますが、単なる名前でしかないため、擬装が簡単にできます。格納されているもの(命令またはデータ)および許可されるオペレーションは「Characteristics」(赤枠)にて定義されています。
赤枠の「Characteristics」に以下のフラグが立っていることがわかります。
IMAGE_SCN_MEM_READ 読み取り可能
IMAGE_SCN_MEM_EXECUTE 実行可能
IMAGE_SCN_CNT_CODE 実行可能なコードが含まれる
読み取り権限と実行権限があることがわかります。次に、メモ帳のデータセクションを見てみます。
図5)メモ帳のデータセクション(.data)
Characteristicsの値は以下の通りです。
IMAGE_SCN_MEM_WRITE 書き込み可能
IMAGE_SCN_MEM_READ 読み取り可能
IMAGE_SCN_CNT_INITIALIZED_DATA 初期化済みのデータが含まれる
実行権限がないため、データセクションであることが分かります。
ここでは割愛しますが、同様に見ていくと他のセクション(.rsrcおよび.reloc)は以下のフラグが立っています。
IMAGE_SCN_MEM_READ(読み取り可能)
IMAGE_SCN_MEM_DISCARABLE(破棄可能)
ポイントは、「実行」および「書き込み」のフラグが両方立つことがないということです。
では、いよいよパックされたファイルを見てみましょう。メモ帳を「Morphine」というパッカーで処理した結果です。
図6)パックされたメモ帳の実行セクション(.text)
Characteristicsの値は以下の通りです。
IMAGE_SCN_MEM_WRITE(書き込み可能)
IMAGE_SCN_MEM_READ(読み取り可能)
IMAGE_SCN_MEM_EXECUTE(実行可能)
IMAGE_SCN_CNT_CODE(実行可能なコードが含まれる)
「実行」および「書き込み可能」いずれのフラグもついています。
パッカーの性質上、命令セクションに元の命令を解凍するため、書き込み権限が求められ、さらに解凍後に実行するため、実行の権限も必要となります。そのため、パックされているファイルの命令セクションは「書き込み」および「実行」が可能になっています。
■具体的な手順
1.調べたい検体をPEViewで開きます。
2.左側のツリーから「IMAGE_SECTION_HEADER .xxxx」を選択します。
3.右ペインの「Characteristics」欄を確認し、以下のフラグがいずれもあるかどうかを調べます。
・IMAGE_SCN_EXECUTE
・IMAGE_SCN_MEM_WRITE
あれば、パックされている可能性が高いです。なければパックされていないということになります。
4.残りのセクション「IMAGE_SECTION_HEADER .yyyy」に対しても、手順3同様に調べます。
フォローしませんか?