
Modulo Python per visualizzare i file Portable Executable (PE) in una vista ad albero utilizzando pefile e PyQt5. Può anche essere utilizzato con IDA Pro e Rekall per eseguire il dump di file PE in memoria e ricostruire gli import.
PE Tree è un modulo Python per visualizzare i file Portable Executable (PE) in una vista ad albero utilizzando pefile e PyQt5. Può anche essere utilizzato con IDA Pro, Ghidra, Volatility, Rekall e minidump per visualizzare e scaricare file PE in memoria, nonché per eseguire la ricostruzione della tabella delle importazioni.
L'app autonoma PE Tree trova eseguibili portatili in file, cartelle e archivi ZIP.

Installa direttamente da GitHub usando un ambiente virtuale nuovo e 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
Clona il repository e configura per lo sviluppo:
> 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 .
Esegui PE Tree e scansiona file, cartelle e archivi ZIP per eseguibili portatili:
$ 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
Esegui PE Tree e tenta di effettuare il carving di file eseguibili portatili da un file binario:
$ 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
La modalità scura può essere abilitata installando QDarkStyle:
$ pip install qdarkstyle
Il plugin IDAPython di PE Tree trova eseguibili portatili nei database IDA.

Per installare ed eseguire come plugin IDAPython puoi usare setuptools o installare manualmente.
Scarica pe_tree e installa per l'interprete Python globale usato da IDA:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python setup.py develop --ida
Copia pe_tree_ida.py nella tua cartella dei plugin IDA
Scarica pe_tree e installa i requisiti per l'interprete Python globale usato da IDA:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ pip install -r requirements.txt
Copia pe_tree_ida.py e il contenuto di ./pe_tree/ nella tua cartella dei plugin IDA
Per evitare di installare come plugin ed eseguire semplicemente come script sotto IDA, installa prima i requisiti del pacchetto pe_tree per l'installazione Python globale:
$ pip install -r requirements.txt
Poi esegui pe_tree_ida.py sotto IDA:
File -> Script file... -> pe_tree_ida.py -> Open
| Sistema operativo | Cartella dei plugin |
|---|---|
| Windows | %ProgramFiles%\IDA Pro 7.X\plugins |
| Linux | /opt/ida-7.X/plugins |
| Mac | ~/.idapro/plugins |
Avvia IDA Pro e disassembla un file PE (seleziona sempre Manual Load e Load Resources per risultati ottimali!)
Carica il plugin PE Tree:
Edit -> Plugins -> PE Tree
Di seguito i passaggi base per scaricare un file PE impacchettato (ad esempio MPRESS o UPX) e ricostruire le importazioni (supponendo che la base dell'immagine/punto di ingresso sia abbastanza standard):
Avvia IDA Pro e disassembla un file PE impacchettato con MPRESS o UPX (seleziona Manual Load e Load Resources)
Seleziona un debugger (Windows o Bochs) ed esegui fino all'OEP (di solito 0x00401000, ma non sempre!)
A questo punto puoi fare un'istantanea della memoria (salvando tutti i segmenti) e salvare l'IDB per dopo
Assicurati che IDA abbia trovato tutto il codice:
Options -> General -> Analysis -> Reanalyze program
Apri il plugin IDAPython di PE Tree, fai clic destro nel riquadro destro e seleziona:
Add PE -> Search IDB
Questo scansionerà l'IDB alla ricerca di intestazioni MZ/PE e mostrerà eventuali moduli trovati.
Fai clic destro su HEADER-0x00400000 (o sul nome del modulo appropriato) e seleziona Dump...
Specifica AddressOfEntryPoint (in genere 0x1000, ma di nuovo non sempre!)
Assicurati che Rebuild IDT/IAT sia selezionato
Scarica!
Verrà creato un nuovo eseguibile utilizzando i dati delle sezioni decompresse ottenuti dalla memoria/IDB, mentre una nuova sezione denominata .pe_tree contenente l'IAT ricostruito, la tabella dei nomi degli hint e la IDT verrà aggiunta al file PE (molto simile a una sezione .idata).
Se il segmento di memoria del punto di ingresso è stato contrassegnato come scrivibile durante l'esecuzione (ad esempio tramite VirtualProtect), anche le caratteristiche della sezione del punto di ingresso verranno contrassegnate come scrivibili.
Infine, le directory dati BASERELOC, BOUND_IMPORT e SECURITY vengono contrassegnate come nulle, e il checksum OPTIONAL_HEADER viene ricalcolato (se specificato).
Utilizzando l'approccio sopra descritto è possibile scaricare molti file PE in memoria che sono stati decompressi, iniettati, caricati in modo riflessivo o svuotati, ecc.
Il plugin Rekall di PE Tree trova eseguibili portatili nei dump di memoria Windows.

Esegui Rekall e visualizza processi attivi, DLL e driver su un sistema live:
$ rekall --live Memory
[1] Live (Memory) 00:00:00> run -i pe_tree_rekall.py
In alternativa, esegui Rekall/PE Tree su un dump di memoria esistente:
$rekall -f memory.vmem
[1] memory.vmem 00:00:00> run -i pe_tree_rekall.py
Il plugin Volatility di PE Tree trova eseguibili portatili nei dump di memoria 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
Il plugin Ghidra di PE Tree trova eseguibili portatili nei database 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)
Il plugin Minidump di PE Tree trova eseguibili portatili nei Minidump Windows.

pip install 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
La configurazione è memorizzata in un file INI e predefinita ai seguenti valori:
[config]
debug = False
fonts = Consolas,Monospace,Courier
passwords = ,infected
virustotal_url = https://www.virustotal.com/gui/search
cyberchef_url = https://gchq.github.io/CyberChef
Le seguenti informazioni verranno condivise con applicazioni web di terze parti (a seconda della configurazione) nelle seguenti condizioni:
Se l'URL di VirusTotal è specificato nella configurazione, metadati come hash di file, timestamp, ecc. verranno inviati a VirusTotal per l'elaborazione quando l'utente fa clic sui collegamenti evidenziati o seleziona "VirusTotal search" dal menu contestuale del tasto destro.
Se l'URL di CyberChef è presente nella configurazione, tutti i dati del file verranno codificati in base64 e inviati a CyberChef per l'elaborazione quando l'utente seleziona "CyberChef" dal menu contestuale del tasto destro.
oppure
Prova ad aggiornare pip alla versione 20.0+:
$ pip install --upgrade pip
Prova a disinstallare e reinstallare PyQt5 come segue:
pip uninstall PyQt5
pip uninstall PyQt5-sip
pip install PyQt5 PyQt5-sip
Assicurati che IDA abbia trovato e disassemblato tutto il codice:
Options -> General -> Analysis -> Reanalyze program
Dopo aver completato questa operazione, prova a scaricare/ricostruire nuovamente le importazioni.
Sentiti libero di contribuire! Issues e pull request sono benvenuti.
Per creare la documentazione dal codice sorgente usando Sphinx:
$ pip install sphinx
$ sphinx-apidoc -o ./doc/source/ .
$ sphinx-build -b html ./doc/source ./doc/build -E
Per visualizzare la documentazione, apri ./doc/build/index.html in un browser web.
Tom Bonner - tombonner - @thomas_bonner
PE Tree è distribuito sotto licenza Apache. Vedi LICENSE per maggiori informazioni.
| Sezione | Opzione | Tipo | Descrizione |
|---|
| config | debug | booleano | Stampa pefile.dump() sull'output |
| config | fonts | stringa | Elenco separato da virgole di nomi di font per l'interfaccia utente |
| config | passwords | stringa | Elenco separato da virgole di password per file ZIP |
| config | virustotal_url | stringa | URL di ricerca VirusTotal |
| config | cyberchef_url | stringa | URL di CyberChef |
| Tipo | Sistema operativo | Percorso |
|---|
| Applicazione | Windows | %TEMP%\pe_tree.ini |
| Applicazione | 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 |
| Carving | Windows | %TEMP%\pe_tree_carve.ini |
| Carving | Linux/Mac | /tmp/pe_tree_carve.ini |