Como descompilar arquivos do Android DEX (VM bytecode) no código-fonte Java correspondente?
Como descompilar arquivos do Android DEX (VM bytecode) no código-fonte Java correspondente?
Respostas:
Obtenha estas ferramentas:
1) dex2jar para converter arquivos dex em arquivos jar
2) jd-gui para visualizar os arquivos java no jar
O código fonte é bastante legível, pois o dex2jar faz algumas otimizações.
E aqui está o procedimento sobre como descompilar:
Converta classes.dex em test_apk-debug.apk em 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: Nas máquinas Windows, todos os
.sh
scripts são substituídos por.bat
scriptsNota 2: No linux / mac, não esqueça
sh
oubash
. O comando completo deve ser:
sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
Nota 3: Lembre-se também de adicionar permissão de execução ao
dex2jar-X.X
diretório, por exemplosudo chmod -R +x dex2jar-2.0
Abra o jar no JD-GUI
Para esclarecer um pouco, existem dois caminhos principais que você pode seguir aqui, dependendo do que deseja realizar:
Descompile o bytecode Dalvik (dex) na fonte Java legível. Você pode fazer isso facilmente com dex2jar e jd-gui , como fred menciona. A fonte resultante é útil para ler e entender a funcionalidade de um aplicativo, mas provavelmente não produzirá código 100% utilizável. Em outras palavras, você pode ler a fonte, mas não pode realmente modificá-la e reembalá-la. Observe que, se a fonte foi ofuscada com o programa, o código fonte resultante será substancialmente mais difícil de desembaraçar.
A outra alternativa importante é desmontar o bytecode para smali , uma linguagem assembly projetada exatamente para esse fim. Descobri que a maneira mais fácil de fazer isso é com o apktool . Depois de instalar o apktool, basta apontá-lo para um arquivo apk e você receberá um arquivo smali para cada classe contida no aplicativo. Você pode ler e modificar o smali ou até mesmo substituir inteiramente as classes, gerando o smali a partir da nova fonte Java (para fazer isso, você pode compilar a fonte .java em arquivos .class com javac e converter seus arquivos .class em arquivos .dex com o Android compilador dx e use baksmali (smali desassembler) para converter os arquivos .dex em .smali, conforme descrito nesta pergunta. Pode haver um atalho aqui). Quando terminar, você pode facilmente empacotar o apk com o apktool novamente. Observe que o apktool não assina o apk resultante, portanto, você precisará cuidar dele como qualquer outro aplicativo Android .
Se você seguir a rota smali, poderá experimentar o APK Studio , um IDE que automatiza algumas das etapas acima para ajudá-lo a descompilar e recompilar um apk e instalá-lo em um dispositivo.
Em resumo, suas escolhas são basicamente descompilar para Java, que é mais legível, mas provavelmente irreversível, ou desmontar para smali, que é mais difícil de ler, mas muito mais flexível para fazer alterações e reembalar um aplicativo modificado. Qual abordagem você escolher dependerá do que você deseja alcançar.
Por fim, a sugestão de desafio também é digna de nota. É uma ferramenta de redirecionamento para converter arquivos .dex e .apk em arquivos java .class, para que possam ser analisados usando as ferramentas típicas de análise estática de java.
Na verdade, eu recomendo ir aqui: https://github.com/JesusFreke/smali
Ele fornece o BAKSMALI, que é a mais excelente ferramenta de engenharia reversa para arquivos DEX. É feito por JesusFreke, o cara que criou as ROMs famosas para Android.
./apktool d myprogram.apk
. Veja minha resposta .
Uma versão mais completa de fred 's resposta :
Primeiro, você precisa de uma ferramenta para extrair todas as classes (compiladas) no DEX para um JAR.
Há um chamado dex2jar , feito por um estudante chinês.
Em seguida, você pode usar o jd-gui para descompilar as classes no JAR para o código-fonte.
A fonte resultante deve ser bem legível, pois o dex2jar aplica algumas otimizações.
Você pode usar o APKTool . Ele irá automaticamente extrair todas as classes ( .dex
), recursos ( .asrc
), em seguida, ele irá converter XML binário para XML legível , e que também irá dissassemble as classes para você.
A desmontagem sempre será mais robusta do que a descompilação, especialmente com
JARs ofuscados pelo Pro Guard!
Basta dizer ao APKTool para decodificar o APK em um diretório, modificar o que você deseja
e finalmente codificá- lo novamente para um APK. Isso é tudo.
Importante: o APKTool desmonta . Não descompila .
O código gerado não será fonte Java.
Mas você deve poder lê-lo e até editá-lo se estiver familiarizado com o jasmin .
Se você deseja fonte Java, consulte o manual .
Às vezes, você obtém código corrompido ao usar dex2jar
/ apktool
, principalmente em loops. Para evitar isso, use jadx , que decompila o bytecode do dalvik no código-fonte java, sem criar primeiro um arquivo .jar
/ .class
comodex2jar
(o apktool usa o dex2jar, eu acho). Também é de código aberto e em desenvolvimento ativo. Ele ainda tem uma GUI, para fanáticos por GUI. Tente!
javac "$(find . -name '*.java')"
?
Eu tenho usado
Mas nenhum supera as próprias ferramentas do Google
Como ninguém mencionou isso, há mais uma ferramenta: página inicial do DED
Instale instruções e algumas explicações: Instalação .
Ele foi usado em um estudo bastante interessante sobre a segurança dos principais aplicativos do mercado (não muito relacionado, apenas se você estiver curioso): Uma Pesquisa sobre Segurança de Aplicativos Android
Desde que Dheeraj Bhaskar
a resposta é relativamente antiga como muitos anos atrás.
Aqui está minha resposta mais recente (ano de 2019):
de dex
para java sourcecode
, atualmente, tem dois tipos de solução:
One Step
: converter diretamente dex
parajava sourcecode
Two Step
: primeiro converter dex
para jar
, segundo converter jar
parajava sourcecode
dex
diretamente parajava sourcecode
bin
pasta pode ver a linha de comando jadx
ou a versão da GUI jadx-gui
, clique duas vezes para executar a versão da GUI:jadx-gui
dex
arquivoentão pode mostrar o código fonte do java:
File
-> save as gradle project
então obtém o código-fonte java:
dex
parajar
faça o download do dex2jar zip , descompacte o arquivo got e d2j-dex2jar.sh
, em seguida:
apk
para jar
:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
para jar
:sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex
exemplo:
➜ 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
parajava sourcecode
many
código irá descompilar o errominor
código descompilará o errono
erro de descompilação de código
Procyon
aqui demo Procyon
converta jar em código-fonte java:
Download procyon-decompiler-0.5.34.jar
usando a sintaxe:
java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName
exemplo:
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 o editor VSCode para abrir o código fonte exportado, fique assim:
Correção de conversão: Jadx
> Procyon
> CRF
>JD-GUI
Recomende o uso: (soluções de uma etapa) Jadx
para uma explicação mais detalhada, consulte o meu e- livro chinês online : 安卓 应用 的 安全 和 破解
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex
obtive a exceção: #java.io.IOException: the src file not a .dex or zip file
d2j-dex2jar.bat "D:\android\some_dex_file.dex"
está ok ou não?
>d2j-dex2jar.bat file.dex
mas não está ok. talvez seja porque meu .dex
arquivo foi copiado dalvik-cache
?
dex is copied from dalvik-cache
, deveria serdex is decompiled from apk
Depois de baixar o arquivo APK, siga as etapas abaixo para obter um código / documento java editável.
Com o Dedexer , você pode desmontar o .dex
arquivo no dalvik bytecode ( .ddx
).
Descompilar para Java não é possível, tanto quanto eu sei.
Você pode ler sobre o dalvik bytecode aqui .
A engenharia reversa do Android é possível . Siga estas etapas para obter o arquivo .java do arquivo apk.
Passo 1 . Usando dex2jar
dex2jar sampleApp.apk
Passo 2 . Descompilando .jar Usando JD-GUI
Debian recente tem pacote 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
Instale os pacotes correspondentes:
sudo apt-get install androguard python-networkx
Descompile o arquivo DEX:
$ androdd -i classes.dex -o ./dir-for-output
Extrato classes.dex
de Apk + Decompile:
$ androdd -i app.apk -o ./dir-for-output
O arquivo Apk nada mais é do que o Java archive (JAR), você pode extrair arquivos do archive via:
$ unzip app.apk -d ./dir-for-output
Muita coisa mudou desde que a maioria dessas respostas foi publicada. Hoje em dia existem muitas ferramentas fáceis com GUIs, como estas:
APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit
O melhor lugar para encontrá-los é no fórum XDA Developers.
Você pode experimentar o JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ), esta é uma ferramenta perfeita para a descompilação do DEX.
E sim, também está disponível on-line no (meu: 0)) novo site: http://www.javadecompilers.com/apk/
Isso pode ser feito nas cinco etapas a seguir:
Esta jóia faz essas coisas automaticamente, mesmo para a instalação das ferramentas necessárias
O método mais fácil de descompilar um aplicativo Android é fazer o download de um aplicativo chamado ShowJava no playstore. Basta selecionar o aplicativo que precisa ser descompilado na lista de aplicativos. Existem três descompiladores diferentes que você pode usar para descompilar um aplicativo, a saber:
CFR 0.110, JaDX 0.6.1 ou FernFlower (descompilador analítico).
Se você não deseja baixar o dex2jar, use o apk_grabber
script python para descompilar qualquer apk em arquivos jar. Então você os lê com jd-gui.