DEX를 Java 소스 코드로 디 컴파일


706

Android DEX (VM 바이트 코드) 파일을 해당 Java 소스 코드로 어떻게 디 컴파일 할 수 있습니까?


봐 가지고 여기를 . 거기서부터 리드를 얻을 수 있습니다.
Kevin Boyd

업데이트 정보는 허브 블로그 코더로 볼 수 있습니다 : coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
메릴랜드 Mohsin

돈이있는 경우, 구매 젭을 사용, 그렇지 않으면 jadx 참조 여기
polym

새로운 크로스 플랫폼 (java) 및 오픈 소스 도구가 있습니다.이를 통해 바이트 코드
뷰어를

답변:


881

그것은 간단합니다

다음 도구를 사용하십시오.

1) dex2jar 를 사용하여 dex 파일을 jar 파일로 변환

2) jar에서 Java 파일을 보는 jd-gui

dex2jar가 일부 최적화를 수행하므로 소스 코드를 읽을 수 있습니다.

순서:

그리고 디 컴파일하는 방법에 대한 절차는 다음과 같습니다.

1 단계:

test_apk-debug.apk의 classes.dex를 test_apk-debug_dex2jar.jar로 변환하십시오.

d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
d2j-dex2jar.sh -f -o output_jar.jar dex_to_decompile.dex

주 1 : 모든 윈도우 머신에서 .sh스크립트로 대체 .bat스크립트

주 2 : 리눅스 / 맥에 대해 잊지 마세요 shbash. 전체 명령은 다음과 같아야합니다.

sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk 

참고 3 : 또한 dex2jar-X.X디렉토리 에 실행 권한을 추가해야합니다. 예 :sudo chmod -R +x dex2jar-2.0

dex2jar 문서

2 단계:

JD-GUI에서 항아리를 엽니 다

디 컴파일 된 소스


57
+1. Baksmali와 Dex2jar을 모두 시도했습니다. Dex2Jar + JD-Gui는 대부분의 .dex 파일에 대해 완벽하게 읽을 수있는 소스 코드를 제공합니다.
Jonathan Dumaine

안녕하세요, 당신이 가고있는 방식을 공유 하시겠습니까? 나는 당신에게 매우 감사합니다.
Arslan Anwar

2
위의 문장은 종을 울렸다 -geeknizer.com/decompile-reverse-engineer-android-apk (또는 다른 방법으로) 에서 반 인용 된 것처럼 보입니다 . 링크 된 기사에서는 위에서 언급 한 도구와 Smali 및 APKTool에 대해 간략하게 설명합니다.
Agent Knopf

2
@JonathanDumaine에 따라 다릅니다. JAR이 난독 화되고 약간의 수정을 원한다면 Backsmali가 유일한 방법입니다. 보너스! APKTool을 사용하면 모든 XML, 이미지 및 기타 리소스를 다시 얻을 수 있습니다. 내 답변을 참조하십시오 .
Alba Mendez

3
@JonathanDumaine 나는 jmendeth에 동의합니다. apktool은 apk를 디 컴파일하고 수정 한 다음 다시 컴파일하려는 경우 갈 수있는 방법입니다. dex2jar 및 jd-gui를 사용하는 동안 소스는 실제로 읽을 수 있지만 일부 오류는 다시 컴파일 할 수 없습니다!
darkheir

138

다소 명확하게 설명하기 위해 달성하려는 목표에 따라 여기에서 취할 수있는 두 가지 주요 경로가 있습니다.

Dalvik 바이트 코드 (dex)를 읽을 수있는 Java 소스로 디 컴파일하십시오. fred가 언급 했듯이 dex2jarjd-gui를 사용 하여 쉽게 수행 할 수 있습니다 . 결과 소스는 앱의 기능을 읽고 이해하는 데 유용하지만 100 % 사용 가능한 코드를 생성하지는 않습니다. 다시 말해 소스를 읽을 수는 있지만 실제로 수정하거나 다시 패키지 할 수는 없습니다. 소스가 proguard로 난독 화 된 경우 결과로 생성 된 소스 코드를 풀기가 더 어려워집니다.

다른 주요 대안은 정확하게이 목적을 위해 설계된 어셈블리 언어 인 smali로 바이트 코드를 분해하는 것입니다. 가장 쉬운 방법은 apktool을 사용하는 것 입니다. apktool을 설치했으면 apk 파일을 가리키면 응용 프로그램에 포함 된 각 클래스에 대한 smali 파일을 다시 얻을 수 있습니다. 새로운 Java 소스에서 smali를 생성하여 smali를 읽고 수정하거나 클래스를 완전히 바꿀 수도 있습니다 (이를 수행하려면 javac를 사용하여 .java 소스를 .class 파일로 컴파일 한 다음 Android의 .class 파일을 .dex 파일로 변환 할 수 있음) 이 질문에 설명 된대로 dx 컴파일러를 사용한 다음 baksmali (smali 디스어셈블러)를 사용하여 .dex를 .smali 파일로 변환합니다.. 바로 가기가있을 수 있습니다). 완료되면 apktool을 사용하여 apk 백업을 쉽게 패키징 할 수 있습니다. apktool은 결과 apk에 서명하지 않으므로 다른 Android 응용 프로그램과 마찬가지로 처리해야 합니다 .

smali 경로로 가면 APK 디 컴파일 및 재 컴파일 및 장치에 설치하는 데 도움이되는 위 단계 중 일부를 자동화하는 IDE 인 APK Studio 를 사용해 볼 수 있습니다 .

요컨대, 더 읽기 쉽지만 돌이킬 수없는 Java로 디 컴파일하거나 수정하기가 쉽지 않지만 수정 된 응용 프로그램을 다시 패키지하는 데 훨씬 융통성이있는 smali로 분해 할 수 있습니다. 어떤 접근 방식을 선택 하느냐는 달성하고자하는 대상에 따라 다릅니다.

마지막으로, 감히 제안하는 것도 주목할 만하다. .dex 및 .apk 파일을 java .class 파일로 변환하여 일반적인 Java 정적 분석 도구를 사용하여 분석 할 수있는 리 타겟팅 도구입니다.


61

나는 실제로 여기에가는 것이 좋습니다 : https://github.com/JesusFreke/smali

DEX 파일을위한 가장 훌륭한 리버스 엔지니어링 툴인 BAKSMALI를 제공합니다. Android 용의 유명한 ROM을 만든 JesusFreke가 만든 것입니다.


3
smali는 dalvik IL을 기반으로하는 어셈블리와 유사한 언어이며 Java로 직접 변환 될 수 없습니다.
reflog

@endryha 그렇게 할 수있는 도구는 없습니다. 자세한 내용은 이 질문 을 참조하십시오.
Alba Mendez

1
코드, 코드, 코드, ... 왜 코드 만? APKTool을 사용하면 모든 것을 다시 얻을 수 있습니다 ! 그리고 간단합니다 ./apktool d myprogram.apk. 내 답변을 참조하십시오 .
Alba Mendez

30

프레드대답 의 더 완전한 버전 :

수동 방법

먼저 DEX의 모든 (컴파일 된) 클래스를 JAR 로 추출 하는 도구가 필요합니다 . 중국 학생이 만든 dex2jar
이라는 것이 있습니다.

그런 다음 jd-gui 를 사용 하여 JAR의 클래스를 소스 코드 로 디 컴파일 할 수 있습니다 .
dex2jar가 일부 최적화를 적용하므로 결과 소스는 상당히 읽을 수 있어야합니다.

자동 방법

APKTool 을 사용할 수 있습니다 . 그것은 것이다 자동으로 모든 클래스를 (추출 .dex) 자원 ( .asrc), 다음 변환됩니다 바이너리 XML을사람이 읽을 수있는 XML , 또한 것이다 dissassemble 당신을위한 클래스를.
분해 항상 디 컴파일보다 더 강력한 것입니다 특히
프로 가드로 난독 JAR 파일!

그냥하는 APKTool에게 디코딩 한 후, 디렉토리에 APK를 수정 당신이 원하는,
그리고 마지막으로 인코딩 되돌려 APK에 다시. 그게 다야.

중요 : APKTool은 분해 됩니다. 디 컴파일 하지 않습니다 .
생성 된 코드는 Java 소스가 아닙니다.
그러나 jasmin에 익숙하다면이를 읽고 편집 할 수 있어야합니다 .
Java 소스를 원하면 수동 방법으로 이동하십시오 .


25

때로는 dex2jar/를 사용할 때 apktool가장 눈에 띄는 루프에서 코드가 깨지는 경우 가 있습니다. 이것을 피하기 위해 jadx를 사용 하십시오 .이 방법은 .jar/ .class파일을 먼저 만들지 않고 dalvik 바이트 코드를 Java 소스 코드로 디 컴파일 합니다 dex2jar(apktool은 dex2jar을 사용합니다). 또한 오픈 소스이며 활발한 개발 중입니다. GUI 광신자에게는 GUI도 있습니다. 시도 해봐!


jadx에 컴파일 옵션이 없지만 코드를 읽을 수 있다고 가정합니다.
Buddy

@EnesBattal 당신은 같은 의미 javac "$(find . -name '*.java')"입니까?
polym

APK를 만드는 방법은 무엇입니까? apk, zipalign, signing 등의 클래스 배치
Buddy

@EnesBattal 당신은 그것을 구현하는 데 도움이 될 수 있습니다-그렇지 않으면 당신은 그것을 위해 apktool을 사용할 수 있습니다 .. 또는 안드로이드 도구와 zipalign / sign
polym

1
@lejonl 당신을위한 사형, 당신은 괴물!
polym

17

나는 사용했다

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. 포위하다
  4. APKTool

그러나 아무도 구글의 도구를 능가하지 않습니다.

1) Android Studio 2.x : 빌드> APK 분석 여기에 이미지 설명을 입력하십시오

2) Android Studio 3.0 : 프로파일 또는 디버그 APK 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


1
Enjarify를위한 플러스 1 개. 내 개인적인 경험에서, 그것은 d2j에 비해 더 나은 결과를 제공하는 것으로 입증되었습니다
qre0ct

15

아무도 이것을 언급하지 않았으므로 도구가 하나 더 있습니다. DED 홈페이지

방법 및 일부 설명을 설치하십시오 . 설치 .

그것은 최고 시장 앱의 보안에 대한 흥미로운 연구에서 사용되었습니다 (정말 궁금하지 않은 경우 실제로 관련이 없음) : Android 응용 프로그램 보안 조사


유망 해 보인다. Java 코드를 APK에서 직접 디 컴파일합니까? 난독 화 된 Java 코드는 어떻습니까?
sandalone

14

이후 Dheeraj Bhaskar의 대답은 지난 몇 년 상대적으로 오래되었습니다.

내 최신 (2019 년) 답변은 다음과 같습니다.

주요 논리

에서 dex~ java sourcecode까지 현재 두 가지 솔루션이 있습니다.

  • One Step: 직접 변환 dexjava sourcecode
  • Two Step: 첫 번째 변환 dexjar, 두 번째 변환 jarjava sourcecode

한 단계 솔루션 : dex직접에java sourcecode

도구

방법

  1. jadx-0.9.0.zip을 다운로드 하고 압축을 푼 다음 bin폴더 에서 명령 행 jadx또는 GUI 버전을 볼 수 있습니다. GUI 버전 jadx-gui을 두 번 클릭하여 실행하십시오.jadx-gui

  1. dex파일 열기

그런 다음 Java 소스 코드를 표시 할 수 있습니다.

  1. File -> save as gradle project

그런 다음 Java 소스 코드를 얻었습니다.


2 단계 솔루션

1 단계 : dexjar

도구

방법

dex2jar zip , unzip got을 다운로드 d2j-dex2jar.sh한 후 :

  • apk~까지 jar:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dex~까지 jar:sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex

예:

  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub8825612.dex
dex2jar com.huili.readingclub8825612.dex -> ./com.huili.readingclub8825612-dex2jar.jar
  v3.4.8 ll
-rw-------  1 crifan  staff   9.5M  3 21 10:00 com.huili.readingclub8825612-dex2jar.jar
-rw-------  1 crifan  staff   8.4M  3 19 14:04 com.huili.readingclub8825612.dex

2 단계 : jarjava sourcecode

도구

방법

여기 데모 Procyon는 jar를 Java 소스 코드로 변환합니다.

procyon-decompiler-0.5.34.jar 다운로드

그런 다음 구문을 사용하십시오.

java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName

예:

java -jar /Users/crifan/dev/dev_tool/android/reverse_engineering/Procyon/procyon-decompiler-0.5.34.jar -jar com.huili.readingclub8825612-dex2jar.jar -o com.huili.readingclub8825612

편집기 VSCode 를 사용하여 내 보낸 소스 코드를 열면 다음과 같습니다.

결론

변환의 정확성 : Jadx> Procyon> CRF>JD-GUI

권장 사용법 : (1 단계 솔루션) Jadx


더 자세한 설명은, 내 온라인 참조하시기 바랍니다 중국어 전자 책을 : 安卓应用的安全和破解


이상하지만이 명령을 통해 1 단계 (Windows에서 jar에서 디 컴파일하여 jar)를 실행하려고하면 dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex예외가 발생합니다.java.io.IOException: the src file not a .dex or zip file
Сергей

@ Сергей 당신이 시도 할 수 있습니다 : d2j-dex2jar.bat "D:\android\some_dex_file.dex"괜찮아요?
crifan

네, 정확히 시도 >d2j-dex2jar.bat file.dex했지만 괜찮습니다. 내 .dex파일이에서 복사 되었기 때문일 수 있습니다 dalvik-cache.
Сергей

1
@ Сергей 네, 가장 가능한 이유는 당신이 말한 dex is copied from dalvik-cache것입니다dex is decompiled from apk
crifan

@ crifan,이 답변에 감사드립니다. JADX는 인상적입니다. 다시 일하러 갈게 Emmanuel @ JD-Gui
Emmanuel Dupuy

13

APK 파일을 다운로드 한 후 편집 가능한 Java 코드 / 문서를 얻으려면 다음 단계를 수행해야합니다.

  1. APK 파일을 zip으로 변환하십시오 (다운로드는 "저장"옵션으로 이동하지 않고 "다른 이름으로 저장"으로 이동하고 확장자를 .zip으로 언급하십시오). APKTOOL을 피할 수 있습니다.
  2. zip 파일을 추출하면 somefilename.dex를 찾을 수 있습니다. 이제 우리는 dex-> ​​.class를 변환해야합니다.
  3. 그렇게하려면 "dex2jar"가 필요합니다 ( 추출 후 http://code.google.com/p/dex2jar/ 에서 다운로드 할 수 있음 ). 명령 프롬프트에서 [D : \ dex2jar-0.09> dex2jar somefilename.dex] (somefilename.dex는 dex2jar을 보관 한 폴더와 같은 폴더 안에 있어야합니다.)
  4. http://www.viralpatel.net/blogs/download/jad/jad.zip 에서 jad를 다운로드 하여 압축을 푸십시오. 압축이 풀리면 "jad.exe"와 "Readme.txt"와 같은 두 개의 파일을 볼 수 있습니다. "jad.exe"대신 "jad.txt"가있을 수 있으므로 확장자를 as.exe로 바꾸면됩니다.
  5. 마지막으로, 명령 프롬프트에서 [D : \ jad> jad -sjava yourfilename.class] 와 같이 언급 해야합니다. 클래스 파일을 편집 가능한 Java 문서로 구문 분석합니다.

8

Dedexer , 당신은 분해 할 수 .dex달빅 바이트 코드로 파일을 ( .ddx).

내가 아는 한 Java로 디 컴파일하는 것은 불가능합니다. 여기에서
dalvik 바이트 코드에 대해 읽을 수 있습니다 .


1
당신이 (현재) 가능하지 않다고 말하는 사람이기 때문에 받아 들여졌습니다.

@ 모든 것이 가능합니다. 당신이 그것을 어떻게 보는가에 달려 있습니다. 디 컴파일 가능하지만 생각한 방식이 아닐 수도 있습니다.
Alba Mendez

8

안드로이드 리버스 엔지니어링이 가능합니다 . 다음 단계에 따라 apk 파일에서 .java 파일을 가져 오십시오.

1 단계 . dex2jar 사용

  • .apk 파일에서 .jar 파일 생성
  • 명령 : dex2jar sampleApp.apk

2 단계 . JD-GUI를 사용하여 .jar 디 컴파일

  • .class 파일을 디 컴파일합니다. 즉, apk에서 .java를 난독 처리 합니다.

그러나 모든 디 컴파일 된 소스 코드를 다시 컴파일하면 실행되지 않으며 컴파일러는 많은 오류를 보여줍니다.

이클립스에서 실행됩니다 디 컴파일 안드로이드 자바 소스 코드를 사용할 수있는 솔루션이

2
리버스 엔지니어링 은 반드시 디 컴파일을 의미 하지는 않습니다 . 실제로 ProGuard가 난독 처리 된 JAR은 올바르게 디 컴파일하지 않습니다.
Alba Mendez

난독 처리 된 코드를 다루는 경우 분해 하는 것이 좋습니다. Java 소스는 ​​얻지 못하지만 항상 코드를 보거나 수정할 수 있습니다. 내 답변을 참조하십시오 .
Alba Mendez

디 컴파일과 디스 어셈블을 모두 수행하는 것이 좋습니다. 결과적으로 디 컴파일 된 코드는 이해하기 쉽지만 모든 수정은 디스 어셈블 된 버전으로 수행해야합니다. proguard가 사용 된 경우 특히 그렇습니다. jd-gui와 결합 된 dex2jar이 디 컴파일에 가장 적합하다는 것을 알았습니다.
Mikko Rantalainen

6

최근 데비안은 파이썬 패키지를 가지고 있습니다 androguard:

Description-en: full Python tool to play with Android files
 Androguard is a full Python tool to play with Android files.
  * DEX, ODEX
  * APK
  * Android's binary xml
  * Android resources
  * Disassemble DEX/ODEX bytecodes
  * Decompiler for DEX/ODEX files

해당 패키지를 설치하십시오.

sudo apt-get install androguard python-networkx

DEX 파일 디 컴파일 :

$ androdd -i classes.dex -o ./dir-for-output

classes.dexAPK에서 추출 + 디 컴파일 :

$ androdd -i app.apk -o ./dir-for-output

APK 파일은 JAR (Java Archive)에 지나지 않습니다. 다음을 통해 아카이브에서 파일을 추출 할 수 있습니다.

$ unzip app.apk -d ./dir-for-output

5

이 답변의 대부분이 게시 된 이후 많은 내용이 변경되었습니다. 요즘에는 GUI를 사용하여 다음과 같은 쉬운 도구가 많이 있습니다.

APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit

XDA 개발자 포럼에서 가장 좋은 곳을 찾을 수 있습니다.


4

JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler )를 사용해보십시오 . 이것은 DEX 디 컴파일을위한 완벽한 도구입니다.

그리고 그렇습니다. (my : 0)) 새 사이트 http://www.javadecompilers.com/apk/ 에서도 온라인으로 제공됩니다 .


대신 코드에서 사용할 수 있습니까? 안드로이드 자체에서도 의미가 있습니까? 그리고 여기 웹 사이트가 아닙니다 : github.com/skylot/jadx ?
안드로이드 개발자


2

안드로이드 앱을 디 컴파일하는 가장 쉬운 방법 은 playstore에서 ShowJava 라는 앱을 다운로드하는 것입니다. 응용 프로그램 목록에서 디 컴파일해야하는 응용 프로그램을 선택하십시오. 앱을 디 컴파일하는 데 사용할 수있는 세 가지 디 컴파일러가 있습니다.

CFR 0.110, JaDX 0.6.1 또는 FernFlower (분석 디 컴파일러).


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.