
Módulo Python para visualizar arquivos Portable Executable (PE) em uma visualização em árvore usando pefile e PyQt5. Também pode ser usado com IDA Pro e Rekall para despejar arquivos PE em memória e reconstruir importações.
O PE Tree é um módulo Python para visualizar arquivos Portable Executable (PE) em uma exibição em árvore usando pefile e PyQt5. Também pode ser usado com IDA Pro, Ghidra, Volatility, Rekall e minidump para visualizar e despejar arquivos PE na memória, bem como realizar a reconstrução da tabela de importação.
O aplicativo independente PE Tree encontra executáveis portáteis em arquivos, pastas e arquivos ZIP.

Instale diretamente do GitHub usando um ambiente virtual novo 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
Clone o repositório do Git e configure para desenvolvimento:
> 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 .
Execute o PE Tree e escaneie arquivos executáveis portáteis em arquivos, pastas e arquivos 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
Execute o PE Tree e tente escavar arquivos executáveis portáteis a partir de um arquivo binário:
$ 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
O Modo escuro pode ser ativado instalando o QDarkStyle:
$ pip install qdarkstyle
O plugin IDAPython do PE Tree encontra executáveis portáteis em bancos de dados do IDA.

Para instalar e executar como um plugin IDAPython, você pode usar setuptools ou instalar manualmente.
Baixe o pe_tree e instale para o interpretador Python global usado pelo IDA:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python setup.py develop --ida
Copie pe_tree_ida.py para sua pasta de plugins do IDA
Baixe o pe_tree e instale os requisitos para o interpretador Python global usado pelo IDA:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ pip install -r requirements.txt
Copie pe_tree_ida.py e o conteúdo de ./pe_tree/ para sua pasta de plugins do IDA
Para dispensar a instalação como plugin e simplesmente executar como script no IDA, primeiro instale os requisitos do pacote pe_tree para a instalação Python global:
$ pip install -r requirements.txt
Em seguida, execute pe_tree_ida.py no IDA:
File -> Script file... -> pe_tree_ida.py -> Open
| SO | Pasta de plugins |
|---|---|
| Windows | %ProgramFiles%\IDA Pro 7.X\plugins |
| Linux | /opt/ida-7.X/plugins |
| Mac | ~/.idapro/plugins |
Inicie o IDA Pro e desmonte um arquivo PE (sempre selecione Manual Load e Load Resources para melhores resultados!)
Carregue o plugin PE Tree:
Edit -> Plugins -> PE Tree
Abaixo estão os passos básicos para despejar um arquivo PE empacotado (por exemplo MPRESS ou UPX) e reconstruir importações (assumindo que a base da imagem/ponto de entrada seja bastante padrão):
Inicie o IDA Pro e desmonte um arquivo PE empacotado com MPRESS ou UPX (selecione Manual Load e Load Resources)
Selecione um depurador (Windows ou Bochs) e execute até o OEP (geralmente 0x00401000, mas nem sempre!)
Neste ponto, você poderia tirar um snapshot de memória (salvando todos os segmentos) e salvar o IDB para uso posterior
Certifique-se de que o IDA encontrou todo o código:
Options -> General -> Analysis -> Reanalyze program
Abra o plugin IDAPython do PE Tree, clique com o botão direito no painel direito e selecione:
Add PE -> Search IDB
Isso irá escanear o IDB em busca de cabeçalhos MZ/PE e exibir quaisquer módulos encontrados.
Clique com o botão direito em HEADER-0x00400000 (ou no nome apropriado do módulo) e selecione Dump...
Especifique o AddressOfEntryPoint (tipicamente 0x1000, mas novamente, nem sempre!)
Certifique-se de que Rebuild IDT/IAT está selecionado
Despeje!
Um novo executável será criado usando os dados das seções desempacotadas obtidos da memória/IDB, enquanto uma nova seção chamada .pe_tree contendo a IAT reconstruída, a tabela de nomes de dica e a IDT será anexada ao arquivo PE (muito parecido com uma seção .idata).
Se o segmento de memória do ponto de entrada foi marcado como gravável durante a execução (via VirtualProtect, por exemplo), então as características da seção do ponto de entrada também serão marcadas como graváveis.
Finalmente, os diretórios de dados BASERELOC, BOUND_IMPORT e SECURITY são marcados como nulos, e o checksum do OPTIONAL_HEADER é recalculado (se especificado).
Usando a abordagem acima, é possível despejar muitos arquivos PE na memória que foram desempacotados, injetados, carregados reflexivamente ou ocos, etc.
O plugin Rekall do PE Tree encontra executáveis portáteis em dumps de memória do Windows.

Execute o Rekall e visualize processos ativos, DLLs e drivers em um sistema ativo:
$ rekall --live Memory
[1] Live (Memory) 00:00:00> run -i pe_tree_rekall.py
Alternativamente, execute Rekall/PE Tree contra um dump de memória existente:
$rekall -f memory.vmem
[1] memory.vmem 00:00:00> run -i pe_tree_rekall.py
O plugin Volatility do PE Tree encontra executáveis portáteis em dumps de memória do 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
O plugin Ghidra do PE Tree encontra executáveis portáteis em bancos de dados do 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)
O plugin Minidump do PE Tree encontra executáveis portáteis em Minidumps do 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
A configuração é armazenada em um arquivo INI e tem como padrão os seguintes valores:
[config]
debug = False
fonts = Consolas,Monospace,Courier
passwords = ,infected
virustotal_url = https://www.virustotal.com/gui/search
cyberchef_url = https://gchq.github.io/CyberChef
As seguintes informações serão compartilhadas com aplicações web de terceiros (dependendo da configuração) sob as seguintes condições:
Se a URL do VirusTotal estiver especificada na configuração, metadados como hashes de arquivos, carimbos de data/hora, etc., serão enviados ao VirusTotal para processamento quando o usuário clicar em links destacados ou selecionar "Pesquisar no VirusTotal" no menu de contexto com clique direito.
Se a URL do CyberChef estiver presente na configuração, quaisquer dados de arquivo serão codificados em base64 e enviados ao CyberChef para processamento quando o usuário selecionar "CyberChef" no menu de contexto com clique direito.
ou
Tente atualizar o pip para a versão 20.0+:
$ pip install --upgrade pip
Tente desinstalar e reinstalar o PyQt5 da seguinte forma:
pip uninstall PyQt5
pip uninstall PyQt5-sip
pip install PyQt5 PyQt5-sip
Certifique-se de que o IDA encontrou e desmontou todo o código:
Options -> General -> Analysis -> Reanalyze program
Depois que isso for concluído, tente despejar/reconstruir as importações novamente.
Sinta-se à vontade para contribuir! Issues e pull requests são muito bem-vindos.
Para construir a documentação a partir do código-fonte usando Sphinx:
$ pip install sphinx
$ sphinx-apidoc -o ./doc/source/ .
$ sphinx-build -b html ./doc/source ./doc/build -E
Para visualizar a documentação, abra ./doc/build/index.html em um navegador web.
Tom Bonner - tombonner - @thomas_bonner
O PE Tree é distribuído sob a Licença Apache. Consulte LICENSE para mais informações.
| Seção | Opção | Tipo | Descrição |
|---|
| config | debug | boolean | Imprimir pefile.dump() na saída |
| config | fonts | string | Lista separada por vírgulas de nomes de fontes para UI |
| config | passwords | string | Lista separada por vírgulas de senhas de arquivos ZIP |
| config | virustotal_url | string | URL de busca do VirusTotal |
| config | cyberchef_url | string | URL do CyberChef |
| Tipo | SO | Caminho |
|---|
| Aplicação | Windows | %TEMP%\pe_tree.ini |
| Aplicação | 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 |