
JADX के लिए Python बाइंडिंग्स।
JADX के लिए JPype के माध्यम से Python बाइंडिंग्स। Android APK और DEX फ़ाइलों को Python से Java स्रोत में डीकंपाइल करें।
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
for cls in jadx.classes:
print(cls.full_name)
print(cls.code)
JADX एक अग्रणी ओपन-सोर्स Android डीकंपाइलर है — यह Dalvik बाइटकोड से साफ Java/Kotlin स्रोत उत्पन्न करता है, class hierarchies, generics, exception handling और annotations को संरक्षित करता है। pyjadx इसे बिना सबप्रोसेस ओवरहेड के Python में लाता है: JADX JPype के माध्यम से इन-प्रोसेस चलता है।
pip install pyjadx
आवश्यकताएँ: JDK 11+ (JADX JARs पहली बार उपयोग पर स्वचालित रूप से डाउनलोड हो जाते हैं)।
from pyjadx import Jadx
with Jadx("app.apk") as jadx:
# सभी शीर्ष-स्तरीय क्लासेस (आंतरिक क्लासेस cls.inner_classes के माध्यम से)
for cls in jadx.classes:
print(cls.full_name, len(cls.methods), "methods")
# पूर्ण योग्य नाम से खोजें
main = jadx.search_class("com.example.MainActivity")
if main:
print(main.code)
# मेथड-स्तरीय डीकंपाइलेशन
for method in main.methods:
print(f"{method.name}: {method.code}")
# क्रॉस-रेफरेंसेस
for method in main.methods:
print(f"{method.name} called by: {[c.name for c in method.callers]}")
# पैकेज नेविगेशन
for pkg in jadx.packages:
print(pkg.name, len(pkg.classes), "classes")
| प्रारूप | उदाहरण |
|---|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| Multi-DEX APK | पारदर्शी रूप से संभाला जाता है — सभी क्लासेस मर्ज हो जाती हैं |
Jadx(path, *, threads=None, mode="auto", code_cache=False)मुख्य प्रवेश बिंदु। कॉन्टेक्स्ट मैनेजर के रूप में उपयोग करें या load()/close() को मैन्युअल रूप से कॉल करें।
| पैरामीटर | विवरण |
|---|---|
path | APK या DEX फ़ाइल का पथ |
threads | JADX थ्रेड पूल आकार (None = CPU संख्या) |
mode | "auto", "restructure", "simple", या "fallback" |
code_cache | False = इन-मेमोरी कैश (डिफ़ॉल्ट), True = डिस्क-बैक्ड |
गुण:
| गुण | प्रकार | विवरण |
|---|---|---|
classes | list[JavaClass] | सभी DEX फ़ाइलों में शीर्ष-स्तरीय क्लासेस |
packages | list[JavaPackage] | पैकेज-स्तरीय नेविगेशन |
class_count | int | शीर्ष-स्तरीय क्लासेस की संख्या |
java | JObject | अंतर्निहित jadx.api.JadxDecompiler तक एस्केप हैच |
मेथड्स:
| मेथड | विवरण |
|---|---|
load() | क्लासेस लोड और रिज़ॉल्व करें (__enter__ द्वारा कॉल किया जाता है) |
close() | संसाधन मुक्त करें (__exit__ द्वारा कॉल किया जाता है) |
decompile_all() | सभी क्लासेस को तत्काल डीकंपाइल करें |
search_class(name) | पूर्ण योग्य नाम से क्लास खोजें |
JavaClass| गुण | प्रकार | विवरण |
|---|---|---|
name | str | छोटा नाम ("MainActivity") |
full_name | str | पूर्ण योग्य ("com.example.MainActivity") |
package | str | पैकेज नाम |
code | str | डीकंपाइल्ड Java स्रोत (आलसी, कैश्ड) |
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| गुण | प्रकार | विवरण |
|---|---|---|
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| गुण | प्रकार | विवरण |
|---|---|---|
name | str | फ़ील्ड नाम |
full_name | str | क्लास के साथ पूर्ण योग्य |
type | str | फ़ील्ड प्रकार स्ट्रिंग के रूप में |
callers | list[JavaMethod] | मेथड्स जो इस फ़ील्ड को संदर्भित करते हैं (आलसी, कैश्ड) |
declaring_class | JavaClass | वह क्लास जिससे यह फ़ील्ड संबंधित है |
java | JObject | jadx.api.JavaField तक एस्केप हैच |
JavaPackage| गुण | प्रकार | विवरण |
|---|---|---|
name | str | पूर्ण पैकेज नाम |
classes | list[JavaClass] | इस पैकेज में क्लासेस |
sub_packages | list[JavaPackage] | उप-पैकेज |
java | JObject | jadx.api.JavaPackage तक एस्केप हैच |
प्रत्येक रैपर अपने अंतर्निहित JADX Java ऑब्जेक्ट को .java के माध्यम से एक्सपोज़ करता है। यह आपको किसी भी JADX API को कॉल करने देता है जिसे हमने अभी तक रैप नहीं किया है:
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# JADX Java API को सीधे कॉल करें
code_info = cls.java.getCodeInfo()
pyjadx एक ही प्रक्रिया में अन्य JPype उपभोक्ताओं (जैसे PyGhidra) के साथ सह-अस्तित्व में रहता है। यदि JVM पहले से चल रहा है, तो pyjadx.start() मौजूदा क्लासपथ में JADX JARs जोड़ता है। यदि नहीं, तो यह एक शुरू करता है।
import pyghidra
pyghidra.start() # Ghidra के लिए JVM शुरू करता है
import pyjadx
pyjadx.start() # मौजूदा JVM में JADX JARs जोड़ता है — कोई विरोध नहीं
कस्टम JADX इंस्टॉलेशन:
# पर्यावरण चर के माध्यम से
# export JADX_HOME=/opt/jadx
# या रनटाइम पर
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
JAR कैशिंग: JADX JARs पहली बार उपयोग पर Maven Central से स्वचालित रूप से डाउनलोड होते हैं और ~/.pyjadx/jars/<version>/ पर कैश हो जाते हैं।
MIT