pyjadx
روابط بايثون لـ JADX عبر JPype. قم بفك تجميع ملفات APK وDEX لأندرويد إلى كود مصدر جافا من بايثون.
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
for cls in jadx.classes:
print(cls.full_name)
print(cls.code)
لماذا pyjadx؟
JADX هو أفضل مفكك برمجيات مفتوح المصدر لنظام أندرويد — فهو ينتج كود مصدر جافا/كوتلن نظيفًا من بايت كود Dalvik، مع الحفاظ على التسلسلات الهرمية للفئات، والأنواع العامة (generics)، ومعالجة الاستثناءات، والتعليقات التوضيحية. pyjadx يجلب هذا إلى بايثون دون حمل العمليات الفرعية: يعمل JADX داخل العملية عبر JPype.
التثبيت
المتطلبات: JDK 11+ (يتم تنزيل ملفات JADX JAR تلقائيًا عند أول استخدام).
بداية سريعة
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
# All top-level classes (inner classes via cls.inner_classes)
for cls in jadx.classes:
print(cls.full_name, len(cls.methods), "methods")
# Search by fully qualified name
main = jadx.search_class("com.example.MainActivity")
if main:
print(main.code)
# Method-level decompilation
for method in main.methods:
print(f"{method.name}: {method.code}")
# Cross-references
for method in main.methods:
print(f"{method.name} called by: {[c.name for c in method.callers]}")
# Package navigation
for pkg in jadx.packages:
print(pkg.name, len(pkg.classes), "classes")
المدخلات المدعومة
| Format | Example |
|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| Multi-DEX APK | يتم التعامل معها بشفافية — يتم دمج جميع الفئات |
مرجع API
Jadx(path, *, threads=None, mode="auto", code_cache=False)
نقطة الدخول الرئيسية. استخدم كمدير سياق أو استدعِ load()/close() يدويًا.
الخصائص:
الطرق:
JavaClass
JavaMethod
JavaField
JavaPackage
فتحة الهروب
كل غلاف يعرض كائن JADX جافا الأساسي الخاص به عبر .java. يتيح لك هذا استدعاء أي واجهة برمجة تطبيقات JADX لم نقم بتغليفها بعد:
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# Call JADX Java API directly
code_info = cls.java.getCodeInfo()
التعايش مع JVM
يتعايش pyjadx مع مستهلكي JPype الآخرين (مثل PyGhidra) في نفس العملية. إذا كانت JVM قيد التشغيل بالفعل، فإن pyjadx.start() يضيف ملفات JADX JAR إلى مسار الفئات الحالي. إذا لم تكن قيد التشغيل، فإنه يبدأ واحدة.
import pyghidra
pyghidra.start() # starts JVM for Ghidra
import pyjadx
pyjadx.start() # adds JADX JARs to existing JVM — no conflict
التكوين
تثبيت JADX مخصص:
# Via environment variable
# export JADX_HOME=/opt/jadx
# Or at runtime
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
تخزين مؤقت لـ JAR: يتم تنزيل ملفات JADX JAR تلقائيًا من Maven Central عند أول استخدام وتخزينها مؤقتًا في ~/.pyjadx/jars/<version>/.
الترخيص
MIT