
Outil en ligne de commande et avec interface graphique pour décompiler les fichiers Android Dex et APK en code source Java lisible, avec décodage des ressources, désambiguïsation, et capacités de débogage Smali.
jadx - Décompilateur Dex vers Java
Outils en ligne de commande et GUI pour produire du code source Java à partir des fichiers Android Dex et Apk
[!WARNING] Veuillez noter que dans la plupart des cas, jadx ne peut pas décompiler 100 % du code, donc des erreurs se produiront.
Consultez le Guide de dépannage pour des solutions de contournement.
Fonctionnalités principales :
AndroidManifest.xml et d'autres ressources depuis resources.arscFonctionnalités de jadx-gui :
Les raccourcis claviers de jadx-gui se trouvent ici
Voir ces fonctionnalités en action ici : Aperçu des fonctionnalités de jadx-gui
Après téléchargement, décompressez le fichier zip, rendez-vous dans le répertoire bin et exécutez :
jadx - version en ligne de commandejadx-gui - version avec interface graphiqueSous Windows, exécutez les fichiers .bat en double-cliquant
Remarque : assurez-vous d'avoir installé Java 11 ou une version ultérieure 64 bits. Pour Windows, vous pouvez le télécharger depuis oracle.com (sélectionnez l'installateur x64).
sudo pacman -S jadx
brew install jadx
flatpak install flathub com.github.skylot.jadx
Vous pouvez utiliser jadx dans vos projets Java, consultez les détails sur la page wiki
JDK 17 ou supérieur doit être installé :
git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist
(sous Windows, utilisez gradlew.bat au lieu de ./gradlew)
Les scripts pour exécuter jadx seront placés dans build/jadx/bin et également empaquetés dans build/jadx-<version>.zip
jadx[-gui] [command] [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab, .xapk, .apkm, .jadx.kts)
commandes (utilisez '<commande> --help' pour les options de commande) :
plugins - gérer les plugins jadx
options:
-d, --output-dir - répertoire de sortie
-ds, --output-dir-src - répertoire de sortie pour les sources
-dr, --output-dir-res - répertoire de sortie pour les ressources
-r, --no-res - ne pas décoder les ressources
-s, --no-src - ne pas décompiler le code source
-j, --threads-count - nombre de threads de traitement, défaut : 16
--single-class - décompiler une seule classe, nom complet, brut ou alias
--single-class-output - fichier ou répertoire pour écrire si décompilation d'une seule classe
--output-format - peut être 'java' ou 'json', défaut : java
-e, --export-gradle - enregistrer en tant que projet gradle (définir '--export-gradle-type' sur 'auto')
--export-gradle-type - modèle de projet Gradle pour l'exportation :
'auto' - détecter automatiquement
'android-app' - Application Android (apk)
'android-library' - Bibliothèque Android (aar)
'simple-java' - Java simple
-m, --decompilation-mode - mode de sortie du code :
'auto' - essaie les meilleures options (défaut)
'restructure' - restaurer la structure du code (code Java normal)
'simple' - instructions simplifiées (linéaire, avec des goto)
'fallback' - instructions brutes sans modifications
--show-bad-code - afficher le code incohérent (décompilé incorrectement)
--no-xml-pretty-print - ne pas mettre en forme le XML
--no-imports - désactiver l'utilisation des imports, toujours écrire le nom complet du package
--no-debug-info - désactiver l'analyse et le traitement des informations de débogage
--add-debug-lines - ajouter des commentaires avec les numéros de ligne de débogage si disponibles
--no-inline-anonymous - désactiver l'insertion en ligne des classes anonymes
--no-inline-methods - désactiver l'insertion en ligne des méthodes
--no-move-inner-classes - désactiver le déplacement des classes internes dans le parent
--no-inline-kotlin-lambda - désactiver l'insertion en ligne pour les lambdas Kotlin
--no-finally - ne pas extraire le bloc finally
--no-restore-switch-over-string - ne pas restaurer le switch sur les chaînes
--no-replace-consts - ne pas remplacer la valeur constante par le champ constant correspondant
--escape-unicode - échapper les caractères non latins dans les chaînes (avec \u)
--respect-bytecode-access-modifiers - ne pas modifier les modificateurs d'accès d'origine
--mappings-path - fichier ou répertoire de mappages de désébfuscation. Formats autorisés : Tiny et Tiny v2 (tous deux '.tiny'), Enigma (.mapping) ou répertoire Enigma
--mappings-mode - définir le mode de gestion du fichier de mappage de désébfuscation :
'read' - simplement lire, l'utilisateur peut toujours sauvegarder manuellement (défaut)
'read-and-autosave-every-change' - lire et sauvegarder automatiquement après chaque modification
'read-and-autosave-before-closing' - lire et sauvegarder automatiquement avant de quitter l'application ou de fermer le projet
'ignore' - ne pas lire ni sauvegarder (peut être utilisé pour ignorer le chargement des fichiers de mappage référencés dans le fichier projet)
--deobf - activer la désébfuscation
--deobf-min - longueur minimale du nom, renommé si plus court, défaut : 3
--deobf-max - longueur maximale du nom, renommé si plus long, défaut : 64
--deobf-whitelist - liste séparée par des espaces des classes (nom complet) et des packages (se terminant par '.*') à exclure de la désébfuscation, défaut : android.support.v4.* android.support.v7.* android.support.v4.os.* android.support.annotation.Px androidx.core.os.* androidx.annotation.Px
--deobf-cfg-file - fichier de mappages de désébfuscation utilisé pour les noms générés automatiquement par JADX (au format de fichier JOBF), défaut : même répertoire et nom que le fichier d'entrée avec l'extension '.jobf'
--deobf-cfg-file-mode - définir le mode de gestion du fichier de mappage de désébfuscation des noms générés automatiquement par JADX :
'read' - lire si trouvé, ne pas sauvegarder (défaut)
'read-or-save' - lire si trouvé, sinon sauvegarder (ne pas écraser)
'overwrite' - ne pas lire, toujours sauvegarder
'ignore' - ne pas lire et ne pas sauvegarder
--deobf-res-name-source - meilleure source de noms pour les ressources :
'auto' - sélectionner automatiquement le meilleur nom (défaut)
'resources' - utiliser les noms des ressources
'code' - utiliser les noms des champs de la classe R
--use-source-name-as-class-name-alias - utiliser le nom source comme alias du nom de classe :
'always' - toujours utiliser le nom source s'il est disponible
'if-better' - utiliser le nom source s'il semble meilleur que le nom actuel
'never' - ne jamais utiliser le nom source, même s'il est disponible
--source-name-repeat-limit - autoriser l'utilisation du nom source s'il apparaît moins d'un nombre limite, défaut : 10
--use-kotlin-methods-for-var-names - utiliser les méthodes intrinsèques de Kotlin pour renommer les variables, valeurs : disable, apply, apply-and-hide, défaut : apply
--use-headers-for-detect-resource-extensions - Utiliser les en-têtes pour détecter les extensions de ressources si la ressource est obfusquée
--rename-flags - options de correction (liste séparée par des virgules) :
'case' - corriger les problèmes de sensibilité à la casse (selon l'option --fs-case-sensitive),
'valid' - renommer les identifiants Java pour les rendre valides,
'printable' - supprimer les caractères non imprimables des identifiants,
ou 'none' - pour désactiver tous les renommages
ou 'all' - pour tout activer (défaut)
--integer-format - comment les entiers sont affichés :
'auto' - sélectionner automatiquement (défaut)
'decimal' - utiliser le décimal
'hexadecimal' - utiliser l'hexadécimal
--type-update-limit - nombre limite de mises à jour de type (par instruction), défaut : 10
--fs-case-sensitive - traiter le système de fichiers comme sensible à la casse, faux par défaut
--cfg - sauvegarder le graphe de flux de contrôle des méthodes dans un fichier dot
--raw-cfg - sauvegarder le graphe de flux de contrôle des méthodes (utiliser les instructions brutes)
--call-graph - sauvegarder le graphe d'appels de l'application au format : 'dot' ou 'json', défaut : none
-f, --fallback - définir '--decompilation-mode' sur 'fallback' (obsolète)
--use-dx - utiliser dx/d8 pour convertir le bytecode Java
--comments-level - définir le niveau des commentaires de code, valeurs : error, warn, info, debug, user-only, none, défaut : info
--log-level - définir le niveau de journalisation, valeurs : quiet, progress, error, warn, info, debug, défaut : progress
-v, --verbose - sortie verbeuse (définir --log-level sur DEBUG)
-q, --quiet - désactiver la sortie (définir --log-level sur QUIET)
--disable-plugins - liste séparée par des virgules des identifiants de plugins à désactiver
--config <config-ref> - charger la configuration depuis un fichier, <config-ref> peut être :
chemin vers un fichier '.json'
nom court - utilise le fichier portant ce nom depuis le répertoire de configuration
'none' - pour désactiver le chargement de la configuration
--save-config <config-ref> - sauvegarder les options actuelles dans un fichier de configuration et quitter, <config-ref> peut être :
vide - pour la configuration par défaut
chemin vers un fichier '.json'
nom court - le fichier sera sauvegardé dans le répertoire de configuration
--print-files - afficher les fichiers et répertoires utilisés par jadx (config, cache, temp)
--version - afficher la version de jadx
-h, --help - afficher cette aide
Options des plugins (-P<nom>=<valeur>) :
dex-input : Charger les fichiers .dex et .apk
- dex-input.verify-checksum - vérifier la somme de contrôle du fichier dex avant le chargement, valeurs : [yes, no], défaut : yes
java-convert : Convertir les fichiers .class, .jar et .aar en dex
- java-convert.mode - mode de conversion, valeurs : [dx, d8, both], défaut : both
- java-convert.d8-desugar - utiliser desugar dans d8, valeurs : [yes, no], défaut : no
kotlin-metadata : Utiliser l'annotation kotlin.Metadata pour la génération de code
- kotlin-metadata.class-alias - renommer l'alias de classe, valeurs : [yes, no], défaut : yes
- kotlin-metadata.method-args - renommer les arguments de fonction, valeurs : [yes, no], défaut : yes
- kotlin-metadata.fields - renommer les champs, valeurs : [yes, no], défaut : yes
- kotlin-metadata.companion - renommer l'objet companion, valeurs : [yes, no], défaut : yes
- kotlin-metadata.data-class - ajouter le modificateur data class, valeurs : [yes, no], défaut : yes
- kotlin-metadata.to-string - renommer les champs en utilisant toString, valeurs : [yes, no], défaut : yes
- kotlin-metadata.getters - renommer les getters simples en noms de champs, valeurs : [yes, no], défaut : yes
kotlin-smap : Utiliser l'annotation kotlin.SourceDebugExtension pour renommer l'alias de classe
- kotlin-smap.class-alias-source-dbg - renommer l'alias de classe depuis SourceDebugExtension, valeurs : [yes, no], défaut : no
rename-mappings : prise en charge de divers mappages
- rename-mappings.format - format de mappage, valeurs : [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], défaut : AUTO
- rename-mappings.invert - inverser le mappage au chargement, valeurs : [yes, no], défaut : no
smali-input : Charger les fichiers .smali
- smali-input.api-level - niveau d'API Android, défaut : 27
Variables d'environnement :
JADX_DISABLE_XML_SECURITY - définir sur 'true' pour désactiver toutes les vérifications de sécurité pour les fichiers XML
JADX_DISABLE_ZIP_SECURITY - définir sur 'true' pour désactiver toutes les vérifications de sécurité pour les fichiers zip
JADX_ZIP_MAX_ENTRIES_COUNT - nombre maximum autorisé d'entrées dans les fichiers zip (défaut : 100 000)
JADX_CONFIG_DIR - répertoire de configuration personnalisé, utilise celui du système par défaut
JADX_CACHE_DIR - répertoire de cache personnalisé, utilise celui du système par défaut
JADX_TMP_DIR - répertoire temporaire personnalisé, utilise celui du système par défaut
Exemples :
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
Ces options fonctionnent également dans jadx-gui lorsqu'il est exécuté en ligne de commande et remplacent les options de la boîte de dialogue des préférences
Utilisation de la commande `plugins`
usage: plugins [options] options: -i, --install - installer le plugin avec locationId -j, --install-jar <path-to.jar> - installer le plugin à partir d'un fichier jar -l, --list - lister les plugins installés -a, --available - lister les plugins disponibles depuis jadx-plugins-list (alias marketplace) -u, --update - mettre à jour les plugins installés --uninstall - désinstaller le plugin avec pluginId --disable - désactiver le plugin avec pluginId --enable - activer le plugin avec pluginId --list-all - lister tous les plugins, y compris les plugins intégrés et dropins --list-versions - récupérer les dernières versions du plugin depuis locationId (téléchargera tous les artefacts, limité à 10) -h, --help - afficher cette aide
### Dépannage
Veuillez consulter la page wiki [FAQ de dépannage](https://github.com/skylot/jadx/wiki/Troubleshooting-Q&A)
### Contribuer
Pour soutenir ce projet, vous pouvez :
- Partager vos idées sur les nouvelles fonctionnalités/optimisations qui sont importantes pour vous
- Soumettre des problèmes de décompilation, veuillez lire avant de procéder : [Ouvrir un problème](https://github.com/skylot/jadx/blob/master/CONTRIBUTING.md#Open-Issue)
- Ouvrir une pull request, veuillez suivre ces règles : [Processus de pull request](https://github.com/skylot/jadx/blob/master/CONTRIBUTING.md#Pull-Request-Process)
---------------------------------------
*Sous licence Apache 2.0*