jadx

Décompilateur Java/Dalvik pour fichiers APK et DEX Android. Produit du code source Java lisible à partir du bytecode compilé, avec une interface graphique et une interface en ligne de commande. Java/Dalvik decompiler for Android APK and DEX files. Produces readable Java source code from compiled bytecode with a GUI and CLI interface.

↗ https://github.com/skylot/jadx

Overview

jadx decompiles Android APK files and DEX bytecode back into human-readable Java source code. Unlike smali (used by apktool), jadx produces Java pseudocode that is much easier to read and audit. It includes a powerful GUI (jadx-gui) and a command-line tool.

Basic Usage

Decompile APK to a directory (Java source + resources)

jadx app.apk -d output_dir/

Decompile DEX file

jadx classes.dex -d output_dir/

Decompile JAR file

jadx app.jar -d output_dir/

Decompile and show all resources

jadx app.apk -d output_dir/ --show-bad-code

GUI Usage

Launch the GUI

jadx-gui

Open an APK directly

jadx-gui app.apk
# GUI features:
# - Browse package tree (left panel)
# - View decompiled Java (center)
# - Search text/class/method (Ctrl+F / Ctrl+Shift+F)
# - Find usages (right-click → Find usages)
# - Navigate to definition (Ctrl+click)
# - Rename classes/methods (right-click → Rename)

Searching in jadx-gui

# Text search (in decompiled code)
Ctrl+F            Search in current file
Ctrl+Shift+F      Global search across all classes

# Class/method navigation
Ctrl+N            Navigate to class
Ctrl+Shift+N      Navigate to file
Ctrl+click        Go to definition
Alt+Left/Right    Navigate back/forward

CLI Options

Decompile with threads (faster)

jadx app.apk -d output/ -j 8

Include debug information

jadx app.apk -d output/ --debug-info

Export as gradle project (importable in Android Studio)

jadx app.apk -d output/ --export-gradle

Fallback to show raw bytecode on errors

jadx app.apk -d output/ --fallback

Set deobfuscation (rename obfuscated a/b/c → class1/class2)

jadx app.apk -d output/ --deobf

Set minimum string length for deobfuscation rename

jadx app.apk -d output/ --deobf --deobf-min 4

Manual Code Analysis After Decompile

Find hardcoded secrets

grep -r "password\|secret\|apikey\|token\|api_key" output_dir/sources/

Find network URLs

grep -rn "http[s]\?://" output_dir/sources/

Find interesting classes

find output_dir/ -name "*.java" | xargs grep -l "WebView\|executeSQL\|exec("

Find crypto usage

grep -rn "AES\|DES\|RSA\|SecretKey\|KeySpec" output_dir/sources/

Find logging (often reveals debug info)

grep -rn "Log\.\|System\.out\.\|printStackTrace" output_dir/sources/

Analyzing AndroidManifest.xml

Readable XML after decompile

cat output_dir/resources/AndroidManifest.xml

Check for exported components (attack surface)

grep -i "exported=\"true\"" output_dir/resources/AndroidManifest.xml

Check for debuggable flag

grep -i "debuggable" output_dir/resources/AndroidManifest.xml

Check permissions

grep "uses-permission" output_dir/resources/AndroidManifest.xml

Tips

  • jadx-gui’s Find usages (right-click on any identifier) is invaluable for tracing data flows
  • Use Rename to give meaningful names to obfuscated classes — jadx persists the mapping
  • --deobf renames obfuscated identifiers based on length; not perfect but helps readability
  • For rebuilding/patching, switch to apktool — jadx output can’t be recompiled directly
Help / Man page
jadx [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip)

Options:
  -d, --output-dir         Output directory
  -ds, --output-dir-src    Output directory for sources
  -dr, --output-dir-res    Output directory for resources
  -j, --threads-count      Number of processing threads
  --fallback               Make simple dump (no deobfuscation)
  --show-bad-code          Show inconsistent code
  --no-res                 Do not decode resources
  --no-src                 Do not decompile source code
  --deobf                  Enable deobfuscation
  --deobf-min N            Min name length for deobfuscation
  --deobf-max N            Max name length for deobfuscation
  --rename-flags           Rename flags: source, enum, lowercase, upper
  --export-gradle          Save as gradle project
  --debug-info             Include debug information

Vue d’ensemble

jadx décompile les fichiers APK Android et le bytecode DEX en code source Java lisible par un humain. Contrairement à smali (utilisé par apktool), jadx produit un pseudocode Java bien plus facile à lire et à auditer. Il inclut une interface graphique puissante (jadx-gui) et un outil en ligne de commande.

Utilisation de base

# Décompiler un APK vers un répertoire (source Java + ressources)
jadx app.apk -d output_dir/

# Décompiler un fichier DEX
jadx classes.dex -d output_dir/

# Décompiler un fichier JAR
jadx app.jar -d output_dir/

# Décompiler et afficher tout le code, même incohérent
jadx app.apk -d output_dir/ --show-bad-code

Utilisation du GUI

# Lancer le GUI
jadx-gui

# Ouvrir un APK directement
jadx-gui app.apk

# Fonctionnalités du GUI :
# - Parcourir l'arborescence des packages (panneau de gauche)
# - Visualiser le Java décompilé (au centre)
# - Rechercher texte/classe/méthode (Ctrl+F / Ctrl+Shift+F)
# - Trouver les usages (clic droit → Find usages)
# - Naviguer vers la définition (Ctrl+clic)
# - Renommer classes/méthodes (clic droit → Rename)

Recherche dans jadx-gui

# Recherche de texte (dans le code décompilé)
Ctrl+F            Rechercher dans le fichier actuel
Ctrl+Shift+F      Recherche globale dans toutes les classes

# Navigation classe/méthode
Ctrl+N            Aller à la classe
Ctrl+Shift+N      Aller au fichier
Ctrl+click        Aller à la définition
Alt+Left/Right    Naviguer en arrière/avant

Options CLI

# Décompiler avec plusieurs threads (plus rapide)
jadx app.apk -d output/ -j 8

# Inclure les informations de débogage
jadx app.apk -d output/ --debug-info

# Exporter en projet gradle (importable dans Android Studio)
jadx app.apk -d output/ --export-gradle

# Repli sur l'affichage du bytecode brut en cas d'erreur
jadx app.apk -d output/ --fallback

# Activer la désobfuscation (renommer a/b/c obfusqués → class1/class2)
jadx app.apk -d output/ --deobf

# Définir la longueur minimale de chaîne pour le renommage de désobfuscation
jadx app.apk -d output/ --deobf --deobf-min 4

Analyse manuelle du code après décompilation

# Trouver des secrets en dur
grep -r "password\|secret\|apikey\|token\|api_key" output_dir/sources/

# Trouver des URLs réseau
grep -rn "http[s]\?://" output_dir/sources/

# Trouver des classes intéressantes
find output_dir/ -name "*.java" | xargs grep -l "WebView\|executeSQL\|exec("

# Trouver l'utilisation de crypto
grep -rn "AES\|DES\|RSA\|SecretKey\|KeySpec" output_dir/sources/

# Trouver les logs (révèle souvent des infos de debug)
grep -rn "Log\.\|System\.out\.\|printStackTrace" output_dir/sources/

Analyse du AndroidManifest.xml

# XML lisible après décompilation
cat output_dir/resources/AndroidManifest.xml

# Vérifier les composants exportés (surface d'attaque)
grep -i "exported=\"true\"" output_dir/resources/AndroidManifest.xml

# Vérifier le flag debuggable
grep -i "debuggable" output_dir/resources/AndroidManifest.xml

# Vérifier les permissions
grep "uses-permission" output_dir/resources/AndroidManifest.xml

Conseils

  • La fonction Find usages de jadx-gui (clic droit sur n’importe quel identifiant) est précieuse pour tracer les flux de données
  • Utiliser Rename pour donner des noms explicites aux classes obfusquées : jadx conserve le mapping
  • --deobf renomme les identifiants obfusqués selon leur longueur ; ce n’est pas parfait mais ça améliore la lisibilité
  • Pour reconstruire/patcher, passer à apktool : la sortie de jadx ne peut pas être recompilée directement
Aide / Page de manuel
jadx [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip)

Options:
  -d, --output-dir         Output directory
  -ds, --output-dir-src    Output directory for sources
  -dr, --output-dir-res    Output directory for resources
  -j, --threads-count      Number of processing threads
  --fallback               Make simple dump (no deobfuscation)
  --show-bad-code          Show inconsistent code
  --no-res                 Do not decode resources
  --no-src                 Do not decompile source code
  --deobf                  Enable deobfuscation
  --deobf-min N            Min name length for deobfuscation
  --deobf-max N            Max name length for deobfuscation
  --rename-flags           Rename flags: source, enum, lowercase, upper
  --export-gradle          Save as gradle project
  --debug-info              Include debug information