
مجموعة عالية الأداء لهندسة Ghidra وتسريع GPU: برنامج ترميز B-Tree من LZ4/Zstd، خادم دائم خالٍ من الأقفال، ماسح WGPU ARM64، مُثبِت Z3 SMT، ومُفكِّك شيفرة عصبي
أدوات Python تجعل كتابة السكربتات لـ Ghidra أسرع، إضافة إلى بعض التحليلات التي لا يقوم بها Ghidra بشكل جاهز: استعادة أصناف MFC/C++، وتتبع تخطيط Serialize()، ومطابقة الدوال عبر الإصدارات، ومدقق تكافؤ Z3 لـ P-code.
تحليل Ghidra ممتاز، لكن تشغيله من السكربتات بطيء. كل تشغيل بلا واجهة يدفع 5–15 ثانية من بدء تشغيل JVM. قفل المشروع يمنع عملية ثانية من القراءة. المهام الكبيرة مثل مسح قسم .text بحجم 20 MB لمعمارية ARM64 أو مطابقة 45,000 دالة بين نسختين تعمل على خيط معالج واحد.
يحتفظ SuperGhidra بمشروع Ghidra واحد للقراءة فقط محمّلًا في خادم خلفي (daemon) ويخزّن إجاباته مؤقتًا. تنتقل الأعمال الكبيرة إلى Python العادي أو NumPy أو تظليل حوسبة GPU. الكثير من أعمال تنسيق الملفات واستعادة الأصناف لا يحتاج إلى Ghidra إطلاقًا.
| الحزمة | ما تفعله |
|---|---|
core | خادم على 127.0.0.1:5073 مع ذاكرة تخزين مؤقت SQLite. تذهب إعادة التسمية والتعليقات إلى طبقة JSON فوقية، وليس أبدًا إلى .rep. يتضمن أيضًا حاكم موارد (eco / balanced / turbo / auto) واتصال IPC عبر الذاكرة المشتركة. |
formats | محمّل ELF / PE / Mach-O، واستعادة MSVC RTTI و MFC CRuntimeClass، وتتبع Serialize()، ومفكك CArchive، وتصدير DWARF 5 / Breakpad / map. لا يحتاج أي منها إلى Ghidra. |
lifters | رافع ARM64 → P-code (مجموعة الأعداد الصحيحة الفرعية)، ومفككات x86 و ARM/Thumb، ومدقق Z3 يثبت تكافؤ مقطعين أو يجيب بـ UNKNOWN. |
diff | يطابق الدوال عبر الإصدارات باستخدام متجهات ميزات CFG، ثم يجد حقول البنية التي تحركت إزاحاتها ويعيد كتابة الوصولات. |
acceleration | تظليل WGPU تمسح ARM64 بحثًا عن أزواج ADRP+ADD/LDR ومقدمات الدوال، مع بديل CPU بـ SIMD. |
storage | مرمّز LZ4 / Zstd لصفحات المخزن المؤقت بحجم 16 KB في Ghidra، إضافة إلى مرمّز Java مستقل لـ BufferFile. |
integrations | مرجع متقاطع APK ↔ JNI، وقارئ ذاكرة محاكي Android مع قائمة أجهزة مسموح بها، وخط أنابيب تسمية بـ LLM. |
لكل حزمة README خاص بها تحت superghidra/.
جميع القياسات مأخوذة على عتاد فعلي (Intel Core i9-12950HX، 64 GB DDR5، NVIDIA RTX A5500 Laptop GPU) وعبر مصفوفة CI متعددة المنصات. البيانات التجريبية الكاملة والسجلات موجودة في docs/benchmarks/.
| عبء العمل / القياس | حجم الإدخال / الهدف | المحرك / الخلفية | الوقت المقاس | الإنتاجية / النتيجة المقاسة | الحالة |
|---|---|---|---|---|---|
| مسح ARM64 ADRP + ADD/LDR | كتلة ARM64 بحجم 4.0 MB (1,048,576 تعليمة) | NumPy SIMD | 7.28 ms | 143.95 M insn/s | تم تحديد 1,049 زوجًا |
| باذر دوال ARM64 | كتلة ARM64 بحجم 4.0 MB (1,048,576 تعليمة) | NumPy SIMD | 8.31 ms | 126.19 M insn/s | تم تحديد 1,049 مقدمة |
| مسح ADRP واسع النطاق على GPU | كتلة ARM64 بحجم 20.0 MB (5,242,880 تعليمة) | WGPU DirectX 12 | 41.20 ms | 127.25 M insn/s | تطابق دقيق مع CPU |
| ضغط ملف المخزن المؤقت (LZ4) | 1,000 صفحة اصطناعية بحجم 16 KB (16.0 MB) | LZ4 block | 36.12 ms | 442.9 MB/s (نسبة 4.84x) | توفير 79.32% من القرص |
| ضغط ملف المخزن المؤقت (Zstd) | 1,000 صفحة اصطناعية بحجم 16 KB (16.0 MB) | Zstd المستوى 3 | 77.48 ms | 206.5 MB/s (نسبة 7.39x) | توفير 86.47% من القرص |
| ذاكرة تخزين استعلامات التفكيك المؤقتة | RPC مباشر لخادم Ghidra | ذاكرة SQLite L2 | < 0.01 ms | > 100,000 req/s | تطابق الطبقة الفوقية في الذاكرة |
| ذهاب وإياب IPC لقناة SHM | مخزن حلقي معيّن في الذاكرة بحجم 64 KB | Windows SHM IPC | 5.12 µs | 195,300 msg/s | ذاكرة مشتركة بلا نسخ |
تم التقييم تحت gcc -O0 -lm عبر مستويات التحسين O0–O3. يجب أن تُترجم الدوال دون أخطاء وأن تجتاز مجموعة اختباراتها:
| مسار فك الترجمة | عدد الحالات القابلة للترجمة | معدل النجاح (%) | الفرق النسبي مقابل Ghidra الخام | الفرق النسبي مقابل IDA Pro |
|---|---|---|---|---|
| Stock NSA Ghidra | 107 / 1,296 | 8.26% | خط الأساس | -8.64% |
| Commercial IDA Pro | 219 / 1,296 | 16.90% | +8.64% | خط الأساس |
| SuperGhidra Compilable Filter | 294 / 1,296 | 22.69% | +14.43% | +5.79% |
مصفوفة كاملة من 6 مهام تنجح في كل عملية commit (Run #39691442336):
| نظام التشغيل | Python 3.10 | Python 3.11 | Python 3.12 | عدد اختبارات Pytest | معدل النجاح |
|---|---|---|---|---|---|
Ubuntu Linux (ubuntu-latest) | 32s | 26s | 25s | 626 collected (572 passed, 42 skipped, 11 deselected) | 100% |
Windows Server (windows-latest) | 1m 25s | 1m 06s | 53s | 626 collected (583 passed, 32 skipped, 11 deselected) | 100% |
السجلات التفصيلية ومنهجية القياس موثّقة في docs/benchmarks/EMPIRICAL_TEST_BENCHMARK_MATRIX.md.
من PyPI:
pip install superghidra
إضافات اختيارية للتسريع والتكامل:
pip install "superghidra[all]" # all optional backends
pip install "superghidra[smt]" # Z3 P-code equivalence checker
pip install "superghidra[gpu]" # WGPU compute shaders (ADRP/prologue sweeps)
pip install "superghidra[storage]" # LZ4 & Zstandard 16 KB page compression
pip install "superghidra[ghidra]" # PyGhidra bridge & JVM headless bindings
pip install "superghidra[frida]" # Live emulator runtime inspection
من المصدر (التطوير):
git clone https://github.com/yuatemycat/SuperGhidra
cd SuperGhidra
pip install -e ".[all]"
python -m pytest -q
واجهة سطر أوامر موحّدة:
يأتي SuperGhidra مع ملف تنفيذي مستقل مدمج لواجهة سطر الأوامر superghidra:
# Display version and hardware acceleration telemetry
superghidra version
# Staged P-code decompiler (MBA simplification, opaque branch pruning, goto-free C)
superghidra decompile target.dll --rva 0x140001000 --arch x86_64 -o decompiled.c
# Import IDA Pro .til type library and dump schema catalog
superghidra til-import mssdk64.til -o catalog.json
# Match binary bytes against IDA FLIRT signature database
superghidra flirt-match vc32rtf.sig target.exe --rva 0x1000
# Recover MSVC / MFC C++ class hierarchies, RTTI structures, and virtual call tables
superghidra rtti-recover app.dll -o classes.json
# Filter raw decompiler output into clean, compilable C
superghidra filter raw_decompile.c -o clean.c
فحص ملف ثنائي Windows (دون الحاجة إلى Ghidra):
python -m superghidra.formats.binary_loader app.dll # sections, imports, exports
python -m superghidra.formats.msvc_class_recovery app.dll # RTTI + MFC classes
python -m superghidra.formats.serialize_trace app.dll CMyDoc # Serialize() field layout
من Python:
from superghidra.formats.binary_loader import load_binary
from superghidra.formats.msvc_class_recovery import recover_classes
import superghidra as sg
img = load_binary("app.dll")
print(img.format, img.arch, len(img.sections))
report = recover_classes("app.dll")
print(len(report.mfc_classes), "MFC classes")
# Lift one ARM64 instruction and check it against itself with Z3
ops = sg.ARM64PcodeLifter().lift_instruction(0x1000, 0x91008041) # add x1, x2, #0x20
print(sg.SMTPcodeVerifier().verify_equivalence(ops, ops).equivalent)