
ربط بايثون لـ JADX.
روابط بايثون لـ 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)
JADX هو أفضل مفكك برمجيات مفتوح المصدر لنظام أندرويد — فهو ينتج كود مصدر جافا/كوتلن نظيفًا من بايت كود Dalvik، مع الحفاظ على التسلسلات الهرمية للفئات، والأنواع العامة (generics)، ومعالجة الاستثناءات، والتعليقات التوضيحية. pyjadx يجلب هذا إلى بايثون دون حمل العمليات الفرعية: يعمل JADX داخل العملية عبر JPype.
pip install pyjadx
المتطلبات: 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 | يتم التعامل معها بشفافية — يتم دمج جميع الفئات |
Jadx(path, *, threads=None, mode="auto", code_cache=False)نقطة الدخول الرئيسية. استخدم كمدير سياق أو استدعِ load()/close() يدويًا.
| Parameter | Description |
|---|---|
path | المسار إلى ملف APK أو DEX |
threads | حجم تجمع خيوط JADX (None = عدد وحدات المعالجة المركزية) |
mode | "auto"، "restructure"، "simple"، أو "fallback" |
code_cache | False = ذاكرة مؤقتة في الذاكرة (افتراضي)، True = مدعوم بالقرص |
الخصائص:
| Property | Type | Description |
|---|---|---|
classes | list[JavaClass] | الفئات ذات المستوى الأعلى عبر جميع ملفات DEX |
packages | list[JavaPackage] | التنقل على مستوى الحزم |
class_count | int | عدد الفئات ذات المستوى الأعلى |
java | JObject | فتحة هروب إلى jadx.api.JadxDecompiler الأساسي |
الطرق:
| Method | Description |
|---|---|
load() | تحميل الفئات وحلها (يتم الاستدعاء بواسطة __enter__) |
close() | تحرير الموارد (يتم الاستدعاء بواسطة __exit__) |
decompile_all() | فك تجميع جميع الفئات فورًا |
search_class(name) | العثور على فئة بالاسم المؤهل بالكامل |
JavaClass| Property | Type | Description |
|---|---|---|
name | str | الاسم المختصر ("MainActivity") |
full_name | str | الاسم المؤهل بالكامل ("com.example.MainActivity") |
package | str | اسم الحزمة |
code | str | كود مصدر جافا المفكك (كسول، مخبأ) |
smali | str | تفكيك Smali (كسول، مخبأ) |
methods | list[JavaMethod] | الطرق في هذه الفئة |
fields | list[JavaField] | الحقول في هذه الفئة |
inner_classes | list[JavaClass] | الفئات الداخلية / المجهولة |
declaring_class | JavaClass | None | الفئة الأم (إذا كانت داخلية) |
top_class | JavaClass | الفئة الخارجية الأكثر احتواءً |
dependencies | list[JavaClass] | الفئات التي تعتمد عليها هذه الفئة |
is_inner | bool | هل هذه فئة داخلية |
java | JObject | فتحة هروب إلى jadx.api.JavaClass |
JavaMethod| Property | Type | Description |
|---|---|---|
name | str | اسم الطريقة |
full_name | str | الاسم المؤهل بالكامل مع الفئة |
code | str | الكود المفكك (كسول، مخبأ) |
callers | list[JavaMethod] | الطرق التي تستدعي هذه (كسول، مخبأ) |
callees | list[JavaMethod] | الطرق التي تستدعيها هذه (كسول، مخبأ) |
override_related | list[JavaMethod] | سلسلة التجاوز ثنائية الاتجاه |
declaring_class | JavaClass | الفئة التي تنتمي إليها هذه الطريقة |
java | JObject | فتحة هروب إلى jadx.api.JavaMethod |
JavaField| Property | Type | Description |
|---|---|---|
name | str | اسم الحقل |
full_name | str | الاسم المؤهل بالكامل مع الفئة |
type | str | نوع الحقل كسلسلة نصية |
callers | list[JavaMethod] | الطرق التي تشير إلى هذا الحقل (كسول، مخبأ) |
declaring_class | JavaClass | الفئة التي ينتمي إليها هذا الحقل |
java | JObject | فتحة هروب إلى jadx.api.JavaField |
JavaPackage| Property | Type | Description |
|---|---|---|
name | str | اسم الحزمة الكامل |
classes | list[JavaClass] | الفئات في هذه الحزمة |
sub_packages | list[JavaPackage] | الحزم الفرعية |
java | JObject | فتحة هروب إلى jadx.api.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()
يتعايش 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