Yerel Kütüphanelerin Tersine Mühendisliği

Reading time: 7 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Daha fazla bilgi için bakınız: 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 <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Or from the APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
  1. 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)
  1. 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
  1. 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.
  2. 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)
  1. 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
  1. 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ılCVEEtkilenen kütüphaneNotlar
2023CVE-2023-4863libwebp ≤ 1.3.1WebP 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.
2024MultipleOpenSSL 3.x seriesBirç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

Referanslar

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin