# Yerel Kütüphanelerin Tersine Mühendisliği {{#include ../../banners/hacktricks-training.md}} **Daha fazla bilgi için bakınız:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html) Android uygulamaları performans-kritik görevler için genellikle C veya C++ ile yazılmış native kütüphaneler kullanabilir. Kötü amaçlı yazılım yazarları da bu kütüphaneleri kötüye kullanır çünkü ELF paylaşılan nesneleri hâlâ DEX/OAT byte-code'dan daha zor decompile edilir. Bu sayfa, Android `.so` dosyalarını tersine mühendislik yapmayı kolaylaştıran *pratik* iş akışlarına ve *son* tooling geliştirmelerine (2023-2025) odaklanır. --- ### Yeni çekilmiş `libfoo.so` için hızlı triyaj iş akışı 1. **Kütüphaneyi çıkarın** ```bash # From an installed application adb shell "run-as cat lib/arm64-v8a/libfoo.so" > libfoo.so # Or from the APK (zip) unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/ ``` 2. **Mimari ve korumaları belirleyin** ```bash file libfoo.so # arm64 or arm32 / x86 readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc. checksec --file libfoo.so # (peda/pwntools) ``` 3. **Dışa aktarılan sembolleri ve JNI bağlarını listeleyin** ```bash readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI ``` 4. **Bir decompiler'a yükleyin** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) ve otomatik analizi çalıştırın. Yeni Ghidra sürümleri, Android 14 NDK ile derlenen kütüphanelerin analizini büyük ölçüde iyileştiren PAC/BTI stub'larını ve MTE etiketlerini tanıyan bir AArch64 decompiler getirdi. 5. **Statik vs dinamik reversing'e karar verin:** stripped, obfuscated kod genellikle *instrumentation* gerektirir (Frida, ptrace/gdbserver, LLDB). --- ### Dynamic Instrumentation (Frida ≥ 16) Frida’nın 16-serisi, hedef modern Clang/LLD optimizasyonları kullandığında yardımcı olan birkaç Android-özel geliştirme getirdi: * `thumb-relocator` artık LLD’nin agresif hizalaması (`--icf=all`) tarafından üretilen küçük ARM/Thumb fonksiyonlarına *hook* atabilir. * Android'de *ELF import slots*'u listelemek ve yeniden bağlamak çalışıyor; inline hook'lar reddedildiğinde modül başına `dlopen()`/`dlsym()` patchlemeye izin veriyor. * Java hooking, uygulamalar Android 14'te `--enable-optimizations` ile derlendiğinde kullanılan yeni **ART quick-entrypoint** için düzeltildi. Örnek: `RegisterNatives` aracılığıyla kaydedilen tüm fonksiyonların listelenmesi ve çalışma zamanında adreslerini dump etme: ```javascript Java.perform(function () { var Runtime = Java.use('java.lang.Runtime'); var register = Module.findExportByName(null, 'RegisterNatives'); Interceptor.attach(register, { onEnter(args) { var envPtr = args[0]; var clazz = Java.cast(args[1], Java.use('java.lang.Class')); var methods = args[2]; var count = args[3].toInt32(); console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' methods'); // iterate & dump (JNI nativeMethod struct: name, sig, fnPtr) } }); }); ``` Frida will work out of the box on PAC/BTI-enabled devices (Pixel 8/Android 14+) as long as you use frida-server 16.2 or later – earlier versions failed to locate padding for inline hooks. ### Process-local JNI telemetry via preloaded .so (SoTap) Tam özellikli instrumentation aşırı veya engellenmiş olduğunda, hedef süreç içinde küçük bir logger önceden yükleyerek hala native düzeyde görünürlük elde edebilirsiniz. SoTap, aynı uygulama süreci içindeki diğer JNI (.so) kütüphanelerin çalışma zamanındaki davranışını loglayan hafif bir Android native (.so) kütüphanesidir (root gerektirmez). Key properties: - Initializes early and observes JNI/native interactions inside the process that loads it. - Persists logs using multiple writable paths with graceful fallback to Logcat when storage is restricted. - Source-customizable: edit sotap.c to extend/adjust what gets logged and rebuild per ABI. Setup (repack the APK): 1) Drop the proper ABI build into the APK so the loader can resolve libsotap.so: - lib/arm64-v8a/libsotap.so (for arm64) - lib/armeabi-v7a/libsotap.so (for arm32) 2) Ensure SoTap loads before other JNI libs. Inject a call early (e.g., Application subclass static initializer or onCreate) so the logger is initialized first. Smali snippet example: ```smali const-string v0, "sotap" invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V ``` 3) Rebuild/sign/install, run the app, then collect logs. Log paths (checked in order): ``` /data/user/0/%s/files/sotap.log /data/data/%s/files/sotap.log /sdcard/Android/data/%s/files/sotap.log /sdcard/Download/sotap-%s.log # If all fail: fallback to Logcat only ``` Notlar ve sorun giderme: - ABI hizalaması zorunludur. Uyuşmazlık UnsatisfiedLinkError tetikler ve logger yüklenmez. - Depolama kısıtlamaları modern Android'te yaygındır; dosya yazmaları başarısız olursa, SoTap yine de Logcat üzerinden çıktı verir. - Davranış/ayrıntı seviyesi özelleştirilebilir amaçlıdır; sotap.c düzenledikten sonra kaynaktan yeniden derleyin. Bu yaklaşım, işlem başlangıcından itibaren native çağrı akışlarını gözlemlemenin kritik olduğu fakat root/sistem-geneli hook'larının mevcut olmadığı durumlarda malware triage ve JNI hata ayıklama için kullanışlıdır. --- ### APK'larda aranması gereken güncel zafiyetler | Yıl | CVE | Etkilenen kütüphane | Notlar | |------|-----|------------------|-------| |2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|WebP görüntülerini decode eden native koddan erişilebilen heap buffer overflow. Birçok Android uygulaması zayıf sürümleri paketler. Bir APK içinde `libwebp.so` görürseniz, sürümünü kontrol edin ve exploit veya patch denemesi yapın.| | |2024|Multiple|OpenSSL 3.x series|Birçok bellek-güvenliği ve padding-oracle sorunu. Birçok Flutter & ReactNative paket kendi `libcrypto.so`'sunu içeriyor.| APK içinde *third-party* `.so` dosyaları gördüğünüzde, hash'lerini kaynak (upstream) güvenlik duyurularıyla her zaman karşılaştırın. SCA (Software Composition Analysis) mobilde nadirdir, bu yüzden eski zayıf build'ler yaygındır. --- ### Anti-Reversing & Hardening eğilimleri (Android 13-15) * **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14, desteklenen ARMv8.3+ silikonlarda sistem kütüphanelerinde PAC/BTI'yi etkinleştirir. Decompiler'lar şimdi PAC‐ile ilişkili sahte-talimatları gösterir; dinamik analiz için Frida PAC'i kaldırdıktan *sonra* trampolinler enjekte eder, ancak özel trampolinleriniz gerektiğinde `pacda`/`autibsp` çağırmalıdır. * **MTE & Scudo hardened allocator:** memory-tagging isteğe bağlıdır fakat birçok Play-Integrity farkında uygulama `-fsanitize=memtag` ile derlenir; tag hatalarını yakalamak için `setprop arm64.memtag.dump 1` ve `adb shell am start ...` kullanın. * **LLVM Obfuscator (opaque predicates, control-flow flattening):** ticari packer'lar (örn., Bangcle, SecNeo) giderek *native* kodu da koruyor, sadece Java'yı değil; `.rodata` içinde sahte control-flow ve şifrelenmiş string blob'ları bekleyin. --- ### Kaynaklar - **Learning ARM Assembly:** [Azeria Labs – ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/) - **JNI & NDK Documentation:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](https://developer.android.com/ndk/guides/) - **Debugging Native Libraries:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) ### Referanslar - Frida 16.x change-log (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/) - NVD advisory for `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) - SoTap: Lightweight in-app JNI (.so) behavior logger – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap) - SoTap Releases – [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases) - How to work with SoTap? – [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13) {{#include ../../banners/hacktricks-training.md}}