mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-30 08:30:57 +00:00
140 lines
11 KiB
Markdown
140 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)
|
||
|
* Consigue 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 decompilador 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)
|
||
|
|
||
|
Construido en 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 interfaz gráfica, una forma muy sencilla 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 empaquetadores, 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 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. Si eso también te sucede, simplemente puedes adaptar el tamaño del pool de asignación de memoria de la JVM.
|
||
|
```
|
||
|
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 que construya 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 con 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
|
||
|
```
|
||
|
Esto debería haber escrito 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íteme referirme al GitHub del proyecto para una explicación de los parámetros. Solo ten en cuenta que para cualquier biblioteca utilizada por tu archivo JAR, Krakatau requerirá que la agregues 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 la [**oficial PEASS & HackTricks swag**](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 PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||
|
|
||
|
</details>
|