← retour aux outils back to tools

# 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