DEX in Java-Quellcode dekompilieren

706

Wie kann man Android DEX-Dateien (VM Bytecode) in entsprechenden Java-Quellcode dekompilieren?

Wille
quelle
Schauen Sie hier . Von dort erhalten Sie mögliche Hinweise, um weiterzumachen.
Kevin Boyd
Aktualisierte Informationen sind auf dem Blog des Codierer-Hubs verfügbar: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md Mohsin
Wenn Sie Geld haben, kaufen Sie Jeb , sonst verwenden Sie Jadx , sehen Sie hier, warum
Polym
Es gibt eine neue Cross-Plateform (Java) und ein Open-Source-Tool, mit denen Sie dies tun können. Überprüfen
Gomino

Antworten:

881

Es ist einfach

Holen Sie sich diese Tools:

1) dex2jar zum Übersetzen von Dex-Dateien in JAR-Dateien

2) jd-gui , um die Java-Dateien im Glas anzuzeigen

Der Quellcode ist gut lesbar, da dex2jar einige Optimierungen vornimmt.

Verfahren:

Und hier ist das Verfahren zum Dekompilieren:

Schritt 1:

Konvertieren Sie classes.dex in test_apk-debug.apk in 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

Hinweis 1: Auf den Windows-Computern werden alle .shSkripte durch .batSkripte ersetzt

Hinweis 2: Vergessen Sie unter Linux / Mac nicht shoder bash. Der vollständige Befehl sollte lauten:

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

Hinweis 3: Denken Sie auch daran, dem dex2jar-X.XVerzeichnis eine Ausführungsberechtigung hinzuzufügen, zsudo chmod -R +x dex2jar-2.0

dex2jar Dokumentation

Schritt 2:

Öffnen Sie das Glas in JD-GUI

Die dekompilierte Quelle

Dheeraj Bhaskar
quelle
57
+1. Ich habe sowohl Baksmali als auch Dex2jar ausprobiert. Dex2Jar + JD-Gui gewinnt dafür, dass Sie für die meisten .dex-Dateien perfekt lesbaren Quellcode erhalten.
Jonathan Dumaine
Hallo, teilen Sie uns bitte Ihren Weg mit. Ich werde Ihnen sehr dankbar sein.
Arslan Anwar
2
Der obige Satz hat geklingelt - es scheint ein halbes Zitat von hier zu sein: geeknizer.com/decompile-reverse-engineer-android-apk (oder umgekehrt?). In den verlinkten Artikeln werden die oben genannten Tools sowie Smali und APKTool kurz erläutert.
AgentKnopf
2
@ JonathanDumaine das kommt darauf an. Wenn die JARs verschleiert sind und Sie kleine Änderungen vornehmen möchten, ist Backsmali der einzige Weg. Bonus! Mit APKTool erhalten Sie auch alle XMLs, Bilder und anderen Ressourcen zurück. Siehe meine Antwort .
Alba Mendez
3
@ JonathanDumaine Ich stimme jmendeth zu, apktool ist auch der richtige Weg, wenn Sie Ihre apk dekompilieren, ändern und dann neu kompilieren möchten. Während Sie dex2jar und jd-gui verwenden, ist die Quelle wirklich lesbar, aber Sie können ohne einige Fehler nicht neu kompilieren!
Darkheir
138

Um etwas zu verdeutlichen, gibt es zwei Hauptpfade, die Sie hier einschlagen können, je nachdem, was Sie erreichen möchten:

Dekompilieren Sie den Dalvik-Bytecode (Dex) in eine lesbare Java-Quelle. Sie können dies leicht mit dex2jar und jd-gui tun , wie Fred erwähnt. Die resultierende Quelle ist nützlich, um die Funktionalität einer App zu lesen und zu verstehen, erzeugt jedoch wahrscheinlich keinen 100% verwendbaren Code. Mit anderen Worten, Sie können die Quelle lesen, aber nicht wirklich ändern und neu verpacken. Beachten Sie, dass der resultierende Quellcode wesentlich schwieriger zu entwirren ist, wenn die Quelle mit Proguard verschleiert wurde.

Die andere wichtige Alternative besteht darin, den Bytecode in smali zu zerlegen , eine Assemblersprache, die genau für diesen Zweck entwickelt wurde. Ich habe festgestellt, dass der einfachste Weg, dies zu tun, mit apktool ist . Sobald Sie apktool installiert haben, können Sie es einfach auf eine apk-Datei verweisen und Sie erhalten eine kleine Datei für jede in der Anwendung enthaltene Klasse zurück. Sie können die smali lesen und ändern oder sogar Klassen vollständig ersetzen, indem Sie smali aus einer neuen Java-Quelle generieren (dazu können Sie Ihre .java-Quelle mit javac in .class-Dateien kompilieren und dann Ihre .class-Dateien mit Android in .dex-Dateien konvertieren dx-Compiler, und verwenden Sie dann baksmali (smali disassembler), um den .dex in .smali-Dateien zu konvertieren, wie in dieser Frage beschrieben. Möglicherweise gibt es hier eine Verknüpfung. Sobald Sie fertig sind, können Sie die apk einfach wieder mit apktool sichern. Beachten Sie, dass apktool die resultierende apk nicht signiert, daher müssen Sie sich wie bei jeder anderen Android-Anwendung darum kümmern .

Wenn Sie sich für Smali entscheiden, sollten Sie APK Studio ausprobieren , eine IDE, die einige der oben genannten Schritte automatisiert, um Sie beim Dekompilieren und Neukompilieren einer APK und beim Installieren auf einem Gerät zu unterstützen.

Kurz gesagt, Sie haben die Wahl, entweder in Java zu dekompilieren, das besser lesbar, aber wahrscheinlich irreversibel ist, oder in Smali zu zerlegen, das schwerer zu lesen, aber viel flexibler ist, um Änderungen vorzunehmen und eine modifizierte App neu zu verpacken. Welchen Ansatz Sie wählen, hängt davon ab, was Sie erreichen möchten.

Schließlich ist auch der Vorschlag der Pflicht zu beachten. Es ist ein Retargeting-Tool zum Konvertieren von .dex- und .apk-Dateien in Java .class-Dateien, damit sie mit typischen statischen Java-Analysetools analysiert werden können.

Zach Lipton
quelle
61

Ich würde eigentlich empfehlen, hierher zu gehen: https://github.com/JesusFreke/smali

Es bietet BAKSMALI, ein hervorragendes Reverse-Engineering-Tool für DEX-Dateien. Es wurde von JesusFreke gemacht, dem Typ, der die berühmten ROMs für Android erstellt hat.

reflog
quelle
3
smali ist eine Assembler-ähnliche Sprache, die auf dalvik IL basiert. Sie kann nicht direkt nach Java übersetzt werden.
Reflog
@endryha Dafür gibt es keine Tools. Weitere Informationen finden Sie in dieser Frage .
Alba Mendez
1
Code, Code, Code, ... Warum nur Code? Wenn Sie APKTool verwenden, erhalten Sie alles zurück! Und es ist so einfach wie ./apktool d myprogram.apk. Siehe meine Antwort .
Alba Mendez
30

Eine vollständigere Version von fred ‚s Antwort :

Manueller Weg

Zuerst benötigen Sie ein Tool, um alle (kompilierten) Klassen im DEX in eine JAR zu extrahieren .
Es gibt eine namens dex2jar , die von einem chinesischen Studenten hergestellt wird.

Dann können Sie mit jd-gui dekompilieren die Klassen auf der JAR - Quellcode.
Die resultierende Quelle sollte gut lesbar sein, da dex2jar einige Optimierungen anwendet.

Automatischer Weg

Sie können APKTool verwenden . Es wird automatisch alle Klassen extrahieren ( .dex), Ressourcen ( .asrc), dann wird es konvertieren binäre XML zu den Menschen lesbaren XML , und es wird auch ZERLEGEN die Klassen für Sie.
Die Demontage ist immer robuster als das Dekompilieren, insbesondere bei
JARs, die mit Pro Guard verschleiert sind!

Weisen Sie APKTool einfach an , die APK in ein Verzeichnis zu dekodieren , dann die gewünschten Änderungen vorzunehmen
und sie schließlich wieder in eine APK zu kodieren . Das ist alles.

Wichtig: APKTool zerlegt . Es dekompiliert nicht .
Der generierte Code ist keine Java-Quelle.
Aber Sie sollten es lesen und sogar bearbeiten können, wenn Sie mit Jasmin vertraut sind .
Wenn Sie eine Java-Quelle wünschen, gehen Sie bitte den manuellen Weg durch .

Alba Mendez
quelle
25

Manchmal wird bei der Verwendung von dex2jar/ Code beschädigt apktool, insbesondere in Schleifen. Um dies zu vermeiden, verwenden Sie jadx , das Dalvik-Bytecode in Java-Quellcode dekompiliert, ohne zuvor eine .jar/ .class-Datei zu erstellen dex2jar(apktool verwendet dex2jar, glaube ich). Es ist auch Open Source und befindet sich in der aktiven Entwicklung. Es hat sogar eine GUI für GUI-Fanatiker. Versuch es!

polym
quelle
Ich nehme an, Jadx hat keine Kompilierungsoption, aber der Code ist zwar lesbar
Buddy
@EnesBattal meinst du wie javac "$(find . -name '*.java')"?
Polym
Wie wäre es mit einer Apk? Platzieren von Klassen in apk, zipalign, signieren usw.
Buddy
@EnesBattal Nun, Sie können helfen, das zu implementieren - sonst könnten Sie Apktool dafür verwenden .. oder Zipalign / Sign mit den Android-Tools
Polym
1
@lejonl Todesstrafe für dich, du Monster!
Polym
17

Ich habe benutzt

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. enjarify
  4. Apktool

Aber keines schlägt Googles eigene Tools

1) Android Studio 2.x: bauen> apk analysieren Geben Sie hier die Bildbeschreibung ein

2) Android Studio 3.0: Profil oder Debug APK Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

ishandutta2007
quelle
1
Plus eins für Enjarify. Nach meiner persönlichen Erfahrung hat es sich als besser erwiesen als d2j
qre0ct
14

Da ist Dheeraj Bhaskardie Antwort relativ alt wie viele Jahre zuvor.

Hier ist meine letzte Antwort (Jahr 2019):

Hauptlogik

von dexbis java sourcecodehat derzeit zwei Arten von Lösungen:

  • One Step: direkt konvertieren dexnachjava sourcecode
  • Two Step: erstens konvertieren dexnach jar, zweitens konvertieren jarnachjava sourcecode

Ein-Schritt-Lösung: dexdirekt zujava sourcecode

Werkzeuge

Prozess

  1. Laden Sie jadx-0.9.0.zip herunter , entpacken Sie es, im binOrdner wird die Befehlszeile jadxoder die GUI-Version angezeigt . Doppelklicken Sie, jadx-guium die GUI-Version auszuführen:jadx-gui

  1. dexDatei öffnen

kann dann Java-Quellcode anzeigen:

  1. File -> save as gradle project

dann bekam Java-Quellcode:


Zweistufige Lösung

Schritt 1: dexbisjar

Werkzeuge

Prozess

dex2jar zip herunterladen , entpacken d2j-dex2jar.sh, dann:

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

Beispiel:

  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

Schritt 2: jarbisjava sourcecode

Werkzeuge

Prozess

hier Demo Procyonkonvertieren jar in Java-Quellcode:

Laden Sie procyon-decompiler-0.5.34.jar herunter

dann mit Syntax:

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

Beispiel:

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

Mit dem Editor VSCode zum Öffnen des exportierten Quellcodes sehen Sie folgendermaßen aus:

Fazit

Umwandlung Korrektheit: Jadx> Procyon> CRF>JD-GUI

Empfohlene Verwendung: (Ein-Schritt-Lösung) Jadx


Weitere Informationen finden Sie in meinem chinesischen Online- eBook: 安卓 应用 的 安全 和 破解

Crifan
quelle
seltsam, aber wenn ich versuche , 1 Schritt (dex zu jar decompile auf Windows) über diesen Befehl auszuführen , dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexnur bekam Ausnahme:java.io.IOException: the src file not a .dex or zip file
Сергей
@ Сергей könnten Sie versuchen: d2j-dex2jar.bat "D:\android\some_dex_file.dex"ist in Ordnung oder nicht?
Crifan
Ja, ich habe es genau versucht, >d2j-dex2jar.bat file.dexaber es ist nicht in Ordnung. Vielleicht liegt es daran, dass meine .dexDatei kopiert wurde dalvik-cache?
Сергей
1
@ Йергей ja, der wahrscheinlichste Grund ist Ihr gesagt dex is copied from dalvik-cache, sollte seindex is decompiled from apk
Crifan
@crifan, danke für diese Antwort. JADX ist beeindruckend. Ich werde wieder arbeiten. Emmanuel @ JD-Gui
Emmanuel Dupuy
13

Nachdem Sie Ihre APK-Datei heruntergeladen haben, müssen Sie die folgenden Schritte ausführen, um einen bearbeitbaren Java-Code / ein bearbeitbares Java-Dokument zu erhalten.

  1. Konvertieren Sie Ihre apk-Datei in zip (während Sie den Download starten, gehen Sie nicht mit der Option "Speichern", sondern mit "Speichern unter" und geben Sie Ihre Erweiterung als .zip an), indem Sie auf diese Weise APKTOOL vermeiden ...
  2. Extrahieren Sie die Zip-Datei, dort finden Sie somefilename.dex. Jetzt müssen wir dex -> .class konvertieren
  3. Dazu benötigen Sie "dex2jar" (Sie können es von http://code.google.com/p/dex2jar/ herunterladen. Nach dem Extrahieren müssen Sie in der Eingabeaufforderung Folgendes angeben: [D: \ dex2jar-0.09> dex2jar somefilename.dex] ( Beachten Sie, dass sich Ihre somefilename.dex in demselben Ordner befinden muss, in dem Sie Ihre dex2jar aufbewahrt haben.)
  4. Laden Sie jad von http://www.viralpatel.net/blogs/download/jad/jad.zip herunter und extrahieren Sie es. Nach dem Extrahieren sehen Sie zwei Dateien wie "jad.exe" und "Readme.txt" (manchmal kann dort "jad.txt" anstelle von "jad.exe" angezeigt werden. Benennen Sie die Erweiterung einfach in ".exe" um, um sie auszuführen.)
  5. Schließlich müssen Sie in der Eingabeaufforderung wie [D: \ jad> jad -sjava yourfilename.class] angeben , dass Ihre Klassendatei in ein bearbeitbares Java-Dokument analysiert wird.
Kamal
quelle
8

Mit Dedexer können Sie die .dexDatei in dalvik bytecode ( .ddx) zerlegen .

Eine Dekompilierung in Richtung Java ist meines Wissens nicht möglich.
Sie können über Dalvik Bytecode lesen hier .

hcpl
quelle
1
akzeptiert, da Sie derjenige sind, der sagt, dass es (derzeit) nicht möglich ist, was wahr scheint.
Will
@Will ist alles möglich. Kommt nur darauf an, wie du es siehst. Dekompilieren ist möglich, aber vielleicht nicht so, wie Sie es sich vorstellen.
Alba Mendez
8

Android Reverse Engineering ist möglich . Befolgen Sie diese Schritte, um die Java-Datei aus der APK-Datei abzurufen.

Schritt 1 . Verwenden von dex2jar

  • Generieren Sie eine JAR-Datei aus einer APK-Datei
  • Befehl : dex2jar sampleApp.apk

Schritt 2 . Dekompilieren von .jar mithilfe der JD-GUI

  • es dekompiliert die .class-Dateien, dh wir werden .java von der apk zurück verschleiert .
gtiwari333
quelle
Aber wenn ich den gesamten dekompilierten Quellcode erneut kompiliere, wird er nicht ausgeführt, der Compiler zeigt viele Fehler.
2
Reverse Engineering bedeutet nicht unbedingt Dekompilierung . Tatsächlich werden von ProGuard verschleierte JARs nicht korrekt dekompiliert.
Alba Mendez
Wenn Sie mit verschleiertem Code arbeiten, ist es besser, ihn einfach zu zerlegen . Sie erhalten keine Java-Quelle, können den Code jedoch immer anzeigen / ändern. Siehe meine Antwort .
Alba Mendez
Ich würde empfehlen, sowohl zu dekompilieren als auch zu zerlegen. Der resultierende dekompilierte Code ist leichter zu verstehen, aber alle Änderungen müssen mit einer disassemblierten Version vorgenommen werden. Besonders wahr, wenn Proguard verwendet wurde. Ich finde, dass dex2jar in Kombination mit jd-gui am besten zum Dekompilieren geeignet ist.
Mikko Rantalainen
6

Aktuelle Debian haben Python-Paket 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

Installieren Sie die entsprechenden Pakete:

sudo apt-get install androguard python-networkx

DEX-Datei dekompilieren:

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

Auszug classes.dexaus Apk + Decompile:

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

Apk-Datei ist nichts anderes als Java-Archiv (JAR). Sie können Dateien aus dem Archiv extrahieren über:

$ unzip app.apk -d ./dir-for-output
Gavenkoa
quelle
5

Seit die meisten dieser Antworten veröffentlicht wurden, hat sich viel geändert. Heutzutage gibt es viele einfache Tools mit GUIs, wie diese:

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

Der beste Ort, um sie zu finden, ist das XDA Developers Forum.

MPaulo
quelle
2

Die einfachste Methode zum Dekompilieren einer Android-App ist das Herunterladen einer App namens ShowJava aus dem Playstore. Wählen Sie einfach die Anwendung, die dekompiliert werden soll, aus der Liste der Anwendungen aus. Es gibt drei verschiedene Dekompiler, mit denen Sie eine App dekompilieren können:

CFR 0.110, JaDX 0.6.1 oder FernFlower (analytischer Dekompiler).

Rishabh Maurya
quelle
1

Wenn Sie dex2jar nicht herunterladen möchten, verwenden Sie einfach das apk_grabberPython-Skript, um apk in jar-Dateien zu dekompilieren. Dann liest du sie mit jd-gui.

Jeff Brateman
quelle