
Python-Modul zur Anzeige von Portable Executable (PE)-Dateien in einer Baumansicht mithilfe von pefile und PyQt5. Kann auch mit IDA Pro und Rekall verwendet werden, um PE-Dateien aus dem Speicher auszulesen und Importe zu rekonstruieren.
PE Tree ist ein Python-Modul zur Darstellung von Portable Executable (PE)-Dateien in einer Baumansicht mittels pefile und PyQt5. Es kann auch mit IDA Pro, Ghidra, Volatility, Rekall und minidump verwendet werden, um PE-Dateien im Speicher anzuzeigen und auszulagern sowie die Importtabelle zu rekonstruieren.
Die PE Tree-Standalone-Anwendung findet portable ausführbare Dateien in Dateien, Ordnern und ZIP-Archiven.

Direkt von GitHub installieren mit einer neuen virtuellen Umgebung und pip:
> 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
Das Repository klonen und für die Entwicklung einrichten:
> 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 ausführen und nach portablen ausführbaren Dateien in Dateien, Ordnern und ZIP-Archiven suchen:
$ pe-tree -h
usage: pe-tree [-h] [filenames [filenames ...]]
PE-Tree
positional arguments:
filenames Pfad(e) zu Datei/Ordner/ZIP
optional arguments:
-h, --help show this help message and exit
PE Tree ausführen und versuchen, portable ausführbare Dateien aus einer Binärdatei zu carven:
$ pe-tree-carve -h
usage: pe-tree-carve [-h] filename
PE-Tree (Carve)
positional arguments:
filename Pfad zur Datei zum Carven
optional arguments:
-h, --help show this help message and exit
Der Dark-Modus kann durch die Installation von QDarkStyle aktiviert werden:
$ pip install qdarkstyle
Das PE Tree-IDAPython-Plugin findet portable ausführbare Dateien in IDA-Datenbanken.

Um als IDAPython-Plugin zu installieren und auszuführen, können Sie entweder setuptools verwenden oder manuell installieren.
Laden Sie pe_tree herunter und installieren Sie es für den globalen Python-Interpreter, der von IDA verwendet wird:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python setup.py develop --ida
Kopieren Sie pe_tree_ida.py in Ihren IDA-Plugins-Ordner
Laden Sie pe_tree herunter und installieren Sie die Anforderungen für den globalen Python-Interpreter, der von IDA verwendet wird:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ pip install -r requirements.txt
Kopieren Sie pe_tree_ida.py und den Inhalt von ./pe_tree/ in Ihren IDA-Plugins-Ordner
Um auf die Installation als Plugin zu verzichten und das Skript einfach unter IDA auszuführen, installieren Sie zuerst die Paketanforderungen für die globale Python-Installation:
$ pip install -r requirements.txt
Führen Sie dann pe_tree_ida.py unter IDA aus:
Datei -> Skriptdatei... -> pe_tree_ida.py -> Öffnen
| OS | Plugins-Ordner |
|---|---|
| Windows | %ProgramFiles%\IDA Pro 7.X\plugins |
| Linux | /opt/ida-7.X/plugins |
| Mac | ~/.idapro/plugins |
Starten Sie IDA Pro und disassemblieren Sie eine PE-Datei (wählen Sie für beste Ergebnisse immer Manuelles Laden und Ressourcen laden!)
Laden Sie das PE Tree-Plugin:
Bearbeiten -> Plugins -> PE Tree
Im Folgenden sind die grundlegenden Schritte zum Auslagern einer gepackten PE-Datei (z. B. MPRESS oder UPX) und zum Rekonstruieren der Importe (unter der Annahme, dass Image-Base/Einsprungspunkt einigermaßen standardmäßig sind):
Starten Sie IDA Pro und disassemblieren Sie eine mit MPRESS oder UPX gepackte PE-Datei (wählen Sie Manuelles Laden und Ressourcen laden)
Wählen Sie einen Debugger (Windows oder Bochs) und führen Sie ihn bis zum OEP aus (normalerweise 0x00401000, aber nicht immer!)
An diesem Punkt können Sie einen Speicher-Snapshot erstellen (alle Segmente speichern) und die IDB für später speichern
Stellen Sie sicher, dass IDA den gesamten Code gefunden hat:
Optionen -> Allgemein -> Analyse -> Programm erneut analysieren
Öffnen Sie das PE Tree-IDAPython-Plugin, klicken Sie mit der rechten Maustaste in das rechte Fenster und wählen Sie:
PE hinzufügen -> IDB durchsuchen
Dadurch wird die IDB nach MZ/PE-Headern durchsucht und alle gefundenen Module angezeigt.
Klicken Sie mit der rechten Maustaste auf HEADER-0x00400000 (oder den entsprechenden Modulnamen) und wählen Sie Auslagern...
Geben Sie die AddressOfEntryPoint an (normalerweise 0x1000, aber auch hier nicht immer!)
Stellen Sie sicher, dass IDT/IAT neu aufbauen ausgewählt ist
Auslagern!
Eine neue ausführbare Datei wird unter Verwendung der aus dem Speicher/IDB entpackten Abschnittsdaten erstellt, während ein neuer Abschnitt namens .pe_tree, der die neu aufgebaute IAT, Hinweisanmentabelle und IDT enthält, an die PE-Datei angehängt wird (ähnlich wie ein .idata-Abschnitt).
Wenn der Speichersegment des Einsprungspunkts während der Ausführung als beschreibbar markiert wurde (z. B. über VirtualProtect), werden die Attribute des Einsprungspunkt-Abschnitts ebenfalls als beschreibbar markiert.
Schließlich werden die Datenverzeichnisse BASERELOC, BOUND_IMPORT und SECURITY auf null gesetzt und die OPTIONAL_HEADER-Prüfsumme neu berechnet (falls angegeben).
Mit dem obigen Ansatz ist es möglich, viele PE-Dateien im Speicher auszulagern, die entweder entpackt, injiziert, reflektiv geladen oder ausgehöhlt wurden usw.
Das PE Tree-Rekall-Plugin findet portable ausführbare Dateien in Windows-Speicherabbildern.

