hacktricks/mobile-pentesting/android-app-pentesting/apk-decompilers.md
2023-06-03 01:46:23 +00:00

11 KiB

Decompiladores de APK

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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

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

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.

Bytecode-Viewer

Otra herramienta interesante para realizar un análisis estático es: bytecode-viewer. 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:

Si modificas el código, entonces puedes exportarlo.
Una mala cosa de bytecode-viewer es que no tiene referencias o referencias cruzadas.

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

CFR descompilará las características modernas de Java, incluyendo gran parte de Java 9, 12 y 14, pero está escrito completamente en Java 6, ¡así que funcionará en cualquier lugar! (FAQ) - ¡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

A continuación, tenemos Fernflower, que forma parte de IntelliJ 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, que lamentablemente sigue sin respuesta hasta hoy.

De todos modos, como no hay versiones autocontenidas, necesitas construirlo tú mismo. Como proyecto basado en Gradle, 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

¿Recuerdas Enjarify de arriba? El mismo autor es también el desarrollador de un descompilador llamado 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.

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, 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

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" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