騙せるPE解析ツールのImport API表示機能(2016-11-28)

Windows実行ファイル(PEファイル)形式のマルウエアを分析する際に、PEファイルの構造をパースし表示をするツール(以下、PE解析ツールという)を使用して、マルウエアがインポートしているAPI(Import API)あるいはエクスポートしている関数の一覧を調べることがしばしばあります。それにより、通信をするのか、レジストリエントリを作成するのかなどのマルウエアの機能の予想をすることができるからです。このようにマルウエアの分析に使用されることが多いPE解析ツールですが、一方では、PE解析ツールによる分析を攪乱する手法を持ったマルウエアの存在も既に確認されています。[1]

今回は、PE解析ツールの多くに搭載されているImport APIの一覧を表示する機能に、誤った情報を表示させて分析者を騙す手口と、それに対抗するためにPE解析ツールに組み込むべき対策方法について解説します。


INT(Import Name Table)とIAT(Import Address Table)

PEファイルはImport APIに関連する2つのアドレステーブルINTとIATを持っています。INTには、PEファイルがインポートするAPIの名前を格納した領域のアドレスが記載されています。IATは、実際にAPIを呼び出す際に使用するもので、APIに対応する関数の入口のアドレスが、当該関数を含むモジュールがロードされた時点に書き込まれます。PEファイルのフォーマットについて詳しくは、マイクロソフト社のWebサイト[2]をご覧ください。
PEファイルにはNTヘッダと呼ばれる領域に、ファイルを実行するために必要な各種情報が記載されています。このNTヘッダはIMAGE_NT_HEADERSという構造体になっており、その構造体にあるOptional HeaderのIMAGE_DATA_DIRECTORYからアドレスを辿っていくことでINTおよびIATに到達できます(図1)。[3]

 

図 1:PEファイルのNTヘッダのうちINTとIAT関連部分



INTから参照されるIMAGE_IMPORT_BY_NAME構造体のNameフィールドにはインポートするAPI名が文字列として記載されています。一般的には、IMAGE_IMPORT_BY_NAMEは図2のように連続してAPI名が羅列されています。

 

図 2:IMAGE_IMPORT_BY_NAMEの例


 

INT偽装

IMAGE_IMPORT_BY_NAMEにはAPI名を表す文字列が格納されています。IMAGE_IMPORT_BY_NAMEの中のAPI名を書き換えることによって別のPEファイルに見せかけようとしても、API名を書き換えてしまうと、PEファイルを実行する際に意図しないAPIをインポートしてしまうことになるため、正常に動作しなくなってしまいます。しかし、図3の赤色で記載したように、INT中の既存のAPI名はそのままにして、INTの末尾に新たなAPI名を追加して、PEファイルを作り変えれば、追加されたAPI名に対応する関数の入口アドレスを格納するフィールドがIATにないため、実行時にモジュールをロードしようとすることはありません。このような偽装工作により追加されたAPI名をPE解析ツールが表示してしまうと、分析者はインポートしているAPIが増えたPEファイルだと理解し、調査が攪乱されることになります。

 

図 3:INT偽装の例



PE解析ツールを使用してINT偽装したPEファイルを確認

既存の多くのPE解析ツールでは、Import APIを列挙する際にINTだけを参照し、IMAGE_IMPORT_BY_NAMEの文字列をAPI名として認識し表示しています。通常のPEファイルにおいては、IMAGE_IMPORT_BY_NAMEの文字列からImportするAPIのアドレスがIATに記載されるため、このような挙動で問題はありません。
しかし、先に説明したINT偽装が行われている場合には、余分なAPI名まで表示することになります。INT偽装したPEファイルを作成し、Import APIがどのように表示されるのかをいくつかのPE解析ツールでテストしてみました。多くのツールがインポートしないAPIまで表示する結果になりました。

 

図 4:INT偽装した実行ファイルをPE解析ツールで分析した例
(INT偽装によってImport APIの数が増加したことがわかる)



INT偽装への対策

このような偽装手口への対策としては、PE解析ツールにてINTとIATを比較しインポートされるAPIだけを表示(図3の赤色で記載した追加されたAPI名を表示しない)する方法が考えられます。2016年5月9日の分析センターだより「Import APIとFuzzy Hashingでマルウエアを分類する ~impfuzzy~」で紹介したpyimpfuzzyもImport APIを基に分析を行うツールであり、初版ではINT偽装された場合、正常に分析ができない問題がありました。そこで、INTとIATを比較し、インポートされるAPIだけに絞り込んで分析するよう改版しました。

なお、PE解析ツールの多くはIMAGE_IMPORT_BY_NAMEの文字列をそのまま表示していますが、デバッガの多くや商用ディスアセンブラのIDA では、Import APIを表示する際、IATを参照していて、INT偽装の影響を受けないものが多いようです。Import APIの情報をマルウエア分析に使用する場合には、INTの文字列だけを信用するのではなく、デバッガを用いて実際にIATにロードされたAPIも併せて確認することをお勧めします。


おわりに

まだJPCERT/CCではINT偽装された検体は確認していませんが、今後このようなマルウエアの偽装が悪用される可能性があります。マルウエア分析をする際に、Import APIを基に分析を行う自動分析ツールなどを使用している場合は、INT偽装の影響を受ける可能性があるため注意が必要です。
前述したように、pyimpfuzzyのアップデートを行っていますので、使用する場合には最新のバージョン(バージョン番号0.02)であることをご確認ください。


分析センター 朝長 秀誠

参考情報
[1] Palo Alto Networks - The Dukes R&D Finds a New Anti-Analysis Technique
  http://researchcenter.paloaltonetworks.com/2016/09/unit42-the-dukes-rd-finds-a-new-anti-analysis-technique/
[2] Microsoft - PE Format
  https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms680547%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
[3] Microsoft - IMAGE_NT_HEADERS structure
  https://msdn.microsoft.com/en-us/library/windows/desktop/ms680336(v=vs.85).aspx

≪ 前へ
トップに戻る
次へ ≫