BlackBerryが提供するマルウェアのリバースエンジニア向けオープンソースツールPE Tree
本ブログ記事は、2020年8月3日に米国で公開されたBlackBerryのブログ記事の抄訳版です。原文はこちらからご覧頂けます。
BlackBerryは8月3日、BlackHatにおいてPE Treeのリリースを発表しました。PE Treeは、BlackBerryのリサーチ&インテリジェンスチームによって開発された新しいオープンソースツールで、pefileとPyQt5を使用してPortable Executable(PE)ファイルをツリー表示で閲覧できます。PE Treeはリバースエンジニアリングコミュニティ向けに開発されたもので、Hex-RaysのIDA Proデコンパイラとも統合し、PE構造の容易なナビゲーションと、メモリ内のPEファイルのダンプやインポートの再構成の実行が可能です。
概要
PE TreeはPythonで開発されており、Windows®、Linux®、Mac®の各オペレーティングシステムをサポートします。PE Treeはスタンドアロンアプリケーションとしてインストール・実行できます。
図1:スタンドアロンアプリケーション
また、IDAPythonプラグインとしてもインストール・実行できます。
図2:IDAPythonプラグイン
PEファイルは、Ero Carrera氏が開発したpefileモジュールを使用して解析され、ツリー表示の形式にマッピングされます。以下のヘッダーの概要が示されます。
- MZヘッダー
- DOSスタブ
- リッチヘッダー
- NT/ファイル/オプションのヘッダー
- データディレクトリ
- セクション
- インポート
- エクスポート
- デバッグ情報
- 構成のロード
- TLS
- リソース
- バージョン情報
- 証明書
- オーバーレイ
図3:リッチヘッダーの概要
ヒント:pefileが解析時に問題を検出した場合、警告アイコンの上にマウスカーソルを置くと詳細情報が表示されます。
図4:pefileの警告
ハイライト表示されたリンクをクリックすると、VirusTotalで以下の情報を検索できます。
- ファイルハッシュ
- PDBパス
- タイムスタンプ
- セクションのハッシュ/名前
- インポートのハッシュ/名前
- エクスポートの名前
- リソースのハッシュ
- 証明書のシリアル
ヒント:IMAGE_DIRECTORY_ENTRY_DEBUG と IMAGE_EXPORT_DESCRIPTOR
また、PEファイルの特定の部分を保存するか、またはCyberChefにエクスポートして、さらに処理を行うことができます。以下の要素を保存またはエクスポートできます。
- DOSスタブ
- セクション
- リソース
- 証明書
- オーバーレイ
図5:証明書の保存またはエクスポート
左側の「レインボービュー」には、PEファイルのおおまかな構造と、各領域のオフセット/サイズ/比率が示されます。以下は、ファイルに複数のリソースが含まれ、大きなオーバーレイが付加されているPEの例です。
図6:レインボーマップ
各領域をクリックするとツリービューに移動します。右クリックすると、ファイルに保存したり、CyberChefにエクスポートしたりできます。
ヒント: レインボーマップを使用すると、似たファイル構成を見つけたり、サンプル間の関係を特定したりすることが簡単にできるため、PEファイルのディレクトリを処理する際にビジュアルツールとして役立ちます。
IDAPython
IDAPythonプラグインを使用してHey-RaysのIDA Proと統合することができます。これにより、IDAデータベース(IDB)でPEファイルを検索してダンプしたり、インポートを再構成したりするなど、高度な機能を利用できるようになります。
図7:IDAデータベースでPEファイルを検索
PE Treeは、メモリ内PEファイルをダンプするときに、ファイル構造に関する基本的なコメントをIDBに追加し、オフセットの名前をIAT関数の名前に変更します。これにより、注入/アンパックされたPEを単一のIDB内から容易に参照・分析できるようになります。
ヒント: PE Treeを使用して、OllyDumpEx/ImpRecと同様の方法でPEファイルをダンプし、インポートを再構成することもできます。MPRESSのアンパックの例を以下に示します。
図8:「Search IDB」の実行後、上記のような既存のIATを持つMPRESSでパックされたPEファイルが見つかった(ただし完全ではない)
図9:ダンプすると、アンパックされたPEファイルには新しい(完全な)インポートアドレステーブルが含まれている
「Rebuild imports」を選択すると、PE Treeは、IAT参照の可能性のあるすべての要素をIDAの逆アセンブリで探し、新しいIAT、IDT、ヒント名テーブルを構築します(この方法は、アンパックされたPE、または動的にロードされたPEの場合に推奨します)。それ以外の場合は、「Use existing imports」を指定すると、PE TreeはDIRECTORY_ENTRY_IMPORTで指定したIATに基づいてインポートを再構成しようと試みます(これはデフォルトのモードで、大半のPEとシステムDLLではこの方法を推奨します)。
今後の展望
PE Treeは現在もアクティブな開発が続いているため、新機能の更なる登場をご期待ください。次回のメジャーリリースではrekallのサポートに的を絞り、メモリダンプ、ライブシステムのどちらからでも、プロセスの参照とダンプを行うことができるようになる予定です。
図10:Rekallを使用してアクティブなプロセスのダンプが可能になる予定
より詳しい情報、ならびにPE Treeのソースコードへのアクセスについては、BlackBerry GitHub accountにアクセスしてください。