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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
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ışı
- Kütüphaneyi çıkarın
# 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/
- Mimari ve korumaları belirleyin
file libfoo.so # arm64 or arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
checksec --file libfoo.so # (peda/pwntools)
- Dışa aktarılan sembolleri ve JNI bağlarını listeleyin
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
- 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.
- 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:
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):
- 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)
- 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:
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
- 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çinsetprop arm64.memtag.dump 1
veadb 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
- JNI & NDK Documentation: Oracle JNI Spec · Android JNI Tips · NDK Guides
- Debugging Native Libraries: Debug Android Native Libraries Using JEB Decompiler
Referanslar
- Frida 16.x change-log (Android hooking, tiny-function relocation) – frida.re/news
- NVD advisory for
libwebp
overflow CVE-2023-4863 – nvd.nist.gov - SoTap: Lightweight in-app JNI (.so) behavior logger – github.com/RezaArbabBot/SoTap
- SoTap Releases – github.com/RezaArbabBot/SoTap/releases
- How to work with SoTap? – t.me/ForYouTillEnd/13
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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.