Rekall ausführen und aktive Prozesse, DLLs und Treiber auf einem Live-System anzeigen:
$ rekall --live Memory
[1] Live (Memory) 00:00:00> run -i pe_tree_rekall.py
Alternativ Rekall/PE Tree gegen ein vorhandenes Speicherabbild ausführen:
$rekall -f memory.vmem
[1] memory.vmem 00:00:00> run -i pe_tree_rekall.py
Das PE Tree-Volatility-Plugin findet portable ausführbare Dateien in Windows-Speicherabbildern.

$ pe-tree-vol -h
usage: pe-tree-vol [-h] filename
PE-Tree (Volatility)
positional arguments:
filename Pfad zum Speicherabbild
optional arguments:
-h, --help show this help message and exit
Das PE Tree-Ghidra-Plugin findet portable ausführbare Dateien in Ghidra-Datenbanken.

$ 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 (Standard: 127.0.0.1)
--port PORT Ghidra Bridge-Server-Port (Standard: 4768)
Das PE Tree-Minidump-Plugin findet portable ausführbare Dateien in Windows-Minidumps.

pip install minidump)$ pe-tree-minidump -h
usage: pe-tree-minidump [-h] filename
PE-Tree (Minidump)
positional arguments:
filename Pfad zur .dmp-Datei
optional arguments:
-h, --help show this help message and exit
Die Konfiguration wird in einer INI-Datei gespeichert und standardmäßig mit den folgenden Werten belegt:
[config]
debug = False
fonts = Consolas,Monospace,Courier
passwords = ,infected
virustotal_url = https://www.virustotal.com/gui/search
cyberchef_url = https://gchq.github.io/CyberChef
Die folgenden Informationen werden unter den angegebenen Bedingungen an Drittanbieter-Webanwendungen weitergegeben (je nach Konfiguration):
Wenn die VirusTotal-URL in der Konfiguration angegeben ist, werden Metadaten wie Datei-Hashes, Zeitstempel usw. an VirusTotal zur Verarbeitung gesendet, wenn der Benutzer auf hervorgehobene Links klickt oder „VirusTotal-Suche“ aus dem Kontextmenü (rechte Maustaste) auswählt.
Wenn die CyberChef-URL in der Konfiguration vorhanden ist, werden alle Dateidaten base64-kodiert und an CyberChef zur Verarbeitung gesendet, wenn der Benutzer „CyberChef“ aus dem Kontextmenü (rechte Maustaste) auswählt.
oder
Versuchen Sie, pip auf Version 20.0+ zu aktualisieren:
$ pip install --upgrade pip
Versuchen Sie, PyQt5 wie folgt zu deinstallieren und neu zu installieren:
pip uninstall PyQt5
pip uninstall PyQt5-sip
pip install PyQt5 PyQt5-sip
Stellen Sie sicher, dass IDA den gesamten Code gefunden und disassembliert hat:
Optionen -> Allgemein -> Analyse -> Programm erneut analysieren
Nachdem dies abgeschlossen ist, versuchen Sie erneut, die Importe auszulagern/neu aufzubauen.
Fühlen Sie sich frei, einen Beitrag zu leisten! Issues und Pull-Requests sind sehr willkommen.
So erstellen Sie die Dokumentation aus dem Quellcode mit Sphinx:
$ pip install sphinx
$ sphinx-apidoc -o ./doc/source/ .
$ sphinx-build -b html ./doc/source ./doc/build -E
Um die Dokumentation anzusehen, öffnen Sie ./doc/build/index.html in einem Webbrowser.
Tom Bonner - tombonner - @thomas_bonner
PE Tree wird unter der Apache-Lizenz vertrieben. Weitere Informationen finden Sie in der LIZENZ-Datei.
| Abschnitt | Option | Typ | Beschreibung |
|---|
| config | debug | boolean | Gibt pefile.dump() auf der Ausgabe aus |
| config | fonts | string | Kommagetrennte Liste von Schriftartnamen für die UI |
| config | passwords | string | Kommagetrennte Liste von ZIP-Dateipasswörtern |
| config | virustotal_url | string | VirusTotal-Such-URL |
| config | cyberchef_url | string | CyberChef-URL |
| Typ | OS | Pfad |
|---|
| Anwendung | Windows | %TEMP%\pe_tree.ini |
| Anwendung | 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 |
| Carve | Windows | %TEMP%\pe_tree_carve.ini |
| Carve | Linux/Mac | /tmp/pe_tree_carve.ini |