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

139 lines
11 KiB
Markdown

# Decompiladores de APK
<details>
<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>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## [JD-Gui](https://github.com/java-decompiler/jd-gui)
El primer descompilador de Java con interfaz gráfica famoso, se puede utilizar para investigar el código Java del APK una vez que lo hayas obtenido.
## [Jadx](https://github.com/skylot/jadx)
Descompilador de Java (multiplataforma) y en este momento creo que es el recomendado.\
Solo **descarga** la **última** versión y ejecútalo desde la carpeta _**bin**_:
```
jadx-gui
```
Usando la interfaz gráfica de usuario puedes realizar una **búsqueda de texto**, ir a las **definiciones de funciones** (_CTRL + clic izquierdo_ en la función) y referencias cruzadas (_clic derecho_ --> _Buscar uso_)
Si **sólo quieres** el **código java** pero sin usar una GUI, una forma muy fácil es usar la herramienta de línea de comandos jadx:
```
jadx app.apk
```
Algunas **opciones interesantes de jadx** (versiones GUI y CLI) son:
```
-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)
```
## [GDA-android-reversing-Tool](https://github.com/charles2gan/GDA-android-reversing-Tool)
GDA es también una plataforma de análisis inverso rápida y poderosa. No solo admite la operación básica de descompilación, sino también muchas funciones excelentes como **detección de comportamiento malicioso, detección de fugas de privacidad, detección de vulnerabilidades, resolución de rutas, identificación de paquetes, análisis de seguimiento de variables, desofuscación, scripts de Python y Java, extracción de memoria del dispositivo, cifrado y descifrado de datos**, etc.
**Solo para Windows.**
![](<../../.gitbook/assets/image (207) (1) (1).png>)
## [Bytecode-Viewer](https://github.com/Konloch/bytecode-viewer/releases)
Otra **herramienta interesante para realizar un análisis estático es**: [**bytecode-viewer**](https://github.com/Konloch/bytecode-viewer/releases)**.** Te permite descompilar el APK usando **varios descompiladores al mismo tiempo**. Luego, puedes ver, por ejemplo, 2 descompiladores de Java diferentes y un descompilador de Smali. También te permite **modificar** el código:
![](<../../.gitbook/assets/image (82).png>)
Si modificas el código, entonces puedes **exportarlo**.\
Una mala cosa de bytecode-viewer es que **no tiene referencias** o **referencias cruzadas**.
## [**Enjarify**](https://github.com/Storyyeller/enjarify)
Enjarify es una herramienta para traducir el bytecode de Dalvik al bytecode de Java equivalente. Esto permite que las herramientas de análisis de Java analicen aplicaciones de Android.\
Dex2jar es una herramienta más antigua que también intenta traducir Dalvik al bytecode de Java. Funciona razonablemente bien la mayor parte del tiempo, pero muchas características oscuras o casos extremos harán que falle o incluso produzca resultados incorrectos en silencio. En cambio, Enjarify está diseñado para funcionar en tantos casos como sea posible, incluso para el código donde Dex2jar fallaría. Entre otras cosas, Enjarify maneja correctamente los nombres de clase Unicode, las constantes utilizadas como múltiples tipos, las conversiones implícitas, los manejadores de excepciones que saltan al flujo de control normal, las clases que hacen referencia a demasiadas constantes, los métodos muy largos, los manejadores de excepciones después de un manejador de captura de todo y los valores iniciales estáticos del tipo incorrecto.
## [CFR](https://github.com/leibnitz27/cfr)
CFR descompilará las características modernas de Java, [incluyendo gran parte de 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) y [14](https://www.benf.org/other/cfr/java14instanceof\_pattern), pero está escrito completamente en Java 6, ¡así que funcionará en cualquier lugar! ([FAQ](https://www.benf.org/other/cfr/faq.html)) - ¡Incluso hará un buen trabajo convirtiendo archivos de clase de otros lenguajes JVM de vuelta a Java!
Ese archivo JAR se puede usar de la siguiente manera:
```
java -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"
```
Para archivos JAR más grandes, encontré que se quedaba sin memoria. Simplemente puede adaptar el tamaño del grupo de asignación de memoria de la JVM si eso también le sucede a usted.
```
java -Xmx4G -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"
```
Este ejemplo permitirá asignar un máximo de 4GB.
En el directorio de salida, encontrarás los archivos `.java` descompilados, junto con un resumen de la descompilación.
## [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine)
A continuación, tenemos [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine), que forma parte de [IntelliJ IDEA](https://www.jetbrains.com/idea/). Todo el mundo menciona que es un descompilador _analítico_ (como se indica en su descripción del proyecto), pero nadie señala lo que esto realmente significa. Solo encontré [esta pregunta de Stackoverflow](https://stackoverflow.com/q/62298929), que lamentablemente sigue sin respuesta hasta hoy.
De todos modos, como no hay versiones autocontenidas, necesitas construirlo tú mismo. Como proyecto basado en [Gradle](https://gradle.org), puedes clonarlo y luego ejecutar el siguiente comando siempre y cuando Gradle esté instalado en tu máquina.
```
cd ./plugins/java-decompiler/engine && gradle jar
```
Aquí, primero cambiamos nuestro directorio de trabajo al directorio raíz de Fernflower. Luego, instruimos a Gradle para construir el archivo `./build/libs/fernflower.jar`.
La invocación de Fernflower es similar a la de CFR.
```
java -jar ./fernflower.jar "$JARFILE" "$OUTDIR"
```
Entre los descompiladores descritos aquí, este es el único que genera archivos `.java` en un archivo JAR. Puedes extraer fácilmente los archivos fuente usando `unzip`.
## [Krakatau](https://github.com/Storyyeller/Krakatau)
¿Recuerdas Enjarify de arriba? El mismo autor es también el desarrollador de un descompilador llamado [Krakatau](https://github.com/Storyyeller/Krakatau).
En contraste con los otros proyectos, este está escrito en Python. Y creo que esta es la razón por la que es un poco diferente de los demás.
Permíteme citar [el README del proyecto](https://github.com/Storyyeller/Krakatau/blob/master/README.md).
> A continuación, asegúrate de tener archivos JAR que contengan definiciones para cualquier clase externa (es decir, bibliotecas) que pueda ser referenciada por el archivo JAR que estás intentando descompilar. Esto incluye las clases de la biblioteca estándar (es decir, JRT).
Y según la descripción, estas clases de biblioteca estándar vienen hasta la versión 8 de Java en forma del archivo `rt.jar`. Para versiones posteriores, el autor proporciona [jrt-extractor](https://github.com/Storyyeller/jrt-extractor), que puede generar este archivo para nosotros.
Así que descargamos esa herramienta y ejecutamos los siguientes comandos.
```
cd ./jrt-extractor
javac JRTExtractor.java
java -ea JRTExtractor
```
Este debería haber creado un archivo `rt.jar` dentro del directorio.
Dado este archivo, podemos ejecutar Krakatau de la siguiente manera.
```
./Krakatau/decompile.py -out "$OUTDIR" -skip -nauto -path ./jrt-extractor/rt.jar "$JARFILE"
```
Permítame referirme al GitHub del proyecto para una explicación de los parámetros. Solo tenga en cuenta que para cualquier biblioteca utilizada por su archivo JAR, Krakatau requerirá que la agregue como un archivo JAR en la bandera `-path`.
## [procyon](https://github.com/mstrobel/procyon)
Una vez instalado, su uso es sencillo.
```
procyon -jar "$JARFILE" -o "$OUTDIR"
```
## Referencias
{% embed url="https://eiken.dev/blog/2021/02/how-to-break-your-jar-in-2021-decompilation-guide-for-jars-and-apks/#cfr" %}
<details>
<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>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>