descompilar DEX em código fonte Java

706

Como descompilar arquivos do Android DEX (VM bytecode) no código-fonte Java correspondente?

Vai
fonte
Dê uma olhada aqui . Você obterá possíveis leads a partir daí para seguir em frente.
21730 Kevin Boyd
Informações atualizadas é acessível em codificadores blogue hub: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md Mohsin
Se você tem dinheiro, comprar jeb , caso contrário usar jadx , veja aqui porque
polímer
Há um novo plateform cruz (java) e ferramenta de código aberto, que permitem que você faça isso, apenas check-out bytecodeviewer: stackoverflow.com/a/36557898/795245
Gomino

Respostas:

881

É fácil

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.

Procedimento:

E aqui está o procedimento sobre como descompilar:

Passo 1:

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 .shscripts são substituídos por .batscripts

Nota 2: No linux / mac, não esqueça shou bash. 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.Xdiretório, por exemplosudo chmod -R +x dex2jar-2.0

documentação dex2jar

Passo 2:

Abra o jar no JD-GUI

A fonte descompilada

Dheeraj Bhaskar
fonte
57
+1. Eu tentei tanto Baksmali e Dex2jar. O Dex2Jar + JD-Gui vence por fornecer código fonte perfeitamente legível para a maioria dos arquivos .dex.
Jonathan Dumaine
oi, por favor, compartilhe o seu caminho? Serei muito grato a você.
Arslan Anwar #
2
A frase acima tocou um sino - parece ser uma citação aqui: geeknizer.com/decompile-reverse-engineer-android-apk (ou o contrário?). Os artigos vinculados explicam brevemente as ferramentas mencionadas acima, bem como o Smali e o APKTool.
AgentKnopf
2
@JonathanDumaine que depende. Se os JARs estiverem ofuscados e você quiser fazer pequenas modificações, o Backsmali é o único caminho a percorrer. Bônus! Com o APKTool, você também recupera todos os XMLs, imagens e outros recursos. Veja minha resposta .
Alba Mendez
3
@ JonathanDumaine Concordo com jmendeth, o apktool também é o caminho a percorrer, se você deseja descompilar o apk, modificá-lo e recompilá-lo. Ao usar o dex2jar e o jd-gui, a fonte é realmente legível, mas você não pode recompilar sem alguns erros!
darkheir
138

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.

Zach Lipton
fonte
61

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.

reflog
fonte
3
O smali é uma linguagem semelhante a um assembly baseada no dalvik IL, não pode ser traduzida diretamente para Java.
Reflog 15/11/10
@ Endryha Não existem ferramentas capazes de fazer isso. Veja esta pergunta para mais informações.
Alba Mendez
1
Código, código, código, ... Por que apenas código? Se você usa o APKTool, recebe tudo de volta! E é tão simples quanto ./apktool d myprogram.apk. Veja minha resposta .
Alba Mendez
30

Uma versão mais completa de fred 's resposta :

Maneira manual

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.

Maneira automática

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 .

Alba Mendez
fonte
25

À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/ .classcomodex2jar (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!

polym
fonte
I jadx suponha que não tem opção de compilação, mas o código é legível embora
camarada
@EnesBattal você quer dizer javac "$(find . -name '*.java')"?
Polym
Que tal formar um apk? colocando aulas de apk, zipalign, assinando etc.
camarada
@EnesBattal Bem, você pode ajudar a implementar que - caso contrário, você poderia usar apktool para isso .. ou sinal / zipalign com as ferramentas Android
polímer
1
@lejonl Pena de morte para você, seu monstro!
polym
17

Eu tenho usado

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

Mas nenhum supera as próprias ferramentas do Google

1) Android Studio 2.x: construir> analisar apk insira a descrição da imagem aqui

2) Android Studio 3.0: perfil ou depuração APK insira a descrição da imagem aqui insira a descrição da imagem aqui

ishandutta2007
fonte
1
Mais um para o Enjarify. Na minha experiência pessoal, que tem provado dar melhores resultados em comparação com d2j
qre0ct
15

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

phaethon
fonte
Parece promissor. Descompila o código Java diretamente do APK? E o código Java ofuscado?
sandalone 22/10/11
14

Desde que Dheeraj Bhaskara resposta é relativamente antiga como muitos anos atrás.

Aqui está minha resposta mais recente (ano de 2019):

Lógica principal

de dexpara java sourcecode, atualmente, tem dois tipos de solução:

  • One Step: converter diretamente dexparajava sourcecode
  • Two Step: primeiro converter dexpara jar, segundo converter jarparajava sourcecode

Solução de uma etapa: dexdiretamente parajava sourcecode

Ferramentas

Processo

  1. faça o download do jadx-0.9.0.zip , descompacte-o, na binpasta pode ver a linha de comando jadxou a versão da GUI jadx-gui, clique duas vezes para executar a versão da GUI:jadx-gui

  1. abrir dexarquivo

então pode mostrar o código fonte do java:

  1. File -> save as gradle project

então obtém o código-fonte java:


Solução em duas etapas

Etapa 1: dexparajar

Ferramentas

Processo

faça o download do dex2jar zip , descompacte o arquivo got e d2j-dex2jar.sh, em seguida:

  • apkpara jar:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dexpara 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

Etapa 2: jarparajava sourcecode

Ferramentas

Processo

aqui demo Procyonconverta 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:

Conclusão

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 : 安卓 应用 的 安全 和 破解

crifan
fonte
estranho, mas se eu tentar executar 1 etapa (dex para descompilar o jar no Windows) através deste comando, dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexobtive a exceção: #java.io.IOException: the src file not a .dex or zip file
28819
@ Сергей você poderia tentar: d2j-dex2jar.bat "D:\android\some_dex_file.dex"está ok ou não?
precisa saber é
sim, eu tentei exatamente, >d2j-dex2jar.bat file.dexmas não está ok. talvez seja porque meu .dexarquivo foi copiado dalvik-cache?
Сергей
1
@ Сергей sim, o motivo mais possível é o que você disse dex is copied from dalvik-cache, deveria serdex is decompiled from apk
crifan
@ Crifan, obrigado por esta resposta. JADX é impressionante. eu voltarei ao trabalho Emmanuel @ JD-Gui
Emmanuel Dupuy
13

Depois de baixar o arquivo APK, siga as etapas abaixo para obter um código / documento java editável.

  1. Converta seu arquivo apk em zip (enquanto inicia o download, não use a opção "salvar", basta ir em "salvar como" e mencionar sua extensão como .zip), fazendo assim, para evitar o APKTOOL ...
  2. Extraia o arquivo zip, onde você pode encontrar somefilename.dex. então agora precisamos converter dex -> .class
  3. Para fazer isso, você precisa do "dex2jar" (você pode baixá-lo em http://code.google.com/p/dex2jar/ , após extraído, no prompt de comando, você deve mencionar como [D: \ dex2jar-0.09> dex2jar somefilename.dex] (Lembre-se de que seu somefilename.dex deve estar dentro da mesma pasta em que você mantém o seu dex2jar.)
  4. Faça o download do jad em http://www.viralpatel.net/blogs/download/jad/jad.zip e extraia-o. Uma vez extraído, você pode ver dois arquivos como "jad.exe" e "Readme.txt" (às vezes "jad.txt" pode existir em vez de "jad.exe", renomeie sua extensão como as.exe para execução)
  5. Finalmente, no prompt de comando, você deve mencionar como [D: \ jad> jad -sjava yourfilename.class] que ele analisará seu arquivo de classe em um documento java editável.
Kamal
fonte
8

Com o Dedexer , você pode desmontar o .dexarquivo no dalvik bytecode ( .ddx).

Descompilar para Java não é possível, tanto quanto eu sei.
Você pode ler sobre o dalvik bytecode aqui .

hcpl
fonte
1
aceito, já que você diz que não é possível (atualmente), o que parece verdadeiro.
Will
@ Will tudo é possível. Depende apenas de como você o vê. A descompilação é possível, mas talvez não do jeito que você está pensando.
Alba Mendez
8

A engenharia reversa do Android é possível . Siga estas etapas para obter o arquivo .java do arquivo apk.

Passo 1 . Usando dex2jar

  • Gere arquivo .jar a partir do arquivo .apk
  • comando: dex2jar sampleApp.apk

Passo 2 . Descompilando .jar Usando JD-GUI

  • ele descompila os arquivos .class, ou seja, nós vamos ficar ofuscados .java de volta do apk.
gtiwari333
fonte
Mas se eu compilar novamente todo o código-fonte descompilado, ele não será executado, o compilador mostra muitos erros.
Existe alguma solução disponível para descompilar android java de código-fonte será executado no eclipse
2
Engenharia Reversa não não significa, necessariamente, decompilação . De fato, os JARs ofuscados pelo ProGuard não serão descompilados corretamente.
Alba Mendez
Se você estiver lidando com código ofuscado, é melhor desmontá- lo. Você não obterá a fonte Java, mas sempre poderá ver / modificar o código. Veja minha resposta .
Alba Mendez
Eu recomendaria descompilar e desmontar. O código descompilado resultante é mais fácil de entender, mas todas as modificações precisam ser feitas com a versão desmontada. Especialmente verdadeiro se o programa tiver sido usado. Acho que o dex2jar combinado com o jd-gui é o melhor para descompilar.
Mikko Rantalainen
6

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.dexde 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
gavenkoa
fonte
5

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.

MPaulo
fonte
2

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).

Rishabh Maurya
fonte
1

Se você não deseja baixar o dex2jar, use o apk_grabberscript python para descompilar qualquer apk em arquivos jar. Então você os lê com jd-gui.

Jeff Brateman
fonte