decompilare DEX in codice sorgente Java


706

Come si possono decompilare i file Android DEX (VM bytecode) nel corrispondente codice sorgente Java?


Dai un'occhiata qui . Otterrai possibili contatti da lì per andare avanti.
Kevin Boyd,

Informazioni aggiornate sono disponibili sul blog dell'hub di programmatori: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md Mohsin,

Se hai soldi, acquista jeb , altrimenti usa jadx , vedi qui perché
polym

C'è un nuovo plateform croce (java) e strumento open source, che consentono di farlo, solo cassa bytecodeviewer: stackoverflow.com/a/36557898/795245
Gomino

Risposte:


881

È facile

Ottieni questi strumenti:

1) dex2jar per tradurre i file dex in file jar

2) jd-gui per visualizzare i file java nel vaso

Il codice sorgente è abbastanza leggibile poiché dex2jar effettua alcune ottimizzazioni.

Procedura:

Ed ecco la procedura su come decompilare:

Passo 1:

Converti 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

Nota 1: nei computer Windows tutti gli .shscript sono sostituiti da .batscript

Nota 2: su linux / mac non dimenticare sho bash. Il comando completo dovrebbe essere:

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

Nota 3: Ricorda inoltre di aggiungere l'autorizzazione di esecuzione alla dex2jar-X.Xdirectory, ad essudo chmod -R +x dex2jar-2.0

documentazione dex2jar

Passo 2:

Apri il vaso in JD-GUI

La fonte decompilata


57
+1. Ho provato sia Baksmali che Dex2jar. Dex2Jar + JD-Gui vince per averti fornito un codice sorgente perfettamente leggibile per la maggior parte dei file .dex.
Jonathan Dumaine,

ciao, vuoi condividere il tuo modo di andare? Te ne sarò molto grato.
Arslan Anwar,

2
La frase sopra ha suonato un campanello - sembra essere una semi-citazione da qui: geeknizer.com/decompile-reverse-engineer-android-apk (o viceversa?). Gli articoli collegati spiegano brevemente gli strumenti sopra menzionati, nonché Smali e APKTool.
AgentKnopf,

2
@JonathanDumaine che dipende. Se i JAR sono offuscati e si desidera apportare piccole modifiche, Backsmali è l'unica strada da percorrere. Bonus! Con APKTool puoi anche recuperare tutti gli XML, le immagini e le altre risorse. Vedere la mia risposta .
Alba Mendez,

3
@JonathanDumaine Sono d'accordo con jmendeth, apktool è anche la strada da percorrere se vuoi decompilare il tuo apk, modificarlo e quindi ricompilarlo. Mentre usi dex2jar e jd-gui i sorgenti sono davvero leggibili ma non puoi ricompilare senza errori!
Darkheir,

138

Per chiarire un po ', ci sono due percorsi principali che potresti seguire qui a seconda di ciò che vuoi realizzare:

Decompilare il bytecode Dalvik (dex) in sorgente Java leggibile. Puoi farlo facilmente con dex2jar e jd-gui , come dice Fred . La fonte risultante è utile per leggere e comprendere la funzionalità di un'app, ma probabilmente non produrrà un codice utilizzabile al 100%. In altre parole, puoi leggere la fonte, ma non puoi davvero modificarla e riconfezionarla. Nota che se la fonte è stata offuscata con proguard, il codice sorgente risultante sarà sostanzialmente più difficile da districare.

L'altra alternativa importante è smontare il bytecode in smali , un linguaggio di assemblaggio progettato proprio per questo scopo. Ho scoperto che il modo più semplice per farlo è con apktool . Una volta installato apktool, puoi semplicemente puntarlo su un file apk e otterrai un file smali per ogni classe contenuta nell'applicazione. Puoi leggere e modificare smali o persino sostituire completamente le classi generando smali da una nuova fonte Java (per fare ciò, potresti compilare la tua fonte .java in file .class con javac, quindi convertire i tuoi file .class in file .dex con Android compilatore dx e quindi utilizzare baksmali (smali disassembler) per convertire i file .dex in .smali, come descritto in questa domanda. Potrebbe esserci un collegamento qui). Una volta terminato, puoi facilmente impacchettare nuovamente l'apk con apktool. Nota che apktool non firma l'apk risultante, quindi dovrai prenderti cura di esso proprio come qualsiasi altra applicazione Android .

Se segui il percorso smali, potresti provare APK Studio , un IDE che automatizza alcuni dei passaggi precedenti per aiutarti a decompilare e ricompilare un apk e installarlo su un dispositivo.

In breve, le tue scelte sono praticamente di decompilare in Java, che è più leggibile ma probabilmente irreversibile, o di smontare in smali, che è più difficile da leggere ma molto più flessibile per apportare modifiche e riconfezionare un'app modificata. L'approccio scelto dipenderà da ciò che stai cercando di raggiungere.

Infine, anche il suggerimento di osare è degno di nota. È uno strumento di retargeting per convertire i file .dex e .apk in file .class java, in modo che possano essere analizzati utilizzando i tipici strumenti di analisi statica java.


61

In realtà consiglierei di andare qui: https://github.com/JesusFreke/smali

Fornisce BAKSMALI, che è un eccellente strumento di reverse engineering per i file DEX. È realizzato da JesusFreke, il ragazzo che ha creato le famose ROM per Android.


3
smali è un linguaggio simile ad un assembly basato su dalvik IL, non può essere tradotto direttamente in Java.
reflog

@endryha Non ci sono strumenti in grado di farlo. Vedi questa domanda per maggiori informazioni.
Alba Mendez,

1
Codice, codice, codice, ... Perché solo codice? Se usi APKTool avrai tutto indietro! Ed è semplice come ./apktool d myprogram.apk. Vedere la mia risposta .
Alba Mendez,

30

Una versione più completa di Fred 's risposta :

Modo manuale

Innanzitutto è necessario uno strumento per estrarre tutte le classi (compilate) sul DEX in un JAR.
Ce n'è uno chiamato dex2jar , realizzato da uno studente cinese.

Quindi, è possibile utilizzare jd-gui per decompilare le classi sul JAR in codice sorgente.
La fonte risultante dovrebbe essere abbastanza leggibile, poiché dex2jar applica alcune ottimizzazioni.

Modo automatico

Puoi usare APKTool . Sarà automaticamente estrarre tutte le classi ( .dex), risorse ( .asrc), allora verrà convertito XML binario a XML leggibile , e sarà anche DISSASSEMBLARE le classi per voi.
Lo smontaggio sarà sempre più robusto del decompilare, specialmente con i
JAR offuscati con Pro Guard!

Basta dire a APKTool di decodificare l'APK in una directory, quindi modificare ciò che si desidera
e infine codificarlo nuovamente in un APK. È tutto.

Importante: smontaggio di APKTool . Non si decompila .
Il codice generato non sarà sorgente Java.
Ma dovresti essere in grado di leggerlo e persino modificarlo se hai familiarità con Jasmin .
Se si desidera l'origine Java, consultare il manuale .


25

A volte si ottiene il codice rotto, quando si utilizza dex2jar/ apktool, in particolare nei loop. Per evitare ciò, usa jadx , che decompila il bytecode dalvik nel codice sorgente java, senza creare prima un file .jar/ .classcome dex2jarfa (apktool usa dex2jar credo). È anche open source e in fase di sviluppo attivo. Ha anche una GUI, per i fanatici della GUI. Provalo!


Suppongo che jadx non abbia l'opzione di compilazione ma il codice è leggibile però
Buddy,

@EnesBattal vuoi dire javac "$(find . -name '*.java')"?
polimero

che ne dici di formare un apk? inserendo lezioni in apk, zipalign, firma ecc.
Buddy,

@EnesBattal Beh, puoi aiutare a implementarlo - altrimenti potresti usare apktool per quello .. o zipalign / sign con gli strumenti android
polym

1
@lejonl Pena di morte per te, mostro!
polimero

17

ho usato

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

Ma nessuno batte gli strumenti di Google

1) Android Studio 2.x: build> analizza apk inserisci qui la descrizione dell'immagine

2) Android Studio 3.0: APK profilo o debug inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


1
Più uno per Enjarify. Nella mia esperienza personale, ha dimostrato di dare risultati migliori rispetto a d2j
qre0ct


14

Dheeraj BhaskarLa risposta di Since è relativamente vecchia come molti anni fa.

Ecco la mia ultima risposta (anno 2019):

Logica principale

da dexa java sourcecode, attualmente ha due tipi di soluzione:

  • One Step: converti direttamente dexinjava sourcecode
  • Two Step: prima conversione dexin jar, seconda conversione jarinjava sourcecode

Soluzione in un solo passaggio: dexdirettamente ajava sourcecode

Utensili

Processi

  1. scarica jadx-0.9.0.zip , decomprimilo, nella bincartella puoi vedere la riga di comando jadxo la versione della GUI jadx-gui, fai doppio clic per eseguire la versione della GUI:jadx-gui

  1. dexfile aperto

quindi può mostrare il codice sorgente Java:

  1. File -> save as gradle project

quindi ho ottenuto Java codice sorgente:


Soluzione in due passaggi

Step1: dexajar

Utensili

Processi

scarica dex2jar zip , decomprimilo ottenuto d2j-dex2jar.sh, quindi:

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

esempio:

  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

Step2: jarajava sourcecode

Utensili

Processi

qui demo Procyonconverti jar in codice sorgente java:

scarica procyon-decompiler-0.5.34.jar

quindi usando la sintassi:

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

esempio:

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

usando l'editor VSCode per aprire il codice sorgente esportato, assomigliare a questo:

Conclusione

Correttezza di conversione: Jadx> Procyon> CRF>JD-GUI

Consiglia l'uso: (Soluzione a un passaggio) Jadx


per una spiegazione più dettagliata, si prega di fare riferimento al mio ebook cinese online : 安卓 应用 的 安全 和 破解


strano, ma se provo a eseguire 1 passaggio (dex to jar decompilare su Windows) tramite questo comando dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexho appena ricevuto un'eccezione:java.io.IOException: the src file not a .dex or zip file
Сергей,

@ Сергей potresti provare: d2j-dex2jar.bat "D:\android\some_dex_file.dex"va bene o no?
Crifan,

si, ci ho provato esattamente >d2j-dex2jar.bat file.dexma non è ok. forse è perché il mio .dexfile è stato copiato dalvik-cache?
Сергей,

1
@ Сергей sì, il motivo più possibile è il tuo detto dex is copied from dalvik-cache, dovrebbe esseredex is decompiled from apk
crifan

@crifan, grazie per questa risposta. JADX è impressionante. torno al lavoro. Emmanuel @ JD-Gui
Emmanuel Dupuy il

13

Una volta scaricato il file APK, è necessario eseguire le seguenti operazioni per ottenere un codice / documento java modificabile.

  1. Converti il ​​tuo file apk in zip (mentre avvia il download non andare con l'opzione "salva", basta andare con "salva come" e menzionare la tua estensione come .zip) facendo in questo modo potresti evitare APKTOOL ...
  2. Estrai il file zip, lì puoi trovare somefilename.dex. quindi ora dobbiamo convertire dex -> .class
  3. Per fare ciò, hai bisogno di "dex2jar" (puoi scaricarlo da http://code.google.com/p/dex2jar/ , dopo averlo estratto, nel prompt dei comandi devi menzionare come, [D: \ dex2jar-0.09> dex2jar somefilename.dex] ( tieni presente che il tuo somefilename.dex deve trovarsi nella stessa cartella in cui hai mantenuto dex2jar.)
  4. Scarica jad da http://www.viralpatel.net/blogs/download/jad/jad.zip ed estrailo. Una volta estratto puoi vedere due file come "jad.exe" e "Readme.txt" (a volte "jad.txt" potrebbe essere lì invece di "jad.exe", quindi basta rinominare l'estensione as.exe per l'esecuzione)
  5. Infine, nel prompt dei comandi devi menzionare come [D: \ jad> jad -sjava yourfilename.class] che analizzerà il tuo file di classe in documento java modificabile.

8

Con Dedexer , puoi smontare il .dexfile in byvode bytecode ( .ddx).

Decompilare verso Java non è possibile per quanto ne so.
Puoi leggere il bytecode di dalvik qui .


1
accettato dal momento che sei tu a dire che non è (attualmente) possibile, il che sembra vero.
Will,

@Sarà tutto possibile. Dipende solo da come lo vedi. La decompilazione è possibile, ma forse non nel modo in cui stai pensando.
Alba Mendez,

8

Android Reverse Engineering è possibile . Seguire questi passaggi per ottenere il file .java dal file apk.

Passo 1 . Usando dex2jar

  • Genera file .jar dal file .apk
  • comando: dex2jar sampleApp.apk

Passo 2 . Decompilare .jar usando JD-GUI

  • decompila i file .class, ovvero, verremo offuscati .java dall'apk.

Ma se compilo di nuovo tutto il codice sorgente decompilato, non verrà eseguito, il compilatore mostra molti errori.

c'è qualche soluzione disponibile per decompilare il codice sorgente Android Java verrà eseguito in eclipse

2
Reverse Engineering non non necessariamente la decompilazione . In effetti, i JAR offuscati da ProGuard non si decompilano correttamente.
Alba Mendez,

Se hai a che fare con il codice offuscato , è meglio smontarlo . Non otterrai il sorgente Java, ma sarai sempre in grado di vedere / modificare il codice. Vedere la mia risposta .
Alba Mendez,

Consiglierei di fare sia la decompilazione che lo smontaggio. Il codice decompilato risultante è più facile da capire ma tutte le modifiche devono essere fatte con la versione disassemblata. Soprattutto se è stato usato proguard. Trovo che dex2jar combinato con jd-gui sia il migliore per la decompilazione.
Mikko Rantalainen l'

6

Debian recente ha un pacchetto Python 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

Installa i pacchetti corrispondenti:

sudo apt-get install androguard python-networkx

Decompila file DEX:

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

Estratto classes.dexda Apk + Decompile:

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

Il file apk non è altro che l'archivio Java (JAR), è possibile estrarre i file dall'archivio tramite:

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

5

Sono cambiate molte cose da quando sono state pubblicate la maggior parte di queste risposte. Al giorno d'oggi ci sono molti semplici strumenti con la GUI, come questi:

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

Il posto migliore per trovarli è sul forum degli sviluppatori XDA.




2

Il metodo più semplice per decompilare un'app Android è scaricare un'app denominata ShowJava dal playstore. Basta selezionare l'applicazione che deve essere decompilata dall'elenco delle applicazioni. Esistono tre diversi decompilatori che è possibile utilizzare per decompilare un'app, ovvero:

CFR 0.110, JaDX 0.6.1 o FernFlower (decompilatore analitico).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.