pyjadx
JADX를 위한 Python 바인딩 (JPype 기반). 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)
왜 pyjadx인가?
JADX는 최고의 오픈소스 Android 디컴파일러입니다. Dalvik 바이트코드에서 깔끔한 Java/Kotlin 소스를 생성하며, 클래스 계층 구조, 제네릭, 예외 처리, 애너테이션을 보존합니다. pyjadx는 서브프로세스 오버헤드 없이 이 기능을 Python에 제공합니다. JADX가 JPype를 통해 프로세스 내에서 실행됩니다.
설치
요구사항: JDK 11+ (JADX JAR은 최초 사용 시 자동으로 다운로드됩니다).
빠른 시작
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), "메서드")
# 정규화된 이름으로 검색
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} 호출자: {[c.name for c in method.callers]}")
# 패키지 탐색
for pkg in jadx.packages:
print(pkg.name, len(pkg.classes), "클래스")
지원 입력 형식
| 형식 | 예시 |
|---|
| APK | Jadx("app.apk") |
| DEX | Jadx("classes.dex") |
| 멀티 DEX APK | 투명하게 처리 – 모든 클래스 병합 |
API 참조
Jadx(path, *, threads=None, mode="auto", code_cache=False)
주 진입점입니다. 컨텍스트 관리자로 사용하거나 load()/close()를 직접 호출하세요.
속성:
메서드:
JavaClass
JavaMethod
JavaField
JavaPackage
탈출구
모든 래퍼는 .java를 통해 내부 JADX Java 객체를 노출합니다. 이를 통해 아직 래핑되지 않은 모든 JADX API를 호출할 수 있습니다:
with Jadx("app.apk") as jadx:
cls = jadx.search_class("com.example.Foo")
# JADX Java API 직접 호출
code_info = cls.java.getCodeInfo()
JVM 공존
pyjadx는 동일한 프로세스 내에서 다른 JPype 소비자 (예: PyGhidra)와 공존할 수 있습니다. JVM이 이미 실행 중이면 pyjadx.start()는 기존 클래스패스에 JADX JAR을 추가합니다. 그렇지 않으면 새로 시작합니다.
import pyghidra
pyghidra.start() # Ghidra용 JVM 시작
import pyjadx
pyjadx.start() # 기존 JVM에 JADX JAR 추가 – 충돌 없음
설정
사용자 정의 JADX 설치:
# 환경 변수 사용
# export JADX_HOME=/opt/jadx
# 또는 런타임 시
import pyjadx
pyjadx.start(jadx_home="/opt/jadx")
JAR 캐싱: JADX JAR은 최초 사용 시 Maven Central에서 자동 다운로드되며 ~/.pyjadx/jars/<version>/에 캐시됩니다.
라이선스
MIT