Android Anti-Instrumentation & SSL Pinning Bypass (Frida/Objection)
Reading time: 7 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Cette page fournit un workflow pratique pour retrouver dynamic analysis contre des applications Android qui dĂ©tectent/empĂȘchent l'instrumentation liĂ©e au root ou qui appliquent TLS pinning. Elle se concentre sur le triage rapide, les dĂ©tections courantes et des hooks/tactiques copiables pour les bypasser sans repacking quand c'est possible.
Detection Surface (what apps check)
- Root checks: su binary, Magisk paths, getprop values, common root packages
- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
- Native antiâdebug: ptrace(), syscalls, antiâattach, breakpoints, inline hooks
- Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
Step 1 â Quick win: hide root with Magisk DenyList
- Enable Zygisk in Magisk
- Enable DenyList, add the target package
- Reboot and retest
Many apps only look for obvious indicators (su/Magisk paths/getprop). DenyList often neutralizes naive checks.
References:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
Step 2 â 30âsecond Frida Codeshare tests
Try common dropâin scripts before deep diving:
- anti-root-bypass.js
- anti-frida-detection.js
- hide_frida_gum.js
Exemple:
frida -U -f com.example.app -l anti-frida-detection.js
Ces techniques neutralisent généralement les vérifications Java root/debug, les process/service scans et ptrace() natifs. Utile sur des apps peu protégées ; les hardened targets peuvent nécessiter des hooks adaptés.
- Codeshare: https://codeshare.frida.re/
Ătape 3 â Contourner les dĂ©tecteurs init-time en s'attachant tardivement
Beaucoup de détections ne s'exécutent que lors du process spawn/onCreate(). Les injections au spawn (-f) ou les gadgets se font repérer ; s'attacher aprÚs le chargement de l'UI peut permettre de passer outre.
# Launch the app normally (launcher/adb), wait for UI, then attach
frida -U -n com.example.app
# Or with Objection to attach to running process
aobjection --gadget com.example.app explore # if using gadget
Si cela fonctionne, maintenez la session stable et procédez à la cartographie et aux vérifications des stubs.
Ătape 4 â Cartographier la logique de dĂ©tection via Jadx et recherche de chaĂźnes
Mots-clés de triage statique dans Jadx :
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
Schémas Java typiques :
public boolean isFridaDetected() {
return getRunningServices().contains("frida");
}
APIs courantes Ă examiner/hook:
- android.os.Debug.isDebuggerConnected
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
- java.lang.System.loadLibrary / System.load (native bridge)
- java.lang.Runtime.exec / ProcessBuilder (probing commands)
- android.os.SystemProperties.get (root/emulator heuristics)
Ătape 5 â Runtime stubbing with Frida (Java)
Surcharger les vérifications personnalisées pour renvoyer des valeurs sûres sans repacking:
Java.perform(() => {
const Checks = Java.use('com.example.security.Checks');
Checks.isFridaDetected.implementation = function () { return false; };
// Neutralize debugger checks
const Debug = Java.use('android.os.Debug');
Debug.isDebuggerConnected.implementation = function () { return false; };
// Example: kill ActivityManager scans
const AM = Java.use('android.app.ActivityManager');
AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); };
});
Triage des plantages précoces ? Dump classes juste avant que l'application ne plante pour repérer les namespaces de détection probables :
Java.perform(() => {
Java.enumerateLoadedClasses({
onMatch: n => console.log(n),
onComplete: () => console.log('Done')
});
});
Consigner et neutraliser les méthodes suspectes pour confirmer le flux d'exécution :
Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
Det.checkFrida.implementation = function () {
console.log('checkFrida() called');
return false;
};
});
Ătape 6 â Suivre la piste JNI/native lorsque les hooks Java Ă©chouent
Tracer les entry points JNI pour localiser les native loaders et l'init de détection :
frida-trace -n com.example.app -i "JNI_OnLoad"
Triage natif rapide des fichiers .so embarqués :
# List exported symbols & JNI
nm -D libfoo.so | head
objdump -T libfoo.so | grep Java_
strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
Reversing interactif/natif:
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
Exemple : neutraliser ptrace pour contourner un antiâdebug simple dans libc:
const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) {
Interceptor.replace(ptrace, new NativeCallback(function () {
return -1; // pretend failure
}, 'int', ['int', 'int', 'pointer', 'pointer']));
}
Voir aussi: Reversing Native Libraries
Ătape 7 â Objection patching (embed gadget / strip basics)
Si vous préférez le repacking aux runtime hooks, essayez :
objection patchapk --source app.apk
Remarques:
- Nécessite apktool ; assurez-vous d'avoir une version récente à partir du guide officiel pour éviter des problÚmes de build : https://apktool.org/docs/install
- Gadget injection permet l'instrumentation sans root mais peut quand mĂȘme ĂȘtre dĂ©tectĂ©e par des vĂ©rifications initâtime plus strictes.
Références:
- Objection: https://github.com/sensepost/objection
Ătape 8 â Solution de secours : Patch TLS pinning pour la visibilitĂ© rĂ©seau
Si l'instrumentation est bloquée, vous pouvez toujours inspecter le trafic en supprimant le pinning statiquement :
apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
- Outil: https://github.com/shroudedcode/apk-mitm
- Pour les astuces CAâtrust de configuration rĂ©seau (et Android 7+ user CA trust), voir :
Make APK Accept CA Certificate
Aide-mémoire pratique des commandes
# List processes and attach
frida-ps -Uai
frida -U -n com.example.app
# Spawn with a script (may trigger detectors)
frida -U -f com.example.app -l anti-frida-detection.js
# Trace native init
frida-trace -n com.example.app -i "JNI_OnLoad"
# Objection runtime
objection --gadget com.example.app explore
# Static TLS pinning removal
apk-mitm app.apk
Conseils & mises en garde
- Privilégiez l'attachement tardif plutÎt que le spawn lorsque les apps plantent au lancement
- Certaines dĂ©tections se relancent dans des flows critiques (e.g., payment, auth) â gardez les hooks actifs pendant la navigation
- Mélangez analyse statique et dynamique : string hunt dans Jadx pour présélectionner des classes ; puis posez des hooks sur les méthodes pour vérifier au runtime
- Les apps hardened peuvent utiliser des packers et du TLS pinning natif â attendez-vous Ă reverser du code natif
Références
- Reversing Android Apps: Bypassing Detection Like a Pro
- Frida Codeshare
- Objection
- apk-mitm
- Jadx
- Ghidra
- r2frida
- Apktool install guide
- Magisk
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.