hacktricks/mobile-pentesting/android-app-pentesting/apk-decompilers.md

140 lines
11 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# Decompiladores de APK
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
2022-05-01 12:41:36 +00:00
## [JD-Gui](https://github.com/java-decompiler/jd-gui)
2023-06-06 18:56:34 +00:00
O primeiro decompilador Java gui famoso, você pode usá-lo para investigar o código Java do APK depois de obtê-lo.
2022-05-01 12:41:36 +00:00
## [Jadx](https://github.com/skylot/jadx)
2023-06-06 18:56:34 +00:00
Construído em Java (multiplataforma) e neste momento acredito que seja o recomendado.\
Apenas **baixe** a **versão mais recente** e execute-a a partir da pasta _**bin**_:
```
jadx-gui
```
2023-06-06 18:56:34 +00:00
Usando a GUI, você pode realizar uma **busca de texto**, ir para as **definições de funções** (_CTRL + clique esquerdo_ na função) e referências cruzadas (_clique direito_ --> _Encontrar uso_)
2023-06-06 18:56:34 +00:00
Se você **só quer** o **código java** mas sem usar uma GUI, uma maneira muito fácil é usar a ferramenta de linha de comando jadx:
```
jadx app.apk
```
2023-06-06 18:56:34 +00:00
Algumas **opções interessantes do jadx** (versões GUI e CLI) são:
```
-d <path to output dir>
--no-res #No resources
--no-src #No source code
--no-imports #Always write entire package name (very useful to know where is the function that you might want to hook)
```
2022-05-01 12:41:36 +00:00
## [GDA-android-reversing-Tool](https://github.com/charles2gan/GDA-android-reversing-Tool)
2023-06-06 18:56:34 +00:00
O GDA é também uma plataforma poderosa e rápida de análise reversa. Que não só suporta a operação básica de decompilação, mas também muitas funções excelentes como **Detecção de comportamento malicioso, Detecção de vazamento de privacidade, Detecção de vulnerabilidade, Resolução de caminho, Identificação de empacotador, Análise de rastreamento de variáveis, Deobfuscation, Scripts Python e Java, Extração de memória do dispositivo, Decodificação e codificação de dados** etc\*\*.\*\*
2023-06-06 18:56:34 +00:00
**Apenas para Windows.**
![](<../../.gitbook/assets/image (207) (1) (1).png>)
2022-05-01 12:41:36 +00:00
## [Bytecode-Viewer](https://github.com/Konloch/bytecode-viewer/releases)
2023-06-06 18:56:34 +00:00
Outra **ferramenta interessante para fazer uma análise estática é**: [**bytecode-viewer**](https://github.com/Konloch/bytecode-viewer/releases)**.** Ele permite que você descompile o APK usando **vários descompiladores ao mesmo tempo**. Então, você pode ver, por exemplo, 2 descompiladores Java diferentes e um descompilador Smali. Ele também permite que você **modifique** o código:
![](<../../.gitbook/assets/image (82).png>)
2023-06-06 18:56:34 +00:00
Se você modificar o código, então você pode **exportá-lo**.\
Uma coisa ruim do bytecode-viewer é que ele **não tem referências** ou **referências cruzadas**.
2022-05-01 12:41:36 +00:00
## [**Enjarify**](https://github.com/Storyyeller/enjarify)
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Enjarify é uma ferramenta para traduzir o bytecode Dalvik em bytecode Java equivalente. Isso permite que as ferramentas de análise Java analisem aplicativos Android.\
Dex2jar é uma ferramenta mais antiga que também tenta traduzir Dalvik para bytecode Java. Funciona razoavelmente bem na maioria das vezes, mas muitos recursos obscuros ou casos extremos farão com que ele falhe ou até mesmo produza resultados incorretos silenciosamente. Em contraste, o Enjarify é projetado para funcionar em tantos casos quanto possível, mesmo para código onde o Dex2jar falharia. Entre outras coisas, o Enjarify lida corretamente com nomes de classe Unicode, constantes usadas como vários tipos, conversões implícitas, manipuladores de exceção que saltam para o fluxo de controle normal, classes que referenciam muitas constantes, métodos muito longos, manipuladores de exceção após um manipulador catchall e valores iniciais estáticos do tipo errado.
2021-03-22 09:38:34 +00:00
2022-05-01 12:41:36 +00:00
## [CFR](https://github.com/leibnitz27/cfr)
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
CFR irá descompilar recursos Java modernos - [incluindo grande parte do Java ](https://www.benf.org/other/cfr/java9observations.html)[9](https://github.com/leibnitz27/cfr/blob/master/java9stringconcat.html), [12](https://www.benf.org/other/cfr/switch\_expressions.html) & [14](https://www.benf.org/other/cfr/java14instanceof\_pattern), mas é escrito inteiramente em Java 6, então funcionará em qualquer lugar! ([FAQ](https://www.benf.org/other/cfr/faq.html)) - Ele até fará um bom trabalho ao transformar arquivos de classe de outras linguagens JVM de volta para java!
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Esse arquivo JAR pode ser usado da seguinte forma:
```
2021-03-22 09:38:34 +00:00
java -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"
```
2023-06-06 18:56:34 +00:00
Para arquivos JAR maiores, notei que a memória pode acabar. Se isso acontecer com você, basta ajustar o tamanho do pool de alocação de memória do JVM.
```
2021-03-22 09:38:34 +00:00
java -Xmx4G -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"
```
2023-06-06 18:56:34 +00:00
Este exemplo permitirá a alocação máxima de 4GB.
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
No diretório de saída, você encontrará os arquivos `.java` descompilados, juntamente com um resumo da descompilação.
2021-03-22 09:38:34 +00:00
2022-05-01 12:41:36 +00:00
## [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine)
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Em seguida, temos o [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine), que faz parte do [IntelliJ IDEA](https://www.jetbrains.com/idea/). Todo mundo menciona que é um descompilador _analítico_ (conforme declarado em sua descrição de projeto), mas ninguém aponta o que isso realmente significa. Eu só encontrei [esta pergunta do Stackoverflow](https://stackoverflow.com/q/62298929), que infelizmente permanece sem resposta até hoje.
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
De qualquer forma, como não há lançamentos autocontidos, você precisa construí-lo sozinho. Como um projeto baseado em [Gradle](https://gradle.org), você pode cloná-lo e, em seguida, executar o seguinte comando, desde que o Gradle esteja instalado em sua máquina.
```
2021-03-22 09:38:34 +00:00
cd ./plugins/java-decompiler/engine && gradle jar
```
2023-06-06 18:56:34 +00:00
Aqui, primeiro mudamos nosso diretório de trabalho para o diretório raiz do Fernflower. Em seguida, instruímos o Gradle a construir o arquivo `./build/libs/fernflower.jar`.
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
A invocação do Fernflower é semelhante à do CFR.
```
2021-03-22 09:38:34 +00:00
java -jar ./fernflower.jar "$JARFILE" "$OUTDIR"
```
2023-06-06 18:56:34 +00:00
Entre os decompiladores descritos aqui, este é o único que gera arquivos `.java` em um arquivo JAR. Você pode facilmente extrair os arquivos de origem usando o comando `unzip`.
2021-03-22 09:38:34 +00:00
2022-05-01 12:41:36 +00:00
## [Krakatau](https://github.com/Storyyeller/Krakatau)
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Lembra do Enjarify acima? O mesmo autor é também o desenvolvedor de um decompilador chamado [Krakatau](https://github.com/Storyyeller/Krakatau).
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Em contraste com os outros projetos, este é escrito em Python. E acredito que esta é a razão pela qual ele é um pouco diferente dos outros.
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Deixe-me citar [o README do projeto](https://github.com/Storyyeller/Krakatau/blob/master/README.md).
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
> Em seguida, certifique-se de ter arquivos JAR contendo definições para quaisquer classes externas (ou seja, bibliotecas) que possam ser referenciadas pelo JAR que você está tentando descompilar. Isso inclui as classes da biblioteca padrão (ou seja, JRT).
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
E de acordo com a descrição, essas classes da biblioteca padrão vêm com a versão 8 do Java na forma do arquivo `rt.jar`. Para versões posteriores, o autor fornece o [jrt-extractor](https://github.com/Storyyeller/jrt-extractor), que pode gerar este arquivo para nós.
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Então, baixamos essa ferramenta e executamos os seguintes comandos.
```
2021-03-22 09:38:34 +00:00
cd ./jrt-extractor
javac JRTExtractor.java
java -ea JRTExtractor
```
2023-06-06 18:56:34 +00:00
Isso deveria ter escrito um arquivo `rt.jar` dentro do diretório.
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Com este arquivo, podemos executar o Krakatau da seguinte forma.
```
2021-03-22 09:38:34 +00:00
./Krakatau/decompile.py -out "$OUTDIR" -skip -nauto -path ./jrt-extractor/rt.jar "$JARFILE"
```
2023-06-06 18:56:34 +00:00
Deixe-me consultar o GitHub do projeto para uma explicação dos parâmetros. Apenas observe que, para qualquer biblioteca usada pelo seu arquivo JAR, o Krakatau exigirá que você a adicione como um arquivo JAR para a flag `-path`.
2021-03-22 09:38:34 +00:00
2022-05-01 12:41:36 +00:00
## [procyon](https://github.com/mstrobel/procyon)
2021-03-22 09:38:34 +00:00
2023-06-06 18:56:34 +00:00
Uma vez instalado, o uso é simples.
```
2021-03-22 09:38:34 +00:00
procyon -jar "$JARFILE" -o "$OUTDIR"
```
2023-06-06 18:56:34 +00:00
## Referências
2021-04-01 22:13:01 +00:00
{% embed url="https://eiken.dev/blog/2021/02/how-to-break-your-jar-in-2021-decompilation-guide-for-jars-and-apks/#cfr" %}
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>