Introducción
Comencemos con lo que los archivos JAR y APK tienen en común. Cuando se construye una aplicación Android, las fuentes primero se compilan en bytecode de la JVM. Después de eso, el bytecode de la JVM se compila en bytecode Dalvik. Mientras que el bytecode de la JVM se encuentra en archivos .class
dentro de los JARs, el bytecode Dalvik se encuentra en archivos .dex
dentro de los APKs.
Esto significa que, para reconstruir el código fuente de un archivo APK, hay dos enfoques posibles:
-
Encontrar un descompilador que reconstruya directamente el código fuente a partir del bytecode Dalvik
-
Traducir el bytecode Dalvik a bytecode de la JVM y, desde allí, usar un descompilador de Java estándar.
Para el primer enfoque, jadx es la herramienta adecuada. Si tu objetivo es analizar un archivo APK, definitivamente deberías probar esta herramienta. He visto que muchos analizadores de APK dependen de ella, lo que probablemente significa que realiza un buen trabajo.
El segundo enfoque requiere un mecanismo para traducir los archivos .dex
en archivos .class
. dex2jar es, sin duda, la herramienta más conocida para esto. Sin embargo, me encontré con Enjarify, que promete funcionar mejor en varios casos límite:
Puedes encontrar más detalles en el archivo README del proyecto.
Enjarify genera, como sugiere su nombre, un archivo JAR. A partir de ahí, se pueden usar varias herramientas populares para reconstruir el código fuente en Java.
Para resumir, la siguiente figura ilustra ambas opciones que tenemos.
Decompiladores
CFR
CFR es capaz de decompilar características modernas de Java. Úsalo de la siguiente manera:
Para decompilación estándar:
Para archivos JAR grandes, ajusta la asignación de memoria de la JVM:
Fernflower
Fernflower, un decompilador analítico, requiere ser construido desde el código fuente. Después de construir:
Decompila un archivo JAR:
Luego, extrae los archivos .java del JAR generado usando unzip.
Krakatau
Krakatau ofrece un control detallado sobre la decompilación, especialmente para manejar bibliotecas externas.
Usa Krakatau especificando la ruta de la biblioteca estándar y el archivo JAR a decompilar:
Procyon
Para una decompilación sencilla con procyon:
Decompila un archivo JAR a un directorio especificado:
Frida-DEXdump
Esta herramienta se puede usar para volcar el DEX de un APK en ejecución en memoria. Esto ayuda a superar la ofuscación estática que se elimina mientras la aplicación se ejecuta en memoria.
JD-Gui
Como el decompilador GUI Java pionero, JD-Gui te permite investigar el código Java dentro de archivos APK. Es fácil de usar; después de obtener el APK, simplemente ábrelo con JD-Gui para inspeccionar el código.
Jadx
Jadx ofrece una interfaz fácil de usar para decompilar código Java de aplicaciones Android. Se recomienda por su facilidad de uso en diferentes plataformas.
Para lanzar la GUI, navega al directorio bin y ejecuta:
Para uso en línea de comandos, decompila un APK con:
Para especificar un directorio de salida o ajustar opciones de decompilación:
GDA-android-reversing-Tool
GDA, una herramienta solo para Windows, ofrece amplias características para la ingeniería inversa de aplicaciones Android. Instala y ejecuta GDA en tu sistema Windows, luego carga el archivo APK para análisis.
Bytecode-Viewer
Con Bytecode-Viewer, puedes analizar archivos APK utilizando múltiples decompiladores. Después de descargar, ejecuta Bytecode-Viewer, carga tu APK y selecciona los decompiladores que deseas usar para un análisis simultáneo.
Enjarify
Enjarify traduce bytecode Dalvik a bytecode Java, permitiendo que las herramientas de análisis de Java analicen aplicaciones Android de manera más efectiva.
Para usar Enjarify, ejecuta: