Android Anti-Instrumentation & SSL Pinning Bypass (Frida/Objection)

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Αυτή η σελίδα παρέχει μια πρακτική ροή εργασίας για να επανακτήσετε dynamic analysis ενάντια σε Android apps που εντοπίζουν/αποκλείουν instrumentation λόγω root ή επιβάλουν TLS pinning. Επικεντρώνεται σε γρήγορο προσδιορισμό, κοινές ανιχνεύσεις και copy‑pasteable hooks/tactics για να τις παρακάμψετε χωρίς repacking όταν είναι δυνατόν.

Επιφάνεια Ανίχνευσης (τι ελέγχουν οι εφαρμογές)

  • Έλεγχοι root: 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
  • Έλεγχοι πρώιμης εκκίνησης: Application.onCreate() or process start hooks that crash if instrumentation is present
  • TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins

Βήμα 1 — Γρήγορη λύση: απόκρυψη του root με Magisk DenyList

  • Ενεργοποιήστε Zygisk στο Magisk
  • Ενεργοποιήστε DenyList, προσθέστε το πακέτο‑στόχο
  • Επανεκκινήστε και δοκιμάστε ξανά

Πολλές εφαρμογές ελέγχουν μόνο για προφανείς ενδείξεις (su/Magisk paths/getprop). Το DenyList συχνά ουδετεροποιεί τους απλοϊκούς ελέγχους.

References:

  • Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk

Βήμα 2 — 30‑δευτερολέπτων Frida Codeshare δοκιμές

Δοκιμάστε κοινά drop‑in scripts πριν εμβαθύνετε:

  • anti-root-bypass.js
  • anti-frida-detection.js
  • hide_frida_gum.js

Παράδειγμα:

frida -U -f com.example.app -l anti-frida-detection.js

Συνήθως παρεμβαίνουν (stub) στους Java root/debug checks, σε process/service scans και στο native ptrace(). Χρήσιμα σε lightly protected apps· hardened targets μπορεί να χρειαστούν tailored hooks.

  • Codeshare: https://codeshare.frida.re/

Αυτοματοποιήστε με Medusa (Frida framework)

Medusa παρέχει 90+ έτοιμα modules για SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, και άλλα.

git clone https://github.com/Ch0pin/medusa
cd medusa
pip install -r requirements.txt
python medusa.py

# Example interactive workflow
show categories
use http_communications/multiple_unpinner
use root_detection/universal_root_detection_bypass
run com.target.app

Συμβουλή: Το Medusa είναι εξαιρετικό για γρήγορες επιτυχίες πριν γράψετε custom hooks. Μπορείτε επίσης να cherry-pick modules και να τα συνδυάσετε με τα δικά σας scripts.

Βήμα 3 — Παράκαμψη init-time detectors με σύνδεση αργότερα

Πολλές ανιχνεύσεις εκτελούνται μόνο κατά τη δημιουργία της διεργασίας (process spawn)/onCreate(). Spawn‑time injection (-f) ή gadgets εντοπίζονται· η σύνδεση αφού φορτωθεί το UI μπορεί να τα προσπεράσει.

# 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

Αν αυτό δουλέψει, διατηρήστε τη συνεδρία σταθερή και προχωρήστε σε χαρτογράφηση και ελέγχους stub.

Βήμα 4 — Χαρτογράφηση της λογικής ανίχνευσης μέσω Jadx και αναζήτησης συμβολοσειρών

Static triage keywords in Jadx:

  • “frida”, “gum”, “root”, “magisk”, “ptrace”, “su”, “getprop”, “debugger”

Typical Java patterns:

public boolean isFridaDetected() {
return getRunningServices().contains("frida");
}

Συνηθισμένα API προς έλεγχο/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)

Βήμα 5 — Runtime stubbing with Frida (Java)

Παρακάμψτε custom guards ώστε να επιστρέφουν ασφαλείς τιμές χωρίς 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(); };
});

Αντιμετωπίζετε πρώιμες crashes; Dump classes λίγο πριν τερματιστεί για να εντοπίσετε πιθανούς detection namespaces:

Java.perform(() => {
Java.enumerateLoadedClasses({
onMatch: n => console.log(n),
onComplete: () => console.log('Done')
});
});

// Quick root detection stub example (adapt to target package/class names) Java.perform(() => { try { const RootChecker = Java.use(‘com.target.security.RootCheck’); RootChecker.isDeviceRooted.implementation = function () { return false; }; } catch (e) {} });

Καταγράψτε και αδρανοποιήστε ύποπτες μεθόδους για να επιβεβαιώσετε τη ροή εκτέλεσης:

Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
Det.checkFrida.implementation = function () {
console.log('checkFrida() called');
return false;
};
});

Bypass emulator/VM detection (Java stubs)

Συνηθισμένοι ευρετικοί έλεγχοι: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE που περιέχουν generic/goldfish/ranchu/sdk; ενδείξεις QEMU όπως /dev/qemu_pipe, /dev/socket/qemud; προεπιλεγμένη MAC 02:00:00:00:00:00; 10.0.2.x NAT; απουσία telephony/sensors.

Γρήγορο spoof των πεδίων Build:

Java.perform(function(){
var Build = Java.use('android.os.Build');
Build.MODEL.value = 'Pixel 7 Pro';
Build.MANUFACTURER.value = 'Google';
Build.BRAND.value = 'google';
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
});

Συμπληρώστε με stubs για ελέγχους ύπαρξης αρχείων και αναγνωριστικά (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) ώστε να επιστρέφουν ρεαλιστικές τιμές.

SSL pinning bypass quick hook (Java)

Αδρανοποιήστε custom TrustManagers και εξαναγκάστε permissive SSL contexts:

Java.perform(function(){
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var SSLContext = Java.use('javax.net.ssl.SSLContext');

// No-op validations
X509TrustManager.checkClientTrusted.implementation = function(){ };
X509TrustManager.checkServerTrusted.implementation = function(){ };

// Force permissive TrustManagers
var TrustManagers = [ X509TrustManager.$new() ];
var SSLContextInit = SSLContext.init.overload('[Ljavax.net.ssl.KeyManager;','[Ljavax.net.ssl.TrustManager;','java.security.SecureRandom');
SSLContextInit.implementation = function(km, tm, sr){
return SSLContextInit.call(this, km, TrustManagers, sr);
};
});

Σημειώσεις

  • Επεκτείνετε για OkHttp: hook okhttp3.CertificatePinner και HostnameVerifier όπως απαιτείται, ή χρησιμοποιήστε ένα universal unpinning script από CodeShare.
  • Παράδειγμα εκτέλεσης: frida -U -f com.target.app -l ssl-bypass.js --no-pause

Βήμα 6 — Ακολουθήστε το JNI/native μονοπάτι όταν τα Java hooks αποτύχουν

Ιχνηλατήστε σημεία εισόδου JNI για να εντοπίσετε native loaders και detection init:

frida-trace -n com.example.app -i "JNI_OnLoad"

Γρήγορος native triage των bundled .so αρχείων:

# 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'

Διαδραστικό/native reversing:

  • Ghidra: https://ghidra-sre.org/
  • r2frida: https://github.com/nowsecure/r2frida

Παράδειγμα: neuter ptrace to defeat simple anti‑debug in libc:

const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) {
Interceptor.replace(ptrace, new NativeCallback(function () {
return -1; // pretend failure
}, 'int', ['int', 'int', 'pointer', 'pointer']));
}

Δείτε επίσης: Reversing Native Libraries

Βήμα 7 — Objection patching (embed gadget / strip basics)

Αν προτιμάτε το repacking αντί για runtime hooks, δοκιμάστε:

objection patchapk --source app.apk

Σημειώσεις:

  • Απαιτεί apktool· βεβαιωθείτε ότι έχετε πρόσφατη έκδοση από τον επίσημο οδηγό για να αποφύγετε προβλήματα build: https://apktool.org/docs/install
  • Gadget injection επιτρέπει instrumentation χωρίς root αλλά μπορεί ακόμα να εντοπιστεί από πιο ισχυρούς init‑time ελέγχους.

Προαιρετικά, προσθέστε LSPosed modules και Shamiko για πιο ισχυρή απόκρυψη root σε περιβάλλοντα Zygisk, και επιμεληθείτε τη DenyList ώστε να καλύπτει child processes.

Για ένα πλήρες workflow που περιλαμβάνει script-mode Gadget configuration και την ενσωμάτωση του Frida 17+ agent στο APK, δείτε:

Frida Tutorial — Self-contained agent + Gadget embedding

Αναφορές:

  • Objection: https://github.com/sensepost/objection

Βήμα 8 — Fallback: Patch TLS pinning για ορατότητα δικτύου

Αν η instrumentation μπλοκάρεται, μπορείτε να ελέγξετε την κίνηση αφαιρώντας στατικά το pinning:

apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
  • Εργαλείο: https://github.com/shroudedcode/apk-mitm
  • Για κόλπα CA‑trust στη διαμόρφωση δικτύου (και Android 7+ user CA trust), δείτε:

Make APK Accept CA Certificate

Install Burp Certificate

Χρήσιμο cheat‑sheet εντολών

# 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

Universal proxy forcing + TLS unpinning (HTTP Toolkit Frida hooks)

Οι σύγχρονες εφαρμογές συχνά αγνοούν τους system proxies και επιβάλλουν πολλαπλά στρώματα pinning (Java + native), καθιστώντας την καταγραφή της κίνησης προβληματική ακόμα και με εγκατεστημένα user/system CAs. Μια πρακτική προσέγγιση είναι να συνδυάσετε universal TLS unpinning με proxy forcing μέσω έτοιμων Frida hooks, και να δρομολογήσετε τα πάντα μέσω mitmproxy/Burp.

Ροή εργασίας

  • Τρέξτε mitmproxy στον host σας (ή Burp). Βεβαιωθείτε ότι η συσκευή μπορεί να φτάσει στο host IP/port.
  • Φορτώστε τα ενοποιημένα Frida hooks του HTTP Toolkit για να unpin TLS και να force proxy usage σε κοινά stacks (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, κ.λπ.). Αυτό παρακάμπτει τους ελέγχους CertificatePinner/TrustManager και αντικαθιστά τους proxy selectors, οπότε η κίνηση αποστέλλεται πάντα μέσω του proxy σας ακόμα κι αν η εφαρμογή απενεργοποιεί ρητά proxies.
  • Ξεκινήστε την εφαρμογή στόχο με Frida και το hook script, και καταγράψτε τα requests στο mitmproxy.

Παράδειγμα

# Device connected via ADB or over network (-U)
# See the repo for the exact script names & options
frida -U -f com.vendor.app \
-l ./android-unpinning-with-proxy.js \
--no-pause

# mitmproxy listening locally
mitmproxy -p 8080

Σημειώσεις

  • Συνδύασέ το με ένα system-wide proxy μέσω adb shell settings put global http_proxy <host>:<port> όταν είναι δυνατό. Τα Frida hooks θα επιβάλουν τη χρήση proxy ακόμα και όταν οι εφαρμογές παρακάμπτουν τις global settings.
  • Αυτή η τεχνική είναι ιδανική όταν χρειάζεσαι MITM σε mobile-to-IoT onboarding flows όπου το pinning/η αποφυγή proxy είναι συνηθισμένα.
  • Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks