
Module Python pour visualiser les fichiers Portable Executable (PE) dans une vue arborescente en utilisant pefile et PyQt5. Peut également être utilisé avec IDA Pro et Rekall pour extraire les fichiers PE en mémoire et reconstruire les importations.
PE Tree est un module Python permettant d'afficher les fichier Portable Executable (PE) dans une arborescence à l'aide de pefile et PyQt5. Il peut également être utilisé avec IDA Pro, Ghidra, Volatility, Rekall et minidump pour visualiser et extraire des fichiers PE en mémoire, ainsi que pour reconstruire la table d'importation.
L'application autonome PE Tree trouve les exécutables portables dans les fichiers, dossiers et archives ZIP.

Installez directement depuis GitHub en utilisant un environnement virtuel frais et 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
Clonez le dépôt Git et préparez-le pour le développement :
> 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 .
Lancez PE Tree et analysez les fichiers, dossiers et archives ZIP à la recherche d'exécutables portables :
$ pe-tree -h
usage: pe-tree [-h] [filenames [filenames ...]]
PE-Tree
positional arguments:
filenames Chemin(s) vers fichier/dossier/zip
optional arguments:
-h, --help affiche ce message d'aide et quitte
Lancez PE Tree et tentez de carver des fichiers exécutables portables à partir d'un fichier binaire :
$ pe-tree-carve -h
usage: pe-tree-carve [-h] filename
PE-Tree (Carve)
positional arguments:
filename Chemin vers le fichier à carver
optional arguments:
-h, --help affiche ce message d'aide et quitte
Le mode sombre peut être activé en installant QDarkStyle :
$ pip install qdarkstyle
Le plugin IDAPython PE Tree trouve les exécutables portables dans les bases de données IDA.

Pour installer et exécuter en tant que plugin IDAPython, vous pouvez utiliser setuptools ou installer manuellement.
Téléchargez pe_tree et installez-le pour l'interpréteur Python global utilisé par IDA :
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python setup.py develop --ida
Copiez pe_tree_ida.py dans votre dossier de plugins IDA
Téléchargez pe_tree et installez les dépendances pour l'interpréteur Python global utilisé par IDA :
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ pip install -r requirements.txt
Copiez pe_tree_ida.py et le contenu de ./pe_tree/ dans votre dossier de plugins IDA
Pour éviter d'installer comme plugin et simplement exécuter comme script sous IDA, installez d'abord les dépendances du paquet pe_tree pour l'installation Python globale :
$ pip install -r requirements.txt
Exécutez ensuite pe_tree_ida.py sous IDA :
File -> Script file... -> pe_tree_ida.py -> Open
| OS | Dossier de plugins |
|---|---|
| Windows | %ProgramFiles%\IDA Pro 7.X\plugins |
| Linux | /opt/ida-7.X/plugins |
| Mac | ~/.idapro/plugins |
Lancez IDA Pro et désassemblez un fichier PE (sélectionnez toujours Manual Load et Load Resources pour de meilleurs résultats !)
Chargez le plugin PE Tree :
Edit -> Plugins -> PE Tree
Voici les étapes de base pour extraire un fichier PE packé (par exemple MPRESS ou UPX) et reconstruire les importations (en supposant que l'image de base/point d'entrée est assez standard) :
Lancez IDA Pro et désassemblez un fichier PE packé MPRESS ou UPX (sélectionnez Manual Load et Load Resources)
Sélectionnez un débogueur (Windows ou Bochs) et exécutez jusqu'à l'OEP (généralement 0x00401000, mais pas toujours !)
À ce stade, vous pouvez prendre un instantané mémoire (en sauvegardant tous les segments) et sauvegarder l'IDB pour plus tard
Assurez-vous qu'IDA a trouvé tout le code :
Options -> General -> Analysis -> Reanalyze program
Ouvrez le plugin IDAPython PE Tree, faites un clic droit dans le panneau de droite et sélectionnez :
Add PE -> Search IDB
Cela analysera l'IDB à la recherche d'en-têtes MZ/PE et affichera tous les modules trouvés.
Faites un clic droit sur HEADER-0x00400000 (ou le nom de module approprié) et sélectionnez Dump...
Spécifiez le AddressOfEntryPoint (généralement 0x1000, mais encore une fois, pas toujours !)
Assurez-vous que Rebuild IDT/IAT est sélectionné
Extrayez !
Un nouvel exécutable sera créé en utilisant les données de section dépaquetées obtenues depuis la mémoire/IDB, tandis qu'une nouvelle section nommée .pe_tree contenant l'IAT reconstruite, la table des noms d'indication et l'IDT sera ajoutée au fichier PE (un peu comme une section .idata).
Si le segment mémoire du point d'entrée a été marqué comme accessible en écriture pendant l'exécution (via VirtualProtect par exemple), alors les caractéristiques de la section du point d'entrée seront également marquées comme accessibles en écriture.
Enfin, les répertoires de données BASERELOC, BOUND_IMPORT et SECURITY sont marqués nuls, et la somme de contrôle OPTIONAL_HEADER est recalculée (si spécifié).
En utilisant l'approche ci-dessus, il est possible d'extraire de nombreux fichiers PE en mémoire qui ont été dépaquetés, injectés, chargés de manière réflexive ou évidés, etc.
Le plugin Rekall PE Tree trouve les exécutables portables dans les dumps mémoire Windows.

Lancez Rekall et visualisez les processus actifs, DLL et pilotes sur un système actif :
$ rekall --live Memory
[1] Live (Memory) 00:00:00> run -i pe_tree_rekall.py
Alternativement, lancez Rekall/PE Tree sur un dump mémoire existant :
$rekall -f memory.vmem
[1] memory.vmem 00:00:00> run -i pe_tree_rekall.py
Le plugin Volatility PE Tree trouve les exécutables portables dans les dumps mémoire Windows.

$ pe-tree-vol -h
usage: pe-tree-vol [-h] filename
PE-Tree (Volatility)
positional arguments:
filename Chemin vers le dump mémoire
optional arguments:
-h, --help affiche ce message d'aide et quitte
Le plugin Ghidra PE Tree trouve les exécutables portables dans les bases de données Ghidra.

$ pe-tree-ghidra -h
usage: pe-tree-ghidra [-h] [--server SERVER] [--port PORT]
PE-Tree (Ghidra)
optional arguments:
-h, --help affiche ce message d'aide et quitte
--server SERVER IP du serveur Ghidra bridge (défaut : 127.0.0.1)
--port PORT Port du serveur Ghidra bridge (défaut : 4768)
Le plugin Minidump PE Tree trouve les exécutables portables dans les Minidumps Windows.

pip install minidump)$ pe-tree-minidump -h
usage: pe-tree-minidump [-h] filename
PE-Tree (Minidump)
positional arguments:
filename Chemin vers le fichier .dmp
optional arguments:
-h, --help affiche ce message d'aide et quitte
La configuration est stockée dans un fichier INI et prend par défaut les valeurs suivantes :
[config]
debug = False
fonts = Consolas,Monospace,Courier
passwords = ,infected
virustotal_url = https://www.virustotal.com/gui/search
cyberchef_url = https://gchq.github.io/CyberChef
Les informations suivantes seront partagées avec des applications web tierces (selon la configuration) dans les conditions suivantes :
Si l'URL VirusTotal est spécifiée dans la configuration, des métadonnées telles que les empreintes de fichiers, les horodatages, etc. seront envoyées à VirusTotal pour traitement lorsque l'utilisateur clique sur des liens en surbrillance ou sélectionne "VirusTotal search" dans le menu contextuel du clic droit.
Si l'URL CyberChef est présente dans la configuration, toutes les données de fichier seront encodées en base64 et envoyées à CyberChef pour traitement lorsque l'utilisateur sélectionne "CyberChef" dans le menu contextuel du clic droit.
ou
Essayez de mettre à niveau pip vers la version 20.0+ :
$ pip install --upgrade pip
Essayez de désinstaller puis réinstaller PyQt5 comme suit :
pip uninstall PyQt5
pip uninstall PyQt5-sip
pip install PyQt5 PyQt5-sip
Assurez-vous qu'IDA a trouvé et désassemblé tout le code :
Options -> General -> Analysis -> Reanalyze program
Une fois cela fait, essayez à nouveau d'extraire/reconstruire les importations.
N'hésitez pas à contribuer ! Les problèmes et les demandes de tirage sont les bienvenus.
Pour générer la documentation à partir des sources avec Sphinx :
$ pip install sphinx
$ sphinx-apidoc -o ./doc/source/ .
$ sphinx-build -b html ./doc/source ./doc/build -E
Pour consulter la documentation, ouvrez ./doc/build/index.html dans un navigateur web.
Tom Bonner - tombonner - @thomas_bonner
PE Tree est distribué sous la licence Apache. Voir LICENSE pour plus d'informations.
| Section | Option | Type | Description |
|---|
| config | debug | booléen | Afficher pefile.dump() dans la sortie |
| config | fonts | chaîne | Liste séparée par des virgules des noms de police pour l'interface |
| config | passwords | chaîne | Liste séparée par des virgules des mots de passe ZIP |
| config | virustotal_url | chaîne | URL de recherche VirusTotal |
| config | cyberchef_url | chaîne | URL de CyberChef |
| Type | OS | Chemin |
|---|
| Application | Windows | %TEMP%\pe_tree.ini |
| Application | 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 |