
Herramienta de línea de comandos y GUI para descompilar archivos Android Dex y APK en código fuente Java legible, con capacidades de decodificación de recursos, desofuscación y depuración de Smali.
jadx - Descompilador de Dex a Java
Herramientas de línea de comandos y GUI para generar código fuente Java a partir de archivos Android Dex y Apk
[!WARNING] Tenga en cuenta que en la mayoría de los casos jadx no puede descompilar el 100% del código, por lo que se producirán errores.
Consulte la Guía de solución de problemas para soluciones alternativas.
Características principales:
AndroidManifest.xml y otros recursos de resources.arscCaracterísticas de jadx-gui:
Los atajos de teclado de Jadx-gui se pueden encontrar aquí
Vea estas características en acción aquí: Resumen de características de jadx-gui
Después de descargar, descomprima el archivo zip, vaya al directorio bin y ejecute:
jadx - versión de línea de comandosjadx-gui - versión de interfaz gráficaEn Windows, ejecute los archivos .bat con doble clic
Nota: asegúrese de haber instalado Java 11 o una versión posterior de 64 bits.
Para Windows, puede descargarlo desde oracle.com (seleccione el instalador x64).
sudo pacman -S jadx
brew install jadx
flatpak install flathub com.github.skylot.jadx
Puede usar jadx en sus proyectos Java, consulte los detalles en la página wiki
JDK 17 o superior debe estar instalado:
git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist
(en Windows, use gradlew.bat en lugar de ./gradlew)
Los scripts para ejecutar jadx se colocarán en build/jadx/bin
y también se empaquetarán en build/jadx-<version>.zip
jadx[-gui] [command] [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab, .xapk, .apkm, .jadx.kts)
comandos (use '<command> --help' para las opciones del comando):
plugins - gestionar plugins de jadx
options:
-d, --output-dir - directorio de salida
-ds, --output-dir-src - directorio de salida para fuentes
-dr, --output-dir-res - directorio de salida para recursos
-r, --no-res - no decodificar recursos
-s, --no-src - no descompilar código fuente
-j, --threads-count - cantidad de hilos de procesamiento, valor predeterminado: 16
--single-class - descompilar una sola clase, nombre completo, raw o alias
--single-class-output - archivo o directorio para escribir si se descompila una sola clase
--output-format - puede ser 'java' o 'json', valor predeterminado: java
-e, --export-gradle - guardar como proyecto gradle (configurar '--export-gradle-type' a 'auto')
--export-gradle-type - plantilla de proyecto Gradle para exportación:
'auto' - detectar automáticamente
'android-app' - Aplicación Android (apk)
'android-library' - Biblioteca Android (aar)
'simple-java' - Java simple
-m, --decompilation-mode - modo de salida de código:
'auto' - intentar mejores opciones (predeterminado)
'restructure' - restaurar estructura de código (código Java normal)
'simple' - instrucciones simplificadas (lineal, con goto)
'fallback' - instrucciones sin modificar
--show-bad-code - mostrar código inconsistente (descompilado incorrectamente)
--no-xml-pretty-print - no embellecer XML
--no-imports - deshabilitar uso de importaciones, escribir siempre el nombre completo del paquete
--no-debug-info - deshabilitar análisis y procesamiento de información de depuración
--add-debug-lines - agregar comentarios con números de línea de depuración si están disponibles
--no-inline-anonymous - deshabilitar inserción de clases anónimas
--no-inline-methods - deshabilitar inserción de métodos
--no-move-inner-classes - deshabilitar mover clases internas al padre
--no-inline-kotlin-lambda - deshabilitar inserción de lambdas Kotlin
--no-finally - no extraer bloque finally
--no-restore-switch-over-string - no restaurar switch sobre cadena
--no-replace-consts - no reemplazar valor constante con campo constante coincidente
--escape-unicode - escapar caracteres no latinos en cadenas (con \u)
--respect-bytecode-access-modifiers - no cambiar modificadores de acceso originales
--mappings-path - archivo o directorio de mapeo de desofuscación. Formatos permitidos: Tiny y Tiny v2 (ambos '.tiny'), Enigma (.mapping) o directorio Enigma
--mappings-mode - establecer modo para manejar el archivo de mapeo de desofuscación:
'read' - solo leer, el usuario siempre puede guardar manualmente (predeterminado)
'read-and-autosave-every-change' - leer y guardar automáticamente después de cada cambio
'read-and-autosave-before-closing' - leer y guardar automáticamente antes de salir de la aplicación o cerrar el proyecto
'ignore' - no leer ni guardar (se puede usar para omitir la carga de archivos de mapeo referenciados en el archivo del proyecto)
--deobf - activar desofuscación
--deobf-min - longitud mínima de nombre, renombrado si es más corto, valor predeterminado: 3
--deobf-max - longitud máxima de nombre, renombrado si es más largo, valor predeterminado: 64
--deobf-whitelist - lista separada por espacios de clases (nombre completo) y paquetes (terminan con '.*') a excluir de la desofuscación, valor predeterminado: android.support.v4.* android.support.v7.* android.support.v4.os.* android.support.annotation.Px androidx.core.os.* androidx.annotation.Px
--deobf-cfg-file - archivo de mapeo de desofuscación utilizado para nombres generados automáticamente por JADX (en formato JOBF), valor predeterminado: mismo directorio y nombre que el archivo de entrada con extensión '.jobf'
--deobf-cfg-file-mode - establecer modo para manejar el archivo de mapa de desofuscación de nombres generados automáticamente por JADX:
'read' - leer si se encuentra, no guardar (predeterminado)
'read-or-save' - leer si se encuentra, guardar en caso contrario (no sobrescribir)
'overwrite' - no leer, siempre guardar
'ignore' - no leer ni guardar
--deobf-res-name-source - mejor fuente de nombre para recursos:
'auto' - seleccionar automáticamente el mejor nombre (predeterminado)
'resources' - usar nombres de recursos
'code' - usar nombres de campos de clase R
--use-source-name-as-class-name-alias - usar nombre fuente como alias de nombre de clase:
'always' - usar siempre el nombre fuente si está disponible
'if-better' - usar nombre fuente si parece mejor que el actual
'never' - nunca usar nombre fuente, incluso si está disponible
--source-name-repeat-limit - permitir usar nombre fuente si aparece menos de un número límite, valor predeterminado: 10
--use-kotlin-methods-for-var-names - usar métodos intrínsecos de Kotlin para renombrar variables, valores: disable, apply, apply-and-hide, valor predeterminado: apply
--use-headers-for-detect-resource-extensions - Usar cabeceras para detectar extensiones de recursos si el recurso está ofuscado
--rename-flags - opciones de corrección (lista separada por comas de):
'case' - corregir problemas de sensibilidad de mayúsculas/minúsculas (según la opción --fs-case-sensitive),
'valid' - renombrar identificadores Java para que sean válidos,
'printable' - eliminar caracteres no imprimibles de identificadores,
o único 'none' - para deshabilitar todos los renombramientos
o único 'all' - para habilitar todos (predeterminado)
--integer-format - cómo se muestran los enteros:
'auto' - seleccionar automáticamente (predeterminado)
'decimal' - usar decimal
'hexadecimal' - usar hexadecimal
--type-update-limit - límite de actualización de tipo (por instrucción), valor predeterminado: 10
--fs-case-sensitive - tratar el sistema de archivos como sensible a mayúsculas/minúsculas, falso por defecto
--cfg - guardar gráfico de flujo de control de métodos en archivo dot
--raw-cfg - guardar gráfico de flujo de control de métodos (usar instrucciones sin procesar)
--call-graph - guardar gráfico de llamadas de la aplicación en formato: 'dot' o 'json', valor predeterminado: none
-f, --fallback - establecer '--decompilation-mode' a 'fallback' (obsoleto)
--use-dx - usar dx/d8 para convertir bytecode Java
--comments-level - establecer nivel de comentarios de código, valores: error, warn, info, debug, user-only, none, valor predeterminado: info
--log-level - establecer nivel de registro, valores: quiet, progress, error, warn, info, debug, valor predeterminado: progress
-v, --verbose - salida detallada (establecer --log-level a DEBUG)
-q, --quiet - desactivar salida (establecer --log-level a QUIET)
--disable-plugins - lista separada por comas de ids de plugins a deshabilitar
--config <config-ref> - cargar configuración desde archivo, <config-ref> puede ser:
ruta a archivo '.json'
nombre corto - usa archivo con este nombre desde el directorio de configuración
'none' - para deshabilitar carga de configuración
--save-config <config-ref> - guardar opciones actuales en archivo de configuración y salir, <config-ref> puede ser:
vacío - para configuración predeterminada
ruta a archivo '.json'
nombre corto - el archivo se guardará en el directorio de configuración
--print-files - imprimir archivos y directorios usados por jadx (config, cache, temp)
--version - imprimir versión de jadx
-h, --help - imprimir esta ayuda
Opciones de plugin (-P<nombre>=<valor>):
dex-input: Cargar archivos .dex y .apk
- dex-input.verify-checksum - verificar checksum del archivo dex antes de cargar, valores: [yes, no], valor predeterminado: yes
java-convert: Convertir archivos .class, .jar y .aar a dex
- java-convert.mode - modo de conversión, valores: [dx, d8, both], valor predeterminado: both
- java-convert.d8-desugar - usar desugar en d8, valores: [yes, no], valor predeterminado: no
kotlin-metadata: Usar anotación kotlin.Metadata para generación de código
- kotlin-metadata.class-alias - renombrar alias de clase, valores: [yes, no], valor predeterminado: yes
- kotlin-metadata.method-args - renombrar argumentos de función, valores: [yes, no], valor predeterminado: yes
- kotlin-metadata.fields - renombrar campos, valores: [yes, no], valor predeterminado: yes
- kotlin-metadata.companion - renombrar objeto companion, valores: [yes, no], valor predeterminado: yes
- kotlin-metadata.data-class - agregar modificador de clase de datos, valores: [yes, no], valor predeterminado: yes
- kotlin-metadata.to-string - renombrar campos usando toString, valores: [yes, no], valor predeterminado: yes
- kotlin-metadata.getters - renombrar getters simples a nombres de campo, valores: [yes, no], valor predeterminado: yes
kotlin-smap: Usar anotación kotlin.SourceDebugExtension para renombrar alias de clase
- kotlin-smap.class-alias-source-dbg - renombrar alias de clase desde SourceDebugExtension, valores: [yes, no], valor predeterminado: no
rename-mappings: soporte de varios mapeos
- rename-mappings.format - formato de mapeo, valores: [AUTO, TINY_FILE, TINY_2_FILE, ENIGMA_FILE, ENIGMA_DIR, PROGUARD_FILE, SRG_FILE, XSRG_FILE, JAM_FILE, CSRG_FILE, TSRG_FILE, TSRG_2_FILE, INTELLIJ_MIGRATION_MAP_FILE, RECAF_SIMPLE_FILE, JOBF_FILE], valor predeterminado: AUTO
- rename-mappings.invert - invertir mapeo al cargar, valores: [yes, no], valor predeterminado: no
smali-input: Cargar archivos .smali
- smali-input.api-level - nivel de API de Android, valor predeterminado: 27
Variables de entorno:
JADX_DISABLE_XML_SECURITY - establecer a 'true' para deshabilitar todas las comprobaciones de seguridad para archivos XML
JADX_DISABLE_ZIP_SECURITY - establecer a 'true' para deshabilitar todas las comprobaciones de seguridad para archivos zip
JADX_ZIP_MAX_ENTRIES_COUNT - número máximo permitido de entradas en archivos zip (predeterminado: 100 000)
JADX_CONFIG_DIR - directorio de configuración personalizado, usando el del sistema por defecto
JADX_CACHE_DIR - directorio de caché personalizado, usando el del sistema por defecto
JADX_TMP_DIR - directorio temporal personalizado, usando el del sistema por defecto
Ejemplos:
jadx -d out classes.dex
jadx --rename-flags "none" classes.dex
jadx --rename-flags "valid, printable" classes.dex
jadx --log-level ERROR app.apk
jadx -Pdex-input.verify-checksum=no app.apk
Estas opciones también funcionan en jadx-gui desde la línea de comandos y anulan las opciones del diálogo de preferencias
Uso del comando plugins
usage: plugins [options]
options:
-i, --install <locationId> - instalar plugin con locationId
-j, --install-jar <path-to.jar> - instalar plugin desde archivo jar
-l, --list - listar plugins instalados
-a, --available - listar plugins disponibles desde jadx-plugins-list (también conocido como marketplace)
-u, --update - actualizar plugins instalados
--uninstall <pluginId> - desinstalar plugin con pluginId
--disable <pluginId> - deshabilitar plugin con pluginId
--enable <pluginId> - habilitar plugin con pluginId
--list-all - listar todos los plugins incluidos los integrados y dropins
--list-versions <locationId> - obtener las últimas versiones del plugin desde locationId (descargará todos los artefactos, limitado a 10)
-h, --help - imprimir esta ayuda
Consulte la página wiki Preguntas y respuestas sobre solución de problemas
Para apoyar este proyecto puede:
Licenciado bajo la Licencia Apache 2.0