L'analyse d'un APK Android est une discipline centrale du pentest mobile et de la recherche en sécurité applicative. Un APK (Android Package) est une archive contenant une application Android complète : bytecode Dalvik/ART compilé dans classes.dex, manifeste avec permissions dans AndroidManifest.xml, ressources dans res/ et resources.arsc, bibliothèques natives dans lib/ par architecture, signature dans META-INF/. Son analyse combine deux approches complémentaires : statique (décompilation sans exécution via JADX et apktool) et dynamique (instrumentation runtime via Frida et Objection). Les outils dominants en 2026 sont JADX (48k+ stars GitHub, décompilateur référence), apktool (24k+ stars, désassemblage smali et repackaging), Frida (oleavr, instrumentation dynamique multi-plateforme), Objection (wrapper Frida avec commandes prêtes à l'emploi), MobSF (scan automatisé complet) et Drozer (framework de tests mobile historique). Le référentiel méthodologique de référence est OWASP MASVS (Mobile Application Security Verification Standard) associé au MASTG (testing guide). Cet article détaille l'anatomie d'un APK, l'environnement d'analyse, les 5 étapes d'analyse statique, les techniques d'analyse dynamique, les bypass de certificate pinning, l'automatisation MobSF et le cadre légal.
Anatomie d'un APK Android
Un fichier .apk est au format ZIP renommé. Il est possible de l'ouvrir directement avec unzip.
monApp.apk (archive ZIP)
├── AndroidManifest.xml (binaire AXML, permissions, composants, intents)
├── classes.dex (bytecode Dalvik compilé, code Java/Kotlin)
├── classes2.dex, classes3.dex (si multidex, dépasse 64k methods)
├── resources.arsc (ressources binaires compilées)
├── res/ (ressources non compilées)
│ ├── drawable/ (images, PNG, JPG, WebP)
│ ├── layout/ (fichiers XML layout, compilés)
│ ├── values/ (strings, colors, dimens)
│ └── raw/ (fichiers bruts embarqués)
├── assets/ (assets non compressées, accès via AssetManager)
├── lib/ (bibliothèques natives .so)
│ ├── armeabi-v7a/ (ARM 32 bits, legacy)
│ ├── arm64-v8a/ (ARM 64 bits, dominant 2026)
│ ├── x86/ (émulateurs x86)
│ └── x86_64/ (émulateurs x64)
├── kotlin/ (métadonnées Kotlin si applicable)
└── META-INF/ (signatures et manifest)
├── MANIFEST.MF
├── CERT.RSA (ou CERT.EC si ECDSA)
└── CERT.SFFormat DEX et runtime ART
DEX (Dalvik Executable)
Bytecode optimisé pour mobiles (taille, batterie)
Compilé depuis Java/Kotlin via D8 (compiler)
Contient classes, méthodes, constants pool, strings
ART (Android Runtime) - remplace Dalvik depuis Android 5.0 (2014)
Ahead-of-Time compilation + JIT
OAT files générés à l'installation
Profile-guided optimization depuis Android 7+
Kotlin support
Depuis Android Studio 3.0 (2017), Kotlin first-class
Compilé en bytecode DEX comme Java
Métadonnées Kotlin dans classes.dex pour décompilationEnvironnement d'analyse
Prérequis logiciels
# Base : Linux (Ubuntu/Debian/Arch), macOS ou Windows WSL2
# JDK 17+ (beaucoup d'outils requièrent Java)
sudo apt install -y openjdk-17-jdk
# Android SDK Platform Tools (adb, fastboot)
sudo apt install -y android-tools-adb android-tools-fastboot
# Ou télécharger depuis developer.android.com/tools/releases/platform-tools
# Python 3.10+ pour Frida et outils Python
sudo apt install -y python3 python3-pip
# Outils supplémentaires
sudo apt install -y unzip wget curl gitEnvironnement d'exécution pour analyse dynamique
Émulateurs Android :
Android Studio AVD (gratuit)
Émulateur officiel Google
Root facile avec images « Google APIs » en x86_64
Performance acceptable sur CPU moderne
Genymotion (commercial freemium)
Images pré-configurées rootées
Très populaire en pentest mobile
Plan Personal gratuit
Corellium (commercial, cloud)
iOS + Android virtualized devices
Utilisé par chercheurs sécurité pro
Cher mais très puissant
Waydroid (OSS, Linux)
Android dans conteneur Linux
Performance proche native
Device physique rooté :
Pixel 4a, 5, 6, 7, 8 : bootloader déverrouillable, support Magisk
OnePlus certaines séries
Éviter : Samsung moderne (Knox), iPhone (iOS différent)
Magisk (root manager moderne) :
Remplace SuperSU obsolète
Modules : LSPosed (remplace Xposed), ZygiskAnalyse statique étape par étape
Étape 1 - Récupérer l'APK
# Depuis device rooté avec adb
adb shell pm list packages | grep monApp
adb shell pm path com.example.monapp
# Retourne : package:/data/app/com.example.monapp-1.apk
adb pull /data/app/com.example.monapp-1.apk monApp.apk
# Depuis sources publiques (apps gratuites uniquement)
# APKMirror, APKPure, APKCombo, Aptoide
# Vérifier les hashes sur VirusTotal avant analyse
# Via bundletool pour un AAB
bundletool build-apks --bundle=app.aab --output=app.apksÉtape 2 - Informations de base
# Hashes et taille
md5sum monApp.apk
sha256sum monApp.apk
stat -c '%s' monApp.apk
# Signature et métadonnées
apksigner verify --print-certs monApp.apk
aapt dump badging monApp.apk
# Contenu rapide
unzip -l monApp.apk
# Détection du compilateur, obfuscation
# Indicateurs : strings R8/ProGuard, Flutter, React Native, Kotlin, Jetpack Compose
strings monApp.apk | grep -iE "proguard|r8|flutter|react|expo"Étape 3 - Extraction avec apktool
apktool désassemble le bytecode en smali (format lisible) et décode les ressources binaires en XML lisible.
# Installation (Linux)
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.11.1.jar -O apktool.jar
sudo mv apktool /usr/local/bin/
sudo mv apktool.jar /usr/local/bin/
sudo chmod +x /usr/local/bin/apktool
# Décodage complet
apktool d monApp.apk -o monApp-decoded
# Structure résultante :
# monApp-decoded/
# AndroidManifest.xml (lisible)
# apktool.yml (métadonnées build)
# res/ (ressources lisibles)
# smali/ (bytecode désassemblé)
# smali_classes2/ etc
# Points d'intérêt dans AndroidManifest.xml
cat monApp-decoded/AndroidManifest.xml | grep -iE "permission|exported|intent-filter|content-provider"
# Rechercher URLs, API keys dans strings.xml
grep -riE "http|api.*key|token|secret" monApp-decoded/res/values/Étape 4 - Décompilation avec JADX
JADX convertit directement le bytecode DEX en Java/Kotlin lisible, bien plus confortable que smali.
# Installation
wget https://github.com/skylot/jadx/releases/latest/download/jadx-1.5.3.zip
unzip jadx-1.5.3.zip -d jadx
# GUI
./jadx/bin/jadx-gui monApp.apk
# CLI - extraire tout dans un dossier
./jadx/bin/jadx -d monApp-decompiled monApp.apk
# Options utiles
jadx --deobf --deobf-min 3 --show-bad-code monApp.apk
# --deobf : tente de renommer les classes obfusquées (a, b, c → Classe1, etc.)
# --show-bad-code : affiche code qui n'a pas pu être décompilé proprementPoints d'intérêt à rechercher dans le code décompilé
Hardcoded secrets :
grep -rE "api.*key|secret|password|token" monApp-decompiled/sources/
grep -rE "AKIA[0-9A-Z]{16}" monApp-decompiled/ # AWS access keys
grep -rE "ghp_|ghs_|gho_" monApp-decompiled/ # GitHub tokens
URLs et endpoints API :
grep -rE "https?://" monApp-decompiled/sources/
Cryptographie suspecte :
grep -rE "MD5|SHA-?1|DES|ECB" monApp-decompiled/sources/
Rechercher AES key hardcoded
WebView et JS bridges :
grep -rE "loadUrl|addJavascriptInterface|evaluateJavascript" monApp-decompiled/
Deep links et intent filters :
AndroidManifest.xml : <intent-filter> avec <data android:scheme="">
Peut être exploitables pour ouvrir l'app avec données contrôlées
Root detection :
grep -rE "RootBeer|isDeviceRooted|SuperUser\.apk|magisk" monApp-decompiled/
SSL Pinning :
grep -rE "pinning|CertificatePinner|TrustManagerImpl|setHostnameVerifier" monApp-decompiled/Étape 5 - Analyse automatisée avec MobSF
MobSF (Mobile Security Framework) est le standard OSS pour scan automatisé complet Android + iOS.
# Installation via Docker (recommandé)
docker pull opensecurity/mobile-security-framework-mobsf
docker run -d -p 8000:8000 opensecurity/mobile-security-framework-mobsf
# Ouvrir http://localhost:8000
# Drag & drop de l'APK → scan complet en 1-5 minutes
# MobSF produit :
# Static analysis : permissions, components exposés, hardcoded secrets,
# dangerous API usage, crypto faible, cert pinning
# Manifest analysis : misconfigurations Android
# Code analysis : CWE mapping, hash de fichiers
# Rapport HTML et PDF téléchargeable
# API REST pour automatisation CI/CD
# Alternatives :
# APKLab (extension VS Code)
# Quark-Engine (malware focus)
# apkleaks (scanner secrets)Analyse dynamique avec Frida et Objection
Installation Frida
# Host (machine pentest)
pip install frida-tools objection
# Device rooté : Frida server
# Télécharger frida-server-X.Y.Z-android-arm64 depuis
# https://github.com/frida/frida/releases
adb push frida-server-16.7.0-android-arm64 /data/local/tmp/frida-server
adb shell "chmod +x /data/local/tmp/frida-server"
adb shell "/data/local/tmp/frida-server &"
# Vérification
frida-ps -U # liste processus USB deviceFrida - hooking basique
// hook.js - hook une méthode Java
Java.perform(function() {
var MainActivity = Java.use('com.example.monapp.MainActivity');
// Hook méthode checkLicense() qui retourne boolean
MainActivity.checkLicense.implementation = function() {
console.log('[+] checkLicense() appelé');
var original = this.checkLicense();
console.log('[+] Retour original: ' + original);
console.log('[+] Force retour: true');
return true; // bypass license
};
});# Exécution
frida -U -l hook.js -f com.example.monapp --no-pauseObjection - wrapper Frida
# Attacher à app en cours d'exécution
objection -g com.example.monapp explore
# Commandes utiles dans Objection shell :
android sslpinning disable # bypass certificate pinning (universel)
android root disable # bypass root detection
android heap search instances com.example.monapp.User # objets en mémoire
android hooking list classes # lister classes chargées
android hooking watch class com.example.monapp.LoginActivity
android hooking watch class_method com.example.monapp.Auth.login --dump-args --dump-return
# Repackager un APK avec Frida gadget embarqué (device non-rooté)
objection patchapk --source monApp.apk --skip-resourcesBurp Suite avec certificate pinning bypass
# 1. Configurer Burp comme proxy HTTPS sur port 8080
# 2. Configurer proxy Wi-Fi du device/émulateur vers Burp
# Settings → Wi-Fi → Modify network → Proxy Manual
# 3. Installer le certificat Burp CA en système (Android 7+)
# Export Burp CA as .der, rename .cer
# adb push burp.cer /system/etc/security/cacerts/9a5ba575.0
# (nécessite root et remount /system en rw, ou Magisk module)
# 4. Bypass SSL pinning avec Objection
objection -g com.example.monapp explore
android sslpinning disable
# 5. Naviguer dans l'app, capturer requêtes dans BurpRéférentiel OWASP MASVS et MASTG
OWASP MASVS (Mobile Application Security Verification Standard) est le référentiel de sécurité mobile, analogue au ASVS pour le web.
Les 8 catégories MASVS 2024
MASVS-STORAGE
Protection des données au repos
Pas de secrets hardcodés
Keystore Android utilisé correctement
MASVS-CRYPTO
Primitives cryptographiques modernes
Pas de MD5/SHA-1/DES/ECB
Clés générées par RNG cryptographique
IV jamais réutilisés
MASVS-AUTH
Authentification forte côté serveur
Sessions sécurisées
Biométrie correctement implémentée
MASVS-NETWORK
TLS 1.2+ obligatoire
Certificate pinning sur APIs critiques
Network Security Config configuré
MASVS-PLATFORM
Permissions minimales
Composants non exposés sauf nécessaire
WebView sécurisée (pas de JS bridges dangereux)
Deep links validés
MASVS-CODE
Pas de vulns classiques (injection, logic bugs)
Bibliothèques tierces à jour
Obfuscation et logging hardenés
MASVS-RESILIENCE
Root/jailbreak detection (niveau L2)
Anti-debugging (niveau L2)
Obfuscation (niveau L2)
Anti-tampering
MASVS-PRIVACY (ajouté 2024)
Data minimization
Consent management
Data retention et deletion
Conformité RGPD / CCPAOWASP MASTG
Le Mobile Application Security Testing Guide (MASTG) est le livre compagnon avec les procédures de test détaillées pour Android et iOS. Référence absolue du pentest mobile en 2026.
Top 10 Mobile OWASP 2024
Mis à jour en 2024 par OWASP Foundation.
M1: Improper Credential Usage
M2: Inadequate Supply Chain Security
M3: Insecure Authentication/Authorization
M4: Insufficient Input/Output Validation
M5: Insecure Communication
M6: Inadequate Privacy Controls
M7: Insufficient Binary Protections
M8: Security Misconfiguration
M9: Insecure Data Storage
M10: Insufficient CryptographyBypass certificate pinning : 5 approches
1. Frida Universal Bypass
# Script Universal Android SSL Pinning Bypass (multiple auteurs)
frida -U -l android-pin-bypass.js -f com.example.monapp
# Ou Objection one-liner
objection -g com.example.monapp explore -s "android sslpinning disable"2. Modification Network Security Config
# apktool décode
apktool d monApp.apk -o monApp-decoded
# Éditer res/xml/network_security_config.xml
# Ajouter user CA acceptance
cat > monApp-decoded/res/xml/network_security_config.xml << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system"/>
<certificates src="user"/>
</trust-anchors>
</base-config>
</network-security-config>
EOF
# Repackager et signer
apktool b monApp-decoded -o monApp-patched.apk
apksigner sign --ks ~/.android/debug.keystore --ks-pass pass:android monApp-patched.apk3. Frida Gadget embarqué
# Objection patchapk injecte Frida gadget dans l'APK
# Utilisable sur device non-rooté
objection patchapk --source monApp.apk --skip-resources --ignore-nativelibs
# Produit monApp.objection.apk à installer4. Root + Burp CA system
Sur device rooté : pousser le certificat Burp dans /system/etc/security/cacerts/ via Magisk module.
5. Xposed / LSPosed modules
TrustMeAlready, SSLUnpinning : modules qui bypassent automatiquement les implémentations courantes.
Vulnérabilités fréquentes à rechercher
1. Hardcoded secrets
API keys AWS/Google/Firebase, tokens, passwords en dur dans strings.xml, constants.java, ou BuildConfig. Scanner avec trufflehog-android ou apkleaks.
2. Exposed components
AndroidManifest.xml avec android:exported="true" sur Activity, Service, BroadcastReceiver, ContentProvider sans permission. Tester via Drozer ou adb shell am start.
3. Insecure deep links
Deep link myapp://action/data non validé permet à une app malveillante d'invoquer des fonctions. Tester avec adb shell am start -a android.intent.action.VIEW -d "myapp://pay?amount=1".
4. WebView avec JavaScript bridge
addJavascriptInterface() expose méthodes Java au JS. Si la WebView charge du contenu externe, XSS = accès Java natif.
5. Insecure data storage
Shared Preferences non chiffrés, base SQLite en clair, fichiers dans /sdcard/, cache WebView avec données sensibles.
6. Crypto faible
MD5 / SHA-1 / DES / AES-ECB, IV hardcodé, clé dérivée d'un password court, absence de salt.
7. Insufficient server-side validation
Toute logique sensible côté client = contournable. Vérifier que chaque appel API revalide côté serveur.
Workflow recommandé 2026
Phase 1 - Triage (15-30 min)
Télécharger APK, calculer hashes
VirusTotal check
MobSF scan automatique
Lecture rapide du rapport MobSF
Phase 2 - Analyse statique (1-4 h)
apktool d pour ressources et AndroidManifest
JADX pour code Java/Kotlin
Grep patterns secrets, URLs, crypto faible
Identifier root detection, SSL pinning
Phase 3 - Préparation dynamique (30 min)
Émulateur ou device rooté
Frida server déployé
Burp Suite configuré avec CA installée
Objection testé
Phase 4 - Analyse dynamique (2-8 h)
Bypass SSL pinning si présent
Capture trafic API
Hooking des méthodes sensibles
Tests OWASP MASVS sections pertinentes
Phase 5 - Exploitation et PoC (variable)
Tenter vulns identifiées
Deep link abuse, intent injection
Data extraction
Phase 6 - Rapport (1-3 h)
Findings mappés MASVS + Mobile Top 10
Sévérité CVSS
Reproduction steps et PoC
Remédiations techniquesCadre légal en France et UE
Directive EU 2009/24/EC
Article 5-3 et article 6 autorisent le reverse pour :
- Interopérabilité entre logiciels.
- Recherche de sécurité.
- Maintenance légitime.
LCEN France
Articles 323-1 à 323-7 criminalisent :
- Accès et maintien non autorisé dans un SI.
- Entrave au fonctionnement.
- Introduction, modification, suppression frauduleuses.
Exception : recherche sur ses propres actifs.
Bonnes pratiques professionnelles
Pentest commercial :
Contrat SOW signé avec scope explicite
Autorisation écrite du propriétaire de l'APK
Clauses de confidentialité
Qualification PASSI si client régulé
Bug bounty :
Programme public avec scope défini (HackerOne, YesWeHack)
Respect du safe harbor légal du programme
Responsible disclosure
Recherche personnelle :
Apps téléchargées publiquement
Analyse sans distribution modifiée
Publication coordonnée (CVE, disclosure 90 jours)
À proscrire :
Distribution d'APK cracké
Exploitation d'une vuln sans autorisation
Reverse d'une app avec scope commercial directRessources d'apprentissage
OWASP officiels :
MASVS v2.0 (masvs.org)
MASTG (mas.owasp.org)
Mobile Top 10 2024 (owasp.org/www-project-mobile-top-10)
Labs vulnérables pour pratiquer :
DIVA (Damn Insecure and Vulnerable App)
InsecureBankv2 (Dinesh Shetty)
OWASP GoatDroid
Injuredandroid (B3nac)
Frida CodeShare (codeshare.frida.re)
Formation :
SANS SEC575 Mobile Device Security
OffSec OSWE (couvre partiellement mobile)
8kSec, Corellium formations mobile
Livres :
"Android Security Internals" (Nikolay Elenkov, 2014 mais intemporel)
"The Mobile Application Hacker's Handbook" (Dominic Chell et al.)
OWASP MASTG (gratuit en ligne)
Communauté :
r/reverseengineering
r/androiddev pour internals
Frida Discord server
Conférences : Black Hat Mobile, OFFENSIVECON, SSTICPoints clés à retenir
- APK = archive ZIP contenant AndroidManifest.xml, classes.dex, resources.arsc, res/, lib/, META-INF/. Depuis 2021, les nouvelles apps Google Play sont distribuées en AAB (Android App Bundle).
- 5 outils essentiels 2026 : JADX (48k+ stars, décompilateur référence), apktool (24k+, resources + smali + repack), Frida (instrumentation dynamique), Objection (wrapper Frida pre-built), MobSF (scan automatisé complet).
- Analyse statique 5 étapes : récupération APK (adb pull ou APKMirror), info de base (hashes, signature), apktool pour ressources et AndroidManifest, JADX pour code Java/Kotlin, MobSF pour automatisation.
- Analyse dynamique : émulateur Android Studio AVD ou Genymotion ou device Pixel rooté + Magisk. Frida + Objection pour hooking. Burp Suite + CA système ou Frida SSL unpinning pour trafic.
- Référentiels : OWASP MASVS v2.0 (8 catégories, 2 niveaux L1/L2), MASTG (testing guide détaillé), Mobile Top 10 OWASP 2024.
- Bypass certificate pinning : 5 approches (Frida universal, apktool patch Network Security Config, objection patchapk avec Frida gadget, root + Burp CA système, Xposed modules).
- Vulns fréquentes : hardcoded secrets, exposed components (exported=true), deep links non validés, WebView avec JS bridge, insecure storage, crypto faible (MD5/SHA-1/DES/ECB), validation côté client uniquement.
- Cadre légal : EU Directive 2009/24/EC et LCEN autorisent recherche sécu et interopérabilité sur ses actifs. Pentest pro = contrat SOW signé obligatoire. Bug bounty = respect du scope et safe harbor.
Pour les fondamentaux du reverse engineering dont l'analyse d'APK est une spécialisation, voir qu'est-ce que le reverse engineering : définition 2026. Pour un parcours d'apprentissage complet, roadmap reverse engineering 2026 : parcours complet étape par étape détaille 4 étapes de progression. Pour l'outillage complet du pentester qui inclut mobile, consulter les outils de base du pentester en 2026. Pour la validation côté serveur complémentaire des APIs mobiles, voir validation des entrées : bonnes pratiques secure coding 2026.





