
Portable Executable (PE)ファイルをpefileとPyQt5を使用してツリービューで表示するためのPythonモジュール。IDA ProやRekallと併用して、メモリ内のPEファイルをダンプし、インポートを再構築することも可能です。
PE Treeは、pefileとPyQt5を使用してPortable Executable (PE) ファイルをツリービューで表示するためのPythonモジュールです。 また、IDA Pro、Ghidra、Volatility、Rekall、minidumpと組み合わせて、メモリ内のPEファイルの表示、ダンプ、およびインポートテーブルの再構築を行うこともできます。
PE Treeスタンドアロンアプリケーションは、ファイル、フォルダ、ZIPアーカイブからポータブル実行可能ファイルを見つけます。

新しい仮想環境とpipを使用してGitHubから直接インストール:
> virtualenv env
> env\Scripts\activate
> pip install --upgrade pip
> pip install git+https://github.com/blackberry/pe_tree.git
$ python3 -m venv env
$ source ./env/bin/activate
$ pip install --upgrade pip
$ pip install git+https://github.com/blackberry/pe_tree.git
リポジトリをクローンして開発用にセットアップ:
> git clone https://github.com/blackberry/pe_tree.git
> cd pe_tree
> virtualenv env
> env\Scripts\activate
> pip install -e .
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python3 -m venv env
$ source ./env/bin/activate
$ pip install -e .
PE Treeを実行して、ファイル、フォルダ、ZIPアーカイブ内のポータブル実行可能ファイルをスキャン:
$ pe-tree -h
usage: pe-tree [-h] [filenames [filenames ...]]
PE-Tree
positional arguments:
filenames Path(s) to file/folder/zip
optional arguments:
-h, --help show this help message and exit
PE Treeを実行して、バイナリファイルからポータブル実行可能ファイルをカービングする:
$ pe-tree-carve -h
usage: pe-tree-carve [-h] filename
PE-Tree (Carve)
positional arguments:
filename Path to file to carve
optional arguments:
-h, --help show this help message and exit
ダークモードはQDarkStyleをインストールすることで有効化:
$ pip install qdarkstyle
PE Tree IDAPythonプラグインは、IDAデータベース内のポータブル実行可能ファイルを見つけます。

IDAPythonプラグインとしてインストールして実行するには、setuptoolsを使用するか手動でインストールします。
pe_treeをダウンロードし、IDAが使用するグローバル Pythonインタプリタ用にインストール:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python setup.py develop --ida
pe_tree_ida.py を IDAプラグインフォルダ にコピー
pe_treeをダウンロードし、IDAが使用するグローバル Pythonインタプリタ用に要件をインストール:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ pip install -r requirements.txt
pe_tree_ida.py と ./pe_tree/ の内容を IDAプラグインフォルダ にコピー
プラグインとしてインストールせずに、IDA上でスクリプトとして実行する場合、まずpe_treeパッケージの要件をグローバル Pythonインストール用にインストール:
$ pip install -r requirements.txt
その後、IDA上で pe_tree_ida.py を実行:
File -> Script file... -> pe_tree_ida.py -> Open
| OS | プラグインフォルダ |
|---|---|
| Windows | %ProgramFiles%\IDA Pro 7.X\plugins |
| Linux | /opt/ida-7.X/plugins |
| Mac | ~/.idapro/plugins |
IDA Proを起動し、PEファイルを逆アセンブル(最良の結果を得るためには常にManual LoadとLoad Resourcesを選択!)
PE Treeプラグインをロード:
Edit -> Plugins -> PE Tree
以下は、パックされたPEファイル(例: MPRESS または UPX)をダンプし、インポートを再構築する基本的な手順(イメージベース/エントリポイントが標準的であると仮定):
IDA Proを起動し、MPRESSまたはUPXでパックされたPEファイルを逆アセンブル(Manual LoadとLoad Resourcesを選択)
デバッガ(WindowsまたはBochs)を選択し、OEP(通常0x00401000ですが、常にそうとは限りません!)まで実行
この時点で、メモリスナップショットを取得し(すべてのセグメントを保存)、後で使用するためにIDBを保存する
IDAがすべてのコードを見つけたことを確認:
Options -> General -> Analysis -> Reanalyze program
PE Tree IDAPythonプラグインを開き、右側のペインで右クリックして次を選択:
Add PE -> Search IDB
これにより、IDB内のMZ/PEヘッダがスキャンされ、見つかったモジュールが表示されます。
HEADER-0x00400000(または適切なモジュール名)を右クリックし、Dump... を選択
AddressOfEntryPoint(通常は0x1000ですが、常にそうとは限りません!)を指定
Rebuild IDT/IAT が選択されていることを確認
ダンプ!
新しい実行可能ファイルは、メモリ/IDBから取得したアンパック済みセクションデータを使用して作成され、再構築されたIAT、ヒントネームテーブル、IDTを含む .pe_tree という新しいセクションがPEファイルに追加されます(.idataセクションと同様)。エントリポイントメモリセグメントが実行中に書き込み可能としてマークされていた場合(VirtualProtectなど)、エントリポイントセクションの特性も書き込み可能としてマークされます。最後に、BASERELOC、BOUND_IMPORT、SECURITYの各データディレクトリがnullにマークされ、OPTIONAL_HEADERのチェックサムが再計算されます(指定されている場合)。
上記の方法を使用すると、アンパック、インジェクション、リフレクティブロード、ホローイングなどが行われたメモリ内の多くのPEファイルをダンプすることができます。
PE Tree Rekallプラグインは、Windowsメモリダンプ内のポータブル実行可能ファイルを見つけます。

Rekallを実行し、ライブシステム上のアクティブなプロセス、DLL、ドライバを表示:
$ rekall --live Memory
[1] Live (Memory) 00:00:00> run -i pe_tree_rekall.py
または、既存のメモリダンプに対してRekall/PE Treeを実行:
$rekall -f memory.vmem
[1] memory.vmem 00:00:00> run -i pe_tree_rekall.py
PE Tree Volatilityプラグインは、Windowsメモリダンプ内のポータブル実行可能ファイルを見つけます。

$ pe-tree-vol -h
usage: pe-tree-vol [-h] filename
PE-Tree (Volatility)
positional arguments:
filename Path to memory dump
optional arguments:
-h, --help show this help message and exit
PE Tree Ghidraプラグインは、Ghidraデータベース内のポータブル実行可能ファイルを見つけます。

$ pe-tree-ghidra -h
usage: pe-tree-ghidra [-h] [--server SERVER] [--port PORT]
PE-Tree (Ghidra)
optional arguments:
-h, --help show this help message and exit
--server SERVER Ghidra bridge server IP (default: 127.0.0.1)
--port PORT Ghidra bridge server port (default: 4768)
PE Tree Minidumpプラグインは、Windows Minidump内のポータブル実行可能ファイルを見つけます。

$ pe-tree-minidump -h
usage: pe-tree-minidump [-h] filename
PE-Tree (Minidump)
positional arguments:
filename Path to .dmp file
optional arguments:
-h, --help show this help message and exit
設定はINIファイルに保存され、デフォルト値は以下の通り:
[config]
debug = False
fonts = Consolas,Monospace,Courier
passwords = ,infected
virustotal_url = https://www.virustotal.com/gui/search
cyberchef_url = https://gchq.github.io/CyberChef
以下の情報は、設定に応じて、以下の条件下でサードパーティのWebアプリケーションと共有されます:
VirusTotalのURLが設定で指定されている場合、ユーザーがハイライトされたリンクをクリックするか、右クリックコンテキストメニューから「VirusTotal検索」を選択すると、ファイルハッシュ、タイムスタンプなどのメタデータがVirusTotalに送信されて処理されます。
CyberChefのURLが設定に存在する場合、ユーザーが右クリックコンテキストメニューから「CyberChef」を選択すると、任意のファイルデータがbase64エンコードされてCyberChefに送信され処理されます。
または
pipをバージョン20.0以上にアップグレードしてみてください:
$ pip install --upgrade pip
PyQt5を以下のようにアンインストールして再インストールしてみてください:
pip uninstall PyQt5
pip uninstall PyQt5-sip
pip install PyQt5 PyQt5-sip
IDAがすべてのコードを見つけて逆アセンブルしたことを確認:
Options -> General -> Analysis -> Reanalyze program
この完了後、再度ダンプ/インポート再構築を試みてください。
貢献を歓迎します!IssueやPull Requestは大歓迎です。
Sphinxを使用してソースからドキュメントをビルドする:
$ pip install sphinx
$ sphinx-apidoc -o ./doc/source/ .
$ sphinx-build -b html ./doc/source ./doc/build -E
ドキュメントを表示するには、Webブラウザで ./doc/build/index.html を開いてください。
Tom Bonner - tombonner - @thomas_bonner
PE TreeはApache Licenseのもとで配布されています。詳細はLICENSEを参照してください。
| セクション | オプション | タイプ | 説明 |
|---|
| config | debug | boolean | pefile.dump()を出力に表示するか |
| config | fonts | string | UIで使用するフォント名のカンマ区切りリスト |
| config | passwords | string | ZIPファイルのパスワードのカンマ区切りリスト |
| config | virustotal_url | string | VirusTotalの検索URL |
| config | cyberchef_url | string | CyberChefのURL |
| タイプ | OS | パス |
|---|
| アプリケーション | Windows | %TEMP%\pe_tree.ini |
| アプリケーション | Linux/Mac | /tmp/pe_tree.ini |
| IDAPython | Windows | %APPDATA%\HexRays\IDA Pro\pe_tree.ini |
| IDAPython | Linux/Mac | ~/.idapro/pe_tree.ini |
| Rekall | Windows | %TEMP%\pe_tree_rekall.ini |
| Rekall | Linux/Mac | /tmp/pe_tree_rekall.ini |
| Volatility | Windows | %TEMP%\pe_tree_volatility.ini |
| Volatility | Linux/Mac | /tmp/pe_tree_volatility.ini |
| Ghidra | Windows | %TEMP%\pe_tree_ghidra.ini |
| Ghidra | Linux/Mac | /tmp/pe_tree_ghidra.ini |
| Minidump | Windows | %TEMP%\pe_tree_minidump.ini |
| Minidump | Linux/Mac | /tmp/pe_tree_minidump.ini |
| カービング | Windows | %TEMP%\pe_tree_carve.ini |
| カービング | Linux/Mac | /tmp/pe_tree_carve.ini |