
pefile과 PyQt5를 사용하여 Portable Executable (PE) 파일을 트리 뷰로 볼 수 있는 Python 모듈입니다. IDA Pro 및 Rekall과 함께 사용하여 메모리 내 PE 파일을 덤프하고 임포트를 재구성할 수도 있습니다.
PE Tree는 pefile과 PyQt5를 사용하여 Portable Executable (PE) 파일을 트리 뷰로 보여주는 Python 모듈입니다. 또한 IDA Pro, Ghidra, Volatility, Rekall, minidump와 함께 사용하여 메모리 내 PE 파일을 보고 덤프하며, 임포트 테이블 재구성을 수행할 수 있습니다.
PE Tree 독립형 애플리케이션은 파일, 폴더 및 ZIP 아카이브에서 휴대용 실행 파일을 찾습니다.

새로운 가상 환경에서 pip를 사용하여 GitHub에서 직접 설치:
> 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
Git 클론 및 개발용 설정:
> 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를 실행하고 파일, 폴더 및 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
PE Tree를 실행하고 바이너리 파일에서 휴대용 실행 파일을 카빙 시도:
$ 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
다크 모드는 QDarkStyle 설치로 활성화 가능:
$ pip install qdarkstyle
PE Tree IDAPython 플러그인은 IDA 데이터베이스에서 휴대용 실행 파일을 찾습니다.

IDAPython 플러그인으로 설치 및 실행하려면 setuptools를 사용하거나 수동으로 설치할 수 있습니다.
pe_tree를 다운로드하고 IDA에서 사용하는 전역 Python 인터프리터에 설치:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python setup.py develop --ida
pe_tree를 다운로드하고 IDA에서 사용하는 전역 Python 인터프리터에 요구 사항 설치:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ pip install -r requirements.txt
pe_tree_ida.py 및 ./pe_tree/의 내용을 IDA 플러그인 폴더에 복사
플러그인으로 설치하지 않고 IDA에서 스크립트로 실행하려면 먼저 전역 Python 설치에 pe_tree 패키지 요구 사항을 설치:
$ pip install -r requirements.txt
그런 다음 IDA에서 pe_tree_ida.py 실행:
File -> Script file... -> pe_tree_ida.py -> Open
| OS | 플러그인 폴더 |
|---|---|
| Windows | %ProgramFiles%\IDA Pro 7.X\plugins |
| Linux | /opt/ida-7.X/plugins |
| Mac | ~/.idapro/plugins |
IDA Pro를 실행하고 PE 파일 디스어셈블 (최상의 결과를 위해 항상 Manual Load 및 Load Resources 선택!)
PE Tree 플러그인 로드:
Edit -> Plugins -> PE Tree
다음은 패킹된 PE 파일(예: MPRESS 또는 UPX)을 덤프하고 임포트를 재구성하는 기본 단계입니다 (이미지 베이스/엔트리 포인트가 표준적이라고 가정):
IDA Pro를 실행하고 MPRESS 또는 UPX로 패킹된 PE 파일 디스어셈블 (Manual Load 및 Load Resources 선택)
디버거(Windows 또는 Bochs)를 선택하고 OEP(보통 0x00401000, 항상 그렇지는 않음!)까지 실행
이 시점에서 메모리 스냅샷(모든 세그먼트 저장)을 찍고 나중을 위해 IDB 저장 가능
IDA가 모든 코드를 찾았는지 확인:
Options -> General -> Analysis -> Reanalyze program
PE Tree IDAPython 플러그인 열기, 오른쪽 창에서 마우스 오른쪽 버튼 클릭 후 선택:
Add PE -> Search IDB
IDB에서 MZ/PE 헤더를 스캔하고 찾은 모듈을 표시합니다.
HEADER-0x00400000 (또는 적절한 모듈 이름)에서 마우스 오른쪽 버튼 클릭 후 Dump... 선택
AddressOfEntryPoint 지정 (보통 0x1000, 항상 그렇지는 않음!)
Rebuild IDT/IAT가 선택되었는지 확인
덤프!
메모리/IDB에서 얻은 언패킹된 섹션 데이터를 사용하여 새 실행 파일이 생성되는 동시에, 재구성된 IAT, 힌트 이름 테이블 및 IDT를 포함하는 .pe_tree라는 새 섹션이 PE 파일에 추가됩니다(.idata 섹션과 유사).
만약 실행 중 엔트리 포인트 메모리 세그먼트가 쓰기 가능으로 표시된 경우(예: VirtualProtect 통해), 엔트리 포인트 섹션의 특성도 쓰기 가능으로 표시됩니다.
마지막으로, BASERELOC, BOUND_IMPORT 및 SECURITY 데이터 디렉터리는 null로 표시되고, OPTIONAL_HEADER 체크섬은 (지정된 경우) 재계산됩니다.
위 방법을 사용하면 언패킹되었거나, 인젝션되었거나, 리플렉티브하게 로드되었거나, 할로잉된 등 다양한 메모리 내 PE 파일을 덤프할 수 있습니다.
PE Tree Rekall 플러그인은 Windows 메모리 덤프에서 휴대용 실행 파일을 찾습니다.

Rekall을 실행하고 활성 시스템의 활성 프로세스, DLL 및 드라이버 보기:
$ rekall --live Memory
[1] Live (Memory) 00:00:00> run -i pe_tree_rekall.py
또는 기존 메모리 덤프에 대해 Rekall/PE Tree 실행:
$rekall -f memory.vmem
[1] memory.vmem 00:00:00> run -i pe_tree_rekall.py
PE Tree Volatility 플러그인은 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
PE Tree Ghidra 플러그인은 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)
PE Tree Minidump 플러그인은 Windows 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
설정은 INI 파일에 저장되며 기본값은 다음과 같습니다:
[config]
debug = False
fonts = Consolas,Monospace,Courier
passwords = ,infected
virustotal_url = https://www.virustotal.com/gui/search
cyberchef_url = https://gchq.github.io/CyberChef
다음 정보는 (설정에 따라) 다음 조건에서 타사 웹 애플리케이션과 공유됩니다:
설정에 VirusTotal URL이 지정된 경우, 사용자가 강조 표시된 링크를 클릭하거나 마우스 오른쪽 버튼 클릭 컨텍스트 메뉴에서 "VirusTotal search"를 선택하면 파일 해시, 타임스탬프 등의 메타데이터가 처리를 위해 VirusTotal로 전송됩니다.
설정에 CyberChef URL이 있는 경우, 사용자가 마우스 오른쪽 버튼 클릭 컨텍스트 메뉴에서 "CyberChef"를 선택하면 모든 파일 데이터가 base64로 인코딩되어 처리될 목적으로 CyberChef로 전송됩니다.
또는
pip를 버전 20.0+로 업그레이드 시도:
$ pip install --upgrade pip
다음과 같이 PyQt5를 제거하고 재설치 시도:
pip uninstall PyQt5
pip uninstall PyQt5-sip
pip install PyQt5 PyQt5-sip
IDA가 모든 코드를 찾고 디스어셈블했는지 확인:
Options -> General -> Analysis -> Reanalyze program
완료 후 덤프/임포트 재구성을 다시 시도하세요.
자유롭게 기여해주세요! 이슈 및 풀 리퀘스트는 언제나 환영합니다.
Sphinx를 사용하여 소스에서 문서 빌드:
$ pip install sphinx
$ sphinx-apidoc -o ./doc/source/ .
$ sphinx-build -b html ./doc/source ./doc/build -E
문서를 보려면 웹 브라우저에서 ./doc/build/index.html을 여십시오.
Tom Bonner - tombonner - @thomas_bonner
PE Tree는 Apache License 2.0에 따라 배포됩니다. 자세한 내용은 LICENSE를 참조하십시오.
| Section | Option | Type | Description |
|---|
| config | debug | boolean | pefile.dump()를 출력에 인쇄 |
| config | fonts | string | UI에 사용할 글꼴 이름의 쉼표로 구분된 목록 |
| config | passwords | string | ZIP 파일 암호의 쉼표로 구분된 목록 |
| config | virustotal_url | string | VirusTotal 검색 URL |
| config | cyberchef_url | string | CyberChef URL |
| Type | OS | Path |
|---|
| 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 |