
Módulo de Python para ver archivos Portable Executable (PE) en una vista de árbol usando pefile y PyQt5. También puede usarse con IDA Pro y Rekall para volcar archivos PE en memoria y reconstruir importaciones.
PE Tree es un módulo de Python para visualizar archivos Portable Executable (PE) en una vista de árbol usando pefile y PyQt5. También se puede usar con IDA Pro, Ghidra, Volatility, Rekall y minidump para ver y volcar archivos PE en memoria, así como realizar reconstrucción de tablas de importación.
La aplicación independiente PE Tree encuentra ejecutables portables en archivos, carpetas y archivos ZIP.

Instale directamente desde GitHub usando un entorno virtual limpio y 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
Clone el repositorio de Git y prepare el entorno para desarrollo:
> 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 .
Ejecute PE Tree y escanee en busca de ejecutables portables en archivos, carpetas y archivos 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
Ejecute PE Tree e intente extraer (carve) archivos ejecutables portables de un archivo 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
El modo oscuro se puede activar instalando QDarkStyle:
$ pip install qdarkstyle
El complemento IDAPython de PE Tree encuentra ejecutables portables en bases de datos de IDA.

Para instalar y ejecutar como complemento de IDAPython, puede usar setuptools o instalar manualmente.
Descargue pe_tree e instálelo para el intérprete de Python global utilizado por IDA:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python setup.py develop --ida
Copie pe_tree_ida.py a su carpeta de complementos de IDA
Descargue pe_tree e instale los requisitos para el intérprete de Python global utilizado por IDA:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ pip install -r requirements.txt
Copie pe_tree_ida.py y el contenido de ./pe_tree/ a su carpeta de complementos de IDA
Para evitar instalar como complemento y simplemente ejecutar como script en IDA, instale primero los requisitos del paquete pe_tree para la instalación de Python global:
$ pip install -r requirements.txt
Luego ejecute pe_tree_ida.py en IDA:
File -> Script file... -> pe_tree_ida.py -> Open
| SO | Carpeta de complementos |
|---|---|
| Windows | %ProgramFiles%\IDA Pro 7.X\plugins |
| Linux | /opt/ida-7.X/plugins |
| Mac | ~/.idapro/plugins |
Inicie IDA Pro y desensamble un archivo PE (¡seleccione siempre Manual Load y Load Resources para mejores resultados!)
Cargue el complemento PE Tree:
Edit -> Plugins -> PE Tree
A continuación se muestran los pasos básicos para volcar un archivo PE empaquetado (por ejemplo MPRESS o UPX) y reconstruir las importaciones (asumiendo que la base de imagen/punto de entrada es bastante estándar):
Inicie IDA Pro y desensamble un archivo PE empaquetado con MPRESS o UPX (seleccione Manual Load y Load Resources)
Seleccione un depurador (Windows o Bochs) y ejecute hasta OEP (normalmente 0x00401000, ¡pero no siempre!)
En este punto, podría tomar una instantánea de la memoria (guardando todos los segmentos) y guardar la IDB para más tarde
Asegúrese de que IDA haya encontrado todo el código:
Options -> General -> Analysis -> Reanalyze program
Abra el complemento IDAPython de PE Tree, haga clic derecho en el panel derecho y seleccione:
Add PE -> Search IDB
Esto escaneará la IDB en busca de encabezados MZ/PE y mostrará cualquier módulo que encuentre.
Haga clic derecho en HEADER-0x00400000 (o el nombre de módulo apropiado) y seleccione Dump...
Especifique el AddressOfEntryPoint (típicamente 0x1000, ¡pero de nuevo, no siempre!)
Asegúrese de que Rebuild IDT/IAT esté seleccionado
¡Vuelque!
Se creará un nuevo ejecutable utilizando los datos de las secciones desempaquetadas obtenidas de la memoria/IDB, mientras que una nueva sección llamada .pe_tree que contiene la IAT reconstruida, la tabla de nombres de sugerencia (hint name table) y la IDT se añadirá al archivo PE (muy similar a una sección .idata).
Si el segmento de memoria del punto de entrada se ha marcado como escribible durante la ejecución (a través de VirtualProtect, por ejemplo), las características de la sección del punto de entrada también se marcarán como escribibles.
Finalmente, los directorios de datos BASERELOC, BOUND_IMPORT y SECURITY se marcan como nulos, y la suma de comprobación del OPTIONAL_HEADER se recalcula (si se especifica).
Usando el enfoque anterior, es posible volcar muchos archivos PE en memoria que hayan sido desempaquetados, inyectados, cargados de forma reflectante o vaciados, etc.
El complemento Rekall de PE Tree encuentra ejecutables portables en volcados de memoria de Windows.

Ejecute Rekall y vea procesos activos, DLLs y controladores en un sistema en vivo:
$ rekall --live Memory
[1] Live (Memory) 00:00:00> run -i pe_tree_rekall.py
Alternativamente, ejecute Rekall/PE Tree contra un volcado de memoria existente:
$rekall -f memory.vmem
[1] memory.vmem 00:00:00> run -i pe_tree_rekall.py
El complemento Volatility de PE Tree encuentra ejecutables portables en volcados de memoria de 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
El complemento Ghidra de PE Tree encuentra ejecutables portables en bases de datos de 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)
El complemento Minidump de PE Tree encuentra ejecutables portables en Minidumps de 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 configuración se almacena en un archivo INI y tiene como valores predeterminados los siguientes:
[config]
debug = False
fonts = Consolas,Monospace,Courier
passwords = ,infected
virustotal_url = https://www.virustotal.com/gui/search
cyberchef_url = https://gchq.github.io/CyberChef
La siguiente información se compartirá con aplicaciones web de terceros (según la configuración) bajo las siguientes condiciones:
Si la URL de VirusTotal está especificada en la configuración, metadatos como hashes de archivo, marcas de tiempo, etc., se enviarán a VirusTotal para su procesamiento cuando el usuario haga clic en enlaces resaltados o seleccione "VirusTotal search" en el menú contextual del botón derecho.
Si la URL de CyberChef está presente en la configuración, cualquier dato de archivo se codificará en base64 y se enviará a CyberChef para su procesamiento cuando el usuario seleccione "CyberChef" en el menú contextual del botón derecho.
o
Intente actualizar pip a la versión 20.0+:
$ pip install --upgrade pip
Intente desinstalar y reinstalar PyQt5 de la siguiente manera:
pip uninstall PyQt5
pip uninstall PyQt5-sip
pip install PyQt5 PyQt5-sip
Asegúrese de que IDA haya encontrado y desensamblado todo el código:
Options -> General -> Analysis -> Reanalyze program
Después de que esto se complete, intente volcar/reconstruir las importaciones nuevamente.
¡Siéntase libre de contribuir! Las incidencias y las solicitudes de extracción (pull requests) son muy bienvenidas.
Para generar la documentación desde el código fuente usando Sphinx:
$ pip install sphinx
$ sphinx-apidoc -o ./doc/source/ .
$ sphinx-build -b html ./doc/source ./doc/build -E
Para ver la documentación, abra ./doc/build/index.html en un navegador web.
Tom Bonner - tombonner - @thomas_bonner
PE Tree se distribuye bajo la Licencia Apache. Consulte LICENSE para obtener más información.
| Sección | Opción | Tipo | Descripción |
|---|
| config | debug | boolean | Imprime pefile.dump() en la salida |
| config | fonts | string | Lista separada por comas de nombres de fuentes para la UI |
| config | passwords | string | Lista separada por comas de contraseñas de archivos ZIP |
| config | virustotal_url | string | URL de búsqueda de VirusTotal |
| config | cyberchef_url | string | URL de CyberChef |
| Tipo | SO | Ruta |
|---|
| Aplicación | Windows | %TEMP%\pe_tree.ini |
| Aplicación | 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 |