hacktricks/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md

6.5 KiB
Raw Blame History

Yerel Kütüphaneleri Tersine Mühendislik

{{#include ../../banners/hacktricks-training.md}}

Daha fazla bilgi için kontrol edin: https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html

Android uygulamaları, performans açısından kritik görevler için genellikle C veya C++ ile yazılmış yerel kütüphaneler kullanabilir. Kötü amaçlı yazılım yaratıcıları da bu kütüphaneleri kötüye kullanır çünkü ELF paylaşılan nesneleri, DEX/OAT bayt kodundan daha zor decompile edilir. Bu sayfa, Android .so dosyalarını tersine mühendislik yapmayı kolaylaştıran pratik iş akışlarına ve son araç geliştirmelerine (2023-2025) odaklanmaktadır.


Yeni çekilmiş libfoo.so için Hızlı Triage İş Akışı

  1. Kütüphaneyi çıkarın
# Yüklenmiş bir uygulamadan
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Ya da APK'dan (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
  1. Mimari ve korumaları tanımlayın
file libfoo.so        # arm64 veya arm32 / x86
readelf -h libfoo.so  # OS ABI, PIE, NX, RELRO, vb.
checksec --file libfoo.so  # (peda/pwntools)
  1. Dışa aktarılan sembolleri ve JNI bağlamalarını listeleyin
readelf -s libfoo.so | grep ' Java_'     # dinamik bağlantılı JNI
strings libfoo.so   | grep -i "RegisterNatives" -n   # statik kayıtlı JNI
  1. Bir decompiler yükleyin (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper veya Cutter/Rizin) ve otomatik analiz çalıştırın. Daha yeni Ghidra sürümleri, Android 14 NDK ile oluşturulmuş kütüphanelerin analizini büyük ölçüde iyileştiren PAC/BTI stub'larını ve MTE etiketlerini tanıyan bir AArch64 decompiler tanıttı.
  2. Statik ve dinamik tersine mühendislik arasında karar verin: soyulmuş, obfuscate edilmiş kod genellikle enstrümantasyon (Frida, ptrace/gdbserver, LLDB) gerektirir.

Dinamik Enstrümantasyon (Frida ≥ 16)

Fridanın 16 serisi, hedef modern Clang/LLD optimizasyonları kullandığında yardımcı olan birkaç Android'e özgü iyileştirme getirdi:

  • thumb-relocator artık LLDnin agresif hizalaması (--icf=all) tarafından üretilen küçük ARM/Thumb fonksiyonlarını hook yapabilir.
  • ELF import slotlarını listeleme ve yeniden bağlama Android'de çalışır, inline hook'lar reddedildiğinde modül başına dlopen()/dlsym() yamanmasına olanak tanır.
  • Java hook'lama, Android 14'te --enable-optimizations ile derlenmiş uygulamalar için kullanılan yeni ART hızlı giriş noktası için düzeltildi.

Örnek: RegisterNatives aracılığıyla kaydedilen tüm fonksiyonları listelemek ve çalışma zamanında adreslerini dökmek:

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, frida-server 16.2 veya daha yenisini kullandığınız sürece, PAC/BTI destekli cihazlarda (Pixel 8/Android 14+) kutudan çıktığı gibi çalışacaktır daha önceki sürümler, satır içi kancalar için padding bulmakta başarısız oldu. citeturn5search2turn5search0


APK'lerde avlanmaya değer son güvenlik açıkları

Yıl CVE Etkilenen kütüphane Notlar
2023 CVE-2023-4863 libwebp ≤ 1.3.1 WebP görüntülerini çözen yerel koddan erişilebilen yığın tampon taşması. Birçok Android uygulaması, savunmasız sürümleri paketler. Bir APK içinde libwebp.so gördüğünüzde, sürümünü kontrol edin ve istismar veya yamanma girişiminde bulunun.
2024 Birden Fazla OpenSSL 3.x serisi Birçok bellek güvenliği ve padding-oracle sorunu. Birçok Flutter & ReactNative paketi kendi libcrypto.so dosyalarını taşır.

Bir APK içinde üçüncü taraf .so dosyaları gördüğünüzde, her zaman hash'lerini yukarı akış tavsiyeleriyle karşılaştırın. SCA (Yazılım Bileşimi Analizi) mobilde yaygın değildir, bu nedenle eski savunmasız yapılar yaygındır.


Anti-Tersten Çevirme & Sertleştirme trendleri (Android 13-15)

  • Pointer Authentication (PAC) & Branch Target Identification (BTI): Android 14, desteklenen ARMv8.3+ silikon üzerinde sistem kütüphanelerinde PAC/BTI'yi etkinleştirir. Decompile araçları artık PAC ile ilgili sahte talimatları gösterir; dinamik analiz için Frida, PAC'ı kaldırdıktan sonra trampolin enjekte eder, ancak özel trampolinleriniz gerektiğinde pacda/autibsp çağırmalıdır.
  • MTE & Scudo sertleştirilmiş ayırıcı: bellek etiketleme isteğe bağlıdır ancak birçok Play-Integrity farkındalığına sahip uygulama -fsanitize=memtag ile derlenir; etiket hatalarını yakalamak için setprop arm64.memtag.dump 1 ve adb shell am start ... kullanın.
  • LLVM Obfuscator (opak predikatlar, kontrol akışı düzleştirme): ticari paketleyiciler (örneğin, Bangcle, SecNeo) giderek yerel kodu korumakta, yalnızca Java değil; .rodata içinde sahte kontrol akışı ve şifreli dize blokları bekleyin.

Kaynaklar

Referanslar

  • Frida 16.x değişiklik günlüğü (Android hooking, tiny-function relocation) frida.re/news citeturn5search0
  • libwebp taşma CVE-2023-4863 için NVD tavsiyesi nvd.nist.gov citeturn2search0

{{#include ../../banners/hacktricks-training.md}}