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

9.8 KiB

Decompiladores de APK

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

JD-Gui

El primer decompilador Java con interfaz gráfica famoso, puedes usarlo para investigar el código Java del APK una vez que lo hayas obtenido.

Jadx

Decompilador Java integrado (multiplataforma) y en este momento creo que es el recomendado.
Simplemente descarga la última versión y ejecútala desde la carpeta bin:

jadx-gui

Utilizando la interfaz gráfica puedes realizar 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 solo quieres el código java pero sin usar una interfaz gráfica, una manera 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

GDA es también una plataforma de análisis de ingeniería inversa potente y rápida. Que no solo soporta las operaciones básicas de decompilación, sino también muchas funciones excelentes como Detección de comportamiento malicioso, Detección de fuga de privacidad, Detección de vulnerabilidades, Resolución de caminos, Identificación de empaquetadores, Análisis de seguimiento de variables, Desofuscación, Scripts de Python y Java, Extracción de memoria del dispositivo, Descifrado y cifrado de datos, etc.

Solo para Windows.

Bytecode-Viewer

Otra herramienta interesante para realizar un análisis estático es: bytecode-viewer. Permite decompilar el APK usando varios decompiladores al mismo tiempo. Entonces, puedes ver, por ejemplo, 2 decompiladores de Java diferentes y un decompilador Smali. También te permite modificar el código:

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

Enjarify

Enjarify es una herramienta para traducir el bytecode de Dalvik a bytecode de Java equivalente. Esto permite que las herramientas de análisis de Java analicen aplicaciones Android.
Dex2jar es una herramienta más antigua que también intenta traducir Dalvik a bytecode de Java. Funciona razonablemente bien la mayoría del tiempo, pero muchas características oscuras o casos límite harán que falle o incluso produzca resultados incorrectos silenciosamente. En contraste, Enjarify está diseñado para funcionar en tantos casos como sea posible, incluso para código donde Dex2jar fallaría. Entre otras cosas, Enjarify maneja correctamente nombres de clases unicode, constantes usadas como múltiples tipos, conversiones implícitas, manejadores de excepciones que saltan al flujo de control normal, clases que hacen referencia a demasiadas constantes, métodos muy largos, manejadores de excepciones después de un manejador catchall y valores iniciales estáticos del tipo incorrecto.

CFR

CFR decompilará características modernas de Java - incluyendo mucho de Java 9, 12 & 14, pero está escrito enteramente en Java 6, ¡así que funcionará en cualquier lugar! (FAQ) - ¡Incluso hará un buen intento de convertir archivos de clase de otros lenguajes JVM de nuevo 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, descubrí que se quedaba sin memoria. Puedes adaptar simplemente el tamaño del pool de asignación de memoria de la JVM si eso también te sucede.

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

El siguiente es Fernflower, que forma parte de IntelliJ IDEA. Todos mencionan que es un descompilador analítico (como se indica en la descripción de su proyecto), pero nadie señala qué significa esto realmente. Solo encontré esta pregunta en Stackoverflow, que lamentablemente sigue sin respuesta hasta el día de hoy.

De todos modos, dado que no hay versiones independientes, necesitas construirlo tú mismo. Como proyecto basado en Gradle, puedes clonarlo y luego ejecutar el siguiente comando, siempre que 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 decompiladores descritos aquí, este es el único que genera los archivos .java en un archivo JAR. Puedes extraer fácilmente los archivos fuente utilizando unzip.

Krakatau

¿Recuerdas Enjarify de arriba? El mismo autor también es el desarrollador de un decompilador llamado Krakatau.

A diferencia de los otros proyectos, este está escrito en Python. Y creo que esta es la razón por la cual es un poco diferente de los demás.

Permíteme citar del README del proyecto.

A continuación, asegúrate de tener jars que contengan definiciones para cualquier clase externa (es decir, librerías) que pueda ser referenciada por el jar que estás intentando decompilar. Esto incluye las clases de la biblioteca estándar (es decir, JRT).

Y según la descripción, estas clases de la biblioteca estándar vienen con hasta 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

Este 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"

procyon

Una vez instalado, el 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" %}

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: