Come si possono decompilare i file Android DEX (VM bytecode) nel corrispondente codice sorgente Java?
Come si possono decompilare i file Android DEX (VM bytecode) nel corrispondente codice sorgente Java?
Risposte:
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.
Ed ecco la procedura su come decompilare:
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
.sh
script sono sostituiti da.bat
scriptNota 2: su linux / mac non dimenticare
sh
obash
. 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.X
directory, ad essudo chmod -R +x dex2jar-2.0
Apri il vaso in JD-GUI
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.
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.
./apktool d myprogram.apk
. Vedere la mia risposta .
Una versione più completa di Fred 's risposta :
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.
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 .
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
/ .class
come dex2jar
fa (apktool usa dex2jar credo). È anche open source e in fase di sviluppo attivo. Ha anche una GUI, per i fanatici della GUI. Provalo!
javac "$(find . -name '*.java')"
?
ho usato
Ma nessuno batte gli strumenti di Google
Dal momento che nessuno lo ha menzionato, c'è un altro strumento: la homepage di DED
Installa il tutorial e alcune spiegazioni: Installazione .
È stato utilizzato in uno studio piuttosto interessante sulla sicurezza delle migliori app di mercato (non realmente correlate, solo se sei curioso): un sondaggio sulla sicurezza delle applicazioni Android
Dheeraj Bhaskar
La risposta di Since è relativamente vecchia come molti anni fa.
Ecco la mia ultima risposta (anno 2019):
da dex
a java sourcecode
, attualmente ha due tipi di soluzione:
One Step
: converti direttamente dex
injava sourcecode
Two Step
: prima conversione dex
in jar
, seconda conversione jar
injava sourcecode
dex
direttamente ajava sourcecode
bin
cartella puoi vedere la riga di comando jadx
o la versione della GUI jadx-gui
, fai doppio clic per eseguire la versione della GUI:jadx-gui
dex
file apertoquindi può mostrare il codice sorgente Java:
File
-> save as gradle project
quindi ho ottenuto Java codice sorgente:
dex
ajar
scarica dex2jar zip , decomprimilo ottenuto d2j-dex2jar.sh
, quindi:
apk
a jar
:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
a 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
jar
ajava sourcecode
many
codice decompilerà l'erroreminor
codice decompilerà l'erroreno
errore di decompilazione del codice
Procyon
qui demo Procyon
converti 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:
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 : 安卓 应用 的 安全 和 破解
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex
ho appena ricevuto un'eccezione:java.io.IOException: the src file not a .dex or zip file
d2j-dex2jar.bat "D:\android\some_dex_file.dex"
va bene o no?
>d2j-dex2jar.bat file.dex
ma non è ok. forse è perché il mio .dex
file è stato copiato dalvik-cache
?
dex is copied from dalvik-cache
, dovrebbe esseredex is decompiled from apk
Una volta scaricato il file APK, è necessario eseguire le seguenti operazioni per ottenere un codice / documento java modificabile.
Con Dedexer , puoi smontare il .dex
file in byvode bytecode ( .ddx
).
Decompilare verso Java non è possibile per quanto ne so.
Puoi leggere il bytecode di dalvik qui .
Android Reverse Engineering è possibile . Seguire questi passaggi per ottenere il file .java dal file apk.
Passo 1 . Usando dex2jar
dex2jar sampleApp.apk
Passo 2 . Decompilare .jar usando JD-GUI
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.dex
da 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
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.
Potresti provare JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ), questo è uno strumento perfetto per la decompilazione DEX.
E sì, è anche disponibile online sul (mio: 0) nuovo sito: http://www.javadecompilers.com/apk/
Questo può essere fatto nei seguenti cinque passaggi:
Questa gemma fa queste cose per te automaticamente anche l'installazione degli strumenti richiesti
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).
Se non stai cercando di scaricare dex2jar, usa semplicemente lo apk_grabber
script python per decompilare qualsiasi apk in file jar. Quindi li leggi con jd-gui.