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

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).

Ondersteun HackTricks

This bladsy verskaf ’n praktiese workflow om dinamiese analise te hervat teen Android-apps wat instrumentation opspoor/root‑blokkeer of TLS pinning afdwing. Dit fokus op vinnige triage, algemene detections, en copy‑pasteable hooks/tactics om dit te omseil sonder herverpakking waar moontlik.

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

Bypassing Anti-Frida Detection / Stealth Frida Servers

phantom-frida bou Frida vanaf die bron oor en pas ongeveer 90 pleisters toe sodat algemene Frida fingerprints verdwyn terwyl die stock Frida protocol steeds versoenbaar bly (frida-tools kan steeds koppel). Teiken: apps wat grep op /proc (cmdline, maps, task comm, fd readlink), D-Bus service names, default ports, of exported symbols.

Phases:

  • Source patches: globale hernoeming van frida identifiers (server/agent/helper) en ’n herboude helper DEX met ’n hernoemde Java package.
  • Targeted build/runtime patches: meson tweaks, memfd label verander na jit-cache, SELinux labels (bv. frida_file) hernoem, libc hooks op exit/signal gedeaktiveer om hook-detectors te vermy.
  • Post-build rename: exported symbol frida_agent_main hernoem na die eerste compileer (Vala emiteer dit), wat ’n tweede inkrementele build vereis.
  • Binary hex patches: thread names (gmain, gdbus, pool-spawner) vervang; opsionele sweep verwyder oorblywende frida/Frida strings.

Detection vectors covered:

  • Base (1–8): process name frida-server, mapped libfrida-agent.so, thread names, memfd label, exported frida_agent_main, SELinux labels, libc hook side-effects, en D-Bus service re.frida.server word hernoem/geen-effek gemaak.
  • Extended (9–16): verander listening port (--port), hernoem D-Bus interfaces/internal C symbols/GType names, temp paths soos .frida/frida-, sweep binary strings, hernoem build-time defines en asset paths (libdir/frida). D-Bus interface names wat deel is van die wire protocol bly onveranderd in base mode om stock clients nie te breek nie.

Build/usage (Android arm64 voorbeeld):

python3 build.py --version 17.7.2 --name myserver --port 27142 --extended --verify
adb push output/myserver-server-17.7.2-android-arm64 /data/local/tmp/myserver-server
adb shell chmod 755 /data/local/tmp/myserver-server
adb shell /data/local/tmp/myserver-server -D &
adb forward tcp:27142 tcp:27142
frida -H 127.0.0.1:27142 -f com.example.app

Flags: --skip-build (patch only), --skip-clone, --arch, --ndk-path, --temp-fixes; WSL helper: wsl -d Ubuntu bash build-wsl.sh.

Stap 1 — Vinnige wen: verberg root met Magisk DenyList

  • Aktiveer Zygisk in Magisk
  • Aktiveer DenyList, voeg die teiken‑pakket by
  • Herbegin en toets weer

Baie apps kyk net na voor die hand liggende aanduiders (su/Magisk paths/getprop). DenyList neutraliseer dikwels naïewe kontroles.

References:

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

Play Integrity / Zygisk detecties (post‑SafetyNet)

Nuwer bank-/ID-apps koppel runtime‑kontroles aan Google Play Integrity (SafetyNet‑vervanger) en kan ook crash as Zygisk self teenwoordig is. Vinnige triage‑wenke:

  • Skakel Zygisk tydelik uit (afskakel + herbegin) en probeer weer; sommige apps crash sodra Zygote‑injeksie laai.
  • As attestation die aanmelding blokkeer, patch Google Play Services met PlayIntegrityFix/Fork + TrickyStore of gebruik ReZygisk/Zygisk‑Next slegs tydens toetsing. Hou die teiken in DenyList en vermy LSPosed‑modules wat props leak.
  • Vir eenmalige draaie, gebruik KernelSU/APatch (geen Zygote‑injeksie) om onder Zygisk‑heuristieke te bly, en heg dan Frida aan.

Stap 2 — 30‑sekonde Frida Codeshare‑toetse

Probeer algemene drop‑in‑skripte voor jy diep delf:

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

Example:

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

Hierdie stubs maak gewoonlik Java root/debug-kontroles, proses-/diens-skanderings en native ptrace() onskadelik. Nuttig op lig beskermde apps; geharde teikens mag aangepaste hooks benodig.

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

Automatiseer met Medusa (Frida framework)

Medusa bied 90+ kant-en-klare modules vir SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, en meer.

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

Wenk: Medusa is uitstekend vir vinnige oorwinnings voordat jy aangepaste hooks skryf. Jy kan ook modules cherry-pick en dit kombineer met jou eie scripts.

Outomatiseer met Auto-Frida (spawn-mode + consolidated hooks)

Auto-Frida is a Frida automation toolkit wat fokus op herhaalbare opstelling plus outo-opsporing van beskerming en consolidated bypass script generation. Dit is nuttig wanneer apps baie vroeg kontrole uitvoer of wanneer meervoudige bypass modules andersins dieselfde APIs dubbel-hook.

Belangrike outomatiseringsidees:

  • Spawn-mode analysis om hooks te installeer voor Application.onCreate() sodat vroeë SSL pinning, root-, emulator- of anti-Frida-kontroles opgespoor word.
  • Protection detection + auto-bypass: detectie-resultate dryf die generering van ’n enkele geconsolideerde script wat elke Java metode/native symbol een keer hook, wat app-ongelukke deur oorvleuelende hooks verminder.
  • Frida server lifecycle checks: valideer servergesondheid (process + port 27042 + frida-ps handshake) voor aflaai/herbegin om runs stabiel te hou.

Vinnige begin:

git clone https://github.com/ommirkute/Auto-Frida.git
cd Auto-Frida
pip install -r requirements.txt
python auto_frida.py

Aantekeninge

  • Auto-Frida kan outomaties frida/frida-tools installeer indien dit ontbreek en ondersteun keuse van meerdere toestelle.
  • Gegenereerde skripte kan onmiddellik uitgevoer word of ná analise met jou pasgemaakte hooks saamgevoeg word.

Stap 3 — Bypass init‑tyd detektore deur later aan te heg

Baie detektore werk slegs tydens process spawn/onCreate(). Spawn‑time injection (-f) of gadgets word gevang; aanheg ná die UI laai kan daardeur glip.

# 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

As dit werk, hou die sessie stabiel en gaan voort na map- en stubkontroles.

Stap 4 — Karteer opsporingslogika via Jadx en string-soektog

Statiese triage-sleutelwoorde in Jadx:

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

Tipiese Java-patrone:

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

Algemene APIs om te kontroleer/te 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)

Stap 5 — Runtime stubbing met Frida (Java)

Oorskryf aangepaste guards om veilige waardes terug te gee sonder om te herpak:

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(); };
});

Besig met triage van vroeë crashes? Dump classes net voordat dit sterf om waarskynlike detection namespaces op te spoor:

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

Vinnige root detection stub voorbeeld (pas aan by target package/class names):

Java.perform(() => {
try {
const RootChecker = Java.use('com.target.security.RootCheck');
RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {}
});

Log en neutraliseer verdagte metodes om die uitvoeringstroom te bevestig:

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)

Algemene heuristieke: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE wat generic/goldfish/ranchu/sdk bevat; QEMU artifacts soos /dev/qemu_pipe, /dev/socket/qemud; standaard MAC 02:00:00:00:00:00; 10.0.2.x NAT; ontbrekende telefonie/sensore.

Vinnige spoof van Build-velde:

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';
});

Voeg stubs by vir kontroles van lêer-bestaan en identifiseerders (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) om realistiese waardes terug te gee.

SSL pinning bypass quick hook (Java)

Neutraliseer aangepaste TrustManagers en dwing permissiewe SSL contexts af:

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);
};
});

Aantekeninge

  • Breid uit vir OkHttp: hook okhttp3.CertificatePinner en HostnameVerifier soos nodig, of gebruik ’n universele unpinning script vanaf CodeShare.
  • Voorbeeld om uit te voer: frida -U -f com.target.app -l ssl-bypass.js --no-pause

OkHttp4 / gRPC / Cronet pinning (2024+)

Moderne stacks pin binne nuwer APIs (OkHttp4+, gRPC oor Cronet/BoringSSL). Voeg hierdie hooks by wanneer die basiese SSLContext hook vasloop:

Java.perform(() => {
try {
const Pinner = Java.use('okhttp3.CertificatePinner');
Pinner.check.overload('java.lang.String', 'java.util.List').implementation = function(){};
Pinner.check$okhttp.implementation = function(){};
} catch (e) {}

try {
const CronetB = Java.use('org.chromium.net.CronetEngine$Builder');
CronetB.enablePublicKeyPinningBypassForLocalTrustAnchors.overload('boolean').implementation = function(){ return this; };
CronetB.setPublicKeyPins.overload('java.lang.String', 'java.util.Set', 'boolean').implementation = function(){ return this; };
} catch (e) {}
});

As TLS steeds misluk, skakel oor na native en patcheer die BoringSSL-verifikasie-toegangspunte wat deur Cronet/gRPC gebruik word:

const customVerify = Module.findExportByName(null, 'SSL_CTX_set_custom_verify');
if (customVerify) {
Interceptor.attach(customVerify, {
onEnter(args){
// arg0 = SSL_CTX*, arg1 = mode, arg2 = callback
args[1] = ptr(0); // SSL_VERIFY_NONE
args[2] = NULL;  // disable callback
}
});
}

Stap 6 — Volg die JNI/native spoor wanneer Java hooks faal

Spoor JNI ingangspunte op om native loaders en detection init te lokaliseer:

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

Vinnige inheemse triage van ingeslote .so-lêers:

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

Interaktiewe/native reversing:

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

Voorbeeld: neutraliseer ptrace om eenvoudige anti‑debug in libc te omseil:

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

Sien ook: Reversing Native Libraries

Stap 7 — Objection patching (embed gadget / strip basics)

As jy repacking bo runtime hooks verkies, probeer:

objection patchapk --source app.apk

Aantekeninge:

  • Vereis apktool; maak seker van ’n huidige weergawe volgens die amptelike gids om bouprobleme te vermy: https://apktool.org/docs/install
  • Gadget injection maak instrumentation sonder root moontlik, maar kan steeds deur sterker init‑time checks opgespoor word.

Opsioneel, voeg LSPosed modules en Shamiko by vir sterker root hiding in Zygisk-omgewings, en stel DenyList saam om onderprosesse te dek.

Vir ’n volledige workflow, insluitend script-mode Gadget configuration en bundling van jou Frida 17+ agent in die APK, sien:

Frida Tutorial — Self-contained agent + Gadget embedding

Verwysings:

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

Stap 8 — Fallback: Patch TLS pinning for network visibility

As instrumentation geblokkeer is, kan jy steeds verkeer inspekteer deur pinning staties te verwyder:

apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
  • Gereedskap: https://github.com/shroudedcode/apk-mitm
  • Vir netwerkkonfigurasie CA‑vertrouens‑truuks (en Android 7+ user CA trust), sien:

Make APK Accept CA Certificate

Install Burp Certificate

LSPosed/Xposed Hooking Abuse (Telephony/SMS)

Op gerootte toestelle kan LSPosed/Xposed-modules Java telephony/SMS APIs hook by runtime, die APK onveranderd op die skyf hou en terselfdertyd volle beheer oor wat die app sien uitoefen. Dit word gereeld misbruik om SIM‑binding flows te omseil wat plaaslike telephony APIs of die plaaslike SMS-provider se toestand vertrou.

Belangrike primitiewe

  • Onderdruk uitgaande verifikasie-SMS terwyl jy die token eksfiltreer deur SmsManager.sendTextMessage in beforeHookedMethod kort te sluit.
  • Spoof MSISDN/line number deur TelephonyManager.getLine1Number() en SubscriptionInfo.getNumber() te dwing om ’n aanvaller-beheerde waarde terug te gee.
  • Plant ’n vals “Sent” rekord in die SMS-provider sodat apps wat plaaslike SMS-geskiedenis nagaan ’n suksesvolle stuur sien, selfs al het die carrier dit nooit ontvang nie.

Voorbeeld: blokkeer SMS-versending en vang inhoud op

XposedHelpers.findAndHookMethod(
"android.telephony.SmsManager",
lpparam.classLoader,
"sendTextMessage",
String.class, String.class, String.class, PendingIntent.class, PendingIntent.class,
new XC_MethodHook() {
protected void beforeHookedMethod(MethodHookParam param) {
String body = (String) param.args[2];
// exfiltrate body to operator channel
param.setResult(null); // suppress real SMS send
}
}
);

Voorbeeld: spoof toestel telefoonnommer

XposedHelpers.findAndHookMethod(
"android.telephony.TelephonyManager",
lpparam.classLoader,
"getLine1Number",
new XC_MethodHook() {
protected void afterHookedMethod(MethodHookParam param) {
param.setResult(spoofedMsisdn);
}
}
);
XposedHelpers.findAndHookMethod(
"android.telephony.SubscriptionInfo",
lpparam.classLoader,
"getNumber",
new XC_MethodHook() {
protected void afterHookedMethod(MethodHookParam param) {
param.setResult(spoofedMsisdn);
}
}
);

Voorbeeld: inject ’n vals “Sent” SMS-rekord

ContentValues v = new ContentValues();
v.put("address", dest);
v.put("body", body);
v.put("type", 2);   // sent
v.put("status", 0); // success
context.getContentResolver().insert(Uri.parse("content://sms/sent"), v);

Handige opdrag-kortlys

# 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

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

Moderne apps ignoreer dikwels stelselproxies en dwing meervoudige lae van pinning af (Java + native), wat die vaslegging van verkeer pynlik maak selfs met gebruikers-/stelsel-CA’s geïnstalleer. ’n Praktiese benadering is om universele TLS unpinning te kombineer met proxy forcing via kant-en-klare Frida hooks, en alles deur mitmproxy/Burp te lei.

Workflow

  • Start mitmproxy op jou host (of Burp). Verseker dat die toestel die host IP/poort kan bereik.
  • Laai HTTP Toolkit se gekonsolideerde Frida hooks in om beide TLS unpinning en proxy forcing oor algemene stacks te bewerkstellig (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, ens.). Dit omseil CertificatePinner/TrustManager-kontroles en oorskryf proxy selectors, sodat verkeer altyd via jou proxy gestuur word, selfs as die app proxies eksplisiet uitskakel.
  • Begin die teiken-app met Frida en die hook-script, en vang versoeke in mitmproxy.

Example

# 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

Aantekeninge

  • Kombineer dit met ’n stelselwye proxy via adb shell settings put global http_proxy <host>:<port> waar moontlik. Die Frida hooks sal proxygebruik afdwing selfs wanneer apps globale instellings omseil.
  • Hierdie tegniek is ideaal wanneer jy ’n MITM nodig het vir mobile-na-IoT aanmeldvloei waar pinning/proxy-omseiling algemeen is.
  • Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning

Verwysings

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).

Ondersteun HackTricks