
وحدة Python لعرض ملفات Portable Executable (PE) في عرض شجري باستخدام pefile و PyQt5. يمكن استخدامها أيضًا مع IDA Pro و Rekall لتفريغ ملفات PE الموجودة في الذاكرة وإعادة بناء الاستيرادات.
PE Tree هي وحدة بايثون لعرض ملفات Portable Executable (PE) في عرض شجري باستخدام pefile و PyQt5. يمكن استخدامها أيضًا مع IDA Pro, Ghidra, Volatility, Rekall و minidump لعرض وتفريغ ملفات PE الموجودة في الذاكرة، بالإضافة إلى إعادة بناء جدول الاستيراد.
يجد تطبيق PE Tree المستقل ملفات PE القابلة للتنفيذ في الملفات والمجلدات وأرشيفات ZIP.

قم بالتثبيت مباشرة من GitHub باستخدام بيئة افتراضية جديدة و 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
قم باستنساخ المستودع وإعداد التطوير:
> 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 وابحث عن ملفات PE القابلة للتنفيذ في الملفات والمجلدات وأرشيفات 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 القابلة للتنفيذ من ملف ثنائي:
$ 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 ملفات PE القابلة للتنفيذ في قواعد بيانات IDA.

لتثبيت وتشغيل كإضافة IDAPython يمكنك استخدام setuptools أو التثبيت يدويًا.
قم بتنزيل pe_tree وقم بتثبيته لمفسر Python العام المستخدم من قبل IDA:
$ git clone https://github.com/blackberry/pe_tree.git
$ cd pe_tree
$ python setup.py develop --ida
انسخ pe_tree_ida.py إلى مجلد إضافات IDA
قم بتنزيل pe_tree وقم بتثبيت المتطلبات لمفسر Python العام المستخدم من قبل IDA:
$ 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، قم أولاً بتثبيت متطلبات حزمة pe_tree لمثبّت Python العام:
$ pip install -r requirements.txt
ثم قم بتشغيل pe_tree_ida.py تحت IDA:
File -> Script file... -> pe_tree_ida.py -> Open
| نظام التشغيل | مجلد الإضافات |
|---|---|
| ويندوز | %ProgramFiles%\IDA Pro 7.X\plugins |
| لينكس | /opt/ida-7.X/plugins |
| ماك | ~/.idapro/plugins |
قم بتشغيل IDA Pro وفك تجميع ملف PE (اختر دائمًا Manual Load و Load Resources للحصول على أفضل النتائج!)
قم بتحميل إضافة PE Tree:
Edit -> Plugins -> PE Tree
فيما يلي الخطوات الأساسية لتفريغ ملف PE مضغوط (على سبيل المثال MPRESS أو UPX) وإعادة بناء الاستيرادات (بافتراض أن قاعدة الصورة/نقطة الدخول قياسية إلى حد ما):
قم بتشغيل IDA Pro وفك تجميع ملف PE مضغوط بـ MPRESS أو UPX (اختر Manual Load و Load Resources)
اختر مصححًا (ويندوز أو 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، بينما سيتم إلحاق قسم جديد باسم .pe_tree يحتوي على IAT المعاد بناؤه وجدول أسماء التلميحات (hint name table) و IDT بملف PE (مثل قسم .idata).
إذا تم تعليم قطاع الذاكرة الخاص بنقطة الدخول على أنه قابل للكتابة أثناء التنفيذ (عبر VirtualProtect على سبيل المثال)، فسيتم أيضًا تعليم خصائص قطاع نقطة الدخول على أنها قابلة للكتابة.
أخيرًا، يتم وضع علامة على أدلة البيانات BASERELOC و BOUND_IMPORT و SECURITY على أنها فارغة، ويتم إعادة حساب المجموع الاختباري لـ OPTIONAL_HEADER (إذا تم تحديده).
باستخدام النهج أعلاه، يمكن تفريغ العديد من ملفات PE في الذاكرة التي تم فك ضغطها أو حقنها أو تحميلها انعكاسيًا أو تجويفها (hollowed) إلخ.
تجد إضافة PE Tree Rekall ملفات PE القابلة للتنفيذ في صور ذاكرة ويندوز.

قم بتشغيل Rekall وعرض العمليات النشطة و DLLs وبرامج التشغيل على نظام مباشر:
$ 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 ملفات PE القابلة للتنفيذ في صور ذاكرة ويندوز.

$ 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 ملفات PE القابلة للتنفيذ في قواعد بيانات 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 ملفات PE القابلة للتنفيذ في Windows Minidumps.

$ 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
ستتم مشاركة المعلومات التالية مع تطبيقات ويب تابعة لجهات خارجية (حسب الإعدادات) في ظل الشروط التالية:
إذا تم تحديد عنوان URL لـ VirusTotal في الإعدادات، فسيتم إرسال البيانات الوصفية مثل تجزئات الملفات والطوابع الزمنية وما إلى ذلك إلى VirusTotal للمعالجة عندما ينقر المستخدم على الروابط المميزة أو يختار "VirusTotal search" من قائمة السياق بزر الفأرة الأيمن.
إذا كان عنوان URL لـ CyberChef موجودًا في الإعدادات، فسيتم ترميز أي بيانات ملف بتنسيق base64 وإرسالها إلى CyberChef للمعالجة عندما يختار المستخدم "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 في متصفح ويب.
توم بونر - tombonner - @thomas_bonner
يتم توزيع PE Tree بموجب ترخيص Apache. راجع LICENSE لمزيد من المعلومات.
| القسم | الخيار | النوع | الوصف |
|---|
| config | debug | boolean | طباعة pefile.dump() إلى المخرجات |
| config | fonts | string | قائمة بأسماء الخطوط مفصولة بفواصل للواجهة |
| config | passwords | string | قائمة بكلمات مرور ملفات ZIP مفصولة بفواصل |
| config | virustotal_url | string | عنوان URL لبحث VirusTotal |
| config | cyberchef_url | string | عنوان URL لـ CyberChef |
| النوع | نظام التشغيل | المسار |
|---|
| التطبيق | ويندوز | %TEMP%\pe_tree.ini |
| التطبيق | لينكس/ماك | /tmp/pe_tree.ini |
| IDAPython | ويندوز | %APPDATA%\HexRays\IDA Pro\pe_tree.ini |
| IDAPython | لينكس/ماك | ~/.idapro/pe_tree.ini |
| Rekall | ويندوز | %TEMP%\pe_tree_rekall.ini |
| Rekall | لينكس/ماك | /tmp/pe_tree_rekall.ini |
| Volatility | ويندوز | %TEMP%\pe_tree_volatility.ini |
| Volatility | لينكس/ماك | /tmp/pe_tree_volatility.ini |
| Ghidra | ويندوز | %TEMP%\pe_tree_ghidra.ini |
| Ghidra | لينكس/ماك | /tmp/pe_tree_ghidra.ini |
| Minidump | ويندوز | %TEMP%\pe_tree_minidump.ini |
| Minidump | لينكس/ماك | /tmp/pe_tree_minidump.ini |
| Carve | ويندوز | %TEMP%\pe_tree_carve.ini |
| Carve | لينكس/ماك | /tmp/pe_tree_carve.ini |