
Dalvik 바이트코드(DEX/APK)를 동등한 Java 바이트코드로 변환하여, Java 분석 도구가 에지 케이스에 대해 높은 정확성으로 Android 애플리케이션을 처리할 수 있게 합니다.
참고: 이 저장소는 최신 버전이 아닐 수 있습니다. 향후 개발은 https://github.com/Storyyeller/enjarify에서 진행됩니다.
Enjarify는 Dalvik 바이트코드를 동등한 Java 바이트코드로 변환하는 도구입니다. 이를 통해 Java 분석 도구가 Android 애플리케이션을 분석할 수 있습니다.
Enjarify는 순수 Python 3 애플리케이션이므로 git clone 후 바로 실행할 수 있습니다. 저장소의 최상위 디렉토리에 있다고 가정하고 직접 실행하려면 다음을 입력하면 됩니다.
python3 -O -m enjarify.main yourapp.apk
일반적인 사용을 위해서는 래퍼 스크립트를 사용하고 PATH에 설정하는 것이 좋습니다.
편의를 위해 래퍼 셸 스크립트인 enjarify.sh가 제공됩니다. 이 스크립트는 CPython보다 빠른 PyPy를 사용할 수 있으면 사용하려고 시도합니다. 어디서든 Enjarify를 호출할 수 있도록 하려면 PATH에 있는 디렉토리(예: ~/bin)에 심볼릭 링크를 만들면 됩니다. 저장소의 최상위 디렉토리 안에 있다고 가정하고 다음을 실행하세요.
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
래퍼 배치 스크립트인 enjarify.bat가 제공됩니다. 어디서든 호출할 수 있도록 하려면 저장소의 루트 디렉토리를 PATH에 추가하면 됩니다. 배치 스크립트는 항상 python3를 인터프리터로 호출합니다. PyPy를 사용하려면 스크립트를 수정하면 됩니다.
스크립트를 PATH에 올바르게 설정했다면, 어디서든 enjarify를 입력하여 호출할 수 있습니다. 예:
enjarify yourapp.apk
가장 기본적인 사용법은 apk 파일이나 dex 파일을 입력으로 지정하는 것입니다. 멀티덱스 apk를 지정하면 Enjarify가 모든 dex 파일을 자동으로 변환하고 단일 결합 jar로 결과를 출력합니다. dex 파일을 지정하면 해당 dex 파일만 변환됩니다. 예를 들어 dex 파일을 수동으로 추출했다고 가정하면 다음과 같이 할 수 있습니다.
enjarify classes2.dex
기본 출력 파일은 현재 디렉토리의 [inputname]-enjarify.jar입니다. 출력 파일 이름을 명시적으로 지정하려면 -o 또는 --output 옵션을 사용하세요.
enjarify yourapp.apk -o yourapp.jar
기본적으로 Enjarify는 출력 파일이 이미 존재하면 덮어쓰기를 거부합니다. 출력을 덮어쓰려면 -f 또는 --force 옵션을 사용하세요.
Dex2jar는 Dalvik을 Java 바이트코드로 변환하려는 오래된 도구입니다. 대부분의 경우 꽤 잘 작동하지만, 많은 모호한 기능이나 예외적인 경우에 실패하거나 심지어 조용히 잘못된 결과를 생성할 수 있습니다. 이와 대조적으로 Enjarify는 Dex2jar가 실패할 수 있는 코드에서도 가능한 한 많은 경우에 작동하도록 설계되었습니다. 무엇보다도 Enjarify는 유니코드 클래스 이름, 여러 유형으로 사용되는 상수, 암시적 형변환, 정상 제어 흐름으로 점프하는 예외 처리기, 너무 많은 상수를 참조하는 클래스, 매우 긴 메서드, catch-all 처리기 이후의 예외 처리기, 잘못된 유형의 정적 초기값 등을 올바르게 처리합니다.
Enjarify는 현재 sourcefile 속성, 줄 번호, 주석과 같은 선택적 메타데이터를 변환하지 않습니다.
Enjarify는 가능한 한 많은 클래스를 성공적으로 변환하기 위해 노력하지만, Android, Java 또는 둘 다의 제한으로 인해 단순히 불가능한 경우가 있을 수 있습니다. 다행히도 이는 인위적인 상황에서만 발생하므로 실제로는 문제가 되지 않습니다.
PyPy는 CPython보다 훨씬 빠릅니다. PyPy를 설치하려면 http://pypy.org/를 참조하세요. 일반 PyPy가 아닌 PyPy3를 받아야 합니다. Linux 래퍼 스크립트는 pypy3 명령어가 사용 가능하면 자동으로 사용합니다. Windows에서는 래퍼 스크립트를 직접 수정해야 합니다.
기본적으로 Enjarify는 사람이 더 읽기 쉽도록 바이트코드에 최적화(복사 전파, 사용하지 않는 값 제거 등)를 실행합니다. 이 최적화가 필요하지 않다면 --fast 옵션으로 최적화를 비활성화하여 속도를 높일 수 있습니다. 최적화 없이 클래스파일에 맞추기에는 너무 큰 클래스가 있는 극히 드문 경우, Enjarify가 자동으로 모든 최적화를 활성화하여 재시도하므로 이 옵션은 성공적으로 변환되는 클래스 수에 영향을 미치지 않습니다.
이것은 공식 Google 제품(실험적이든 아니든)이 아니며, 단지 Google이 소유하고 있는 코드일 뿐입니다.