mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati
This commit is contained in:
parent
4e2b57095c
commit
d4018665a2
@ -4,41 +4,92 @@
|
|||||||
|
|
||||||
**Daha fazla bilgi için kontrol edin:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
**Daha fazla bilgi için kontrol edin:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](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 kullanır, çünkü bunları tersine mühendislik yapmak DEX bytecode'dan daha zordur. Bu bölüm, montaj dillerini öğretmek yerine Android'e özel tersine mühendislik becerilerini vurgular. Uyum sağlamak için ARM ve x86 sürümleri sağlanmaktadır.
|
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.
|
||||||
|
|
||||||
### Ana Noktalar:
|
---
|
||||||
|
|
||||||
- **Android Uygulamalarında Yerel Kütüphaneler:**
|
### Yeni çekilmiş `libfoo.so` için Hızlı Triage İş Akışı
|
||||||
- Performans yoğun görevler için kullanılır.
|
|
||||||
- Tersine mühendislik yapmayı zorlaştıran C veya C++ ile yazılmıştır.
|
|
||||||
- Linux ikili dosyalarına benzer şekilde `.so` (paylaşılan nesne) formatında bulunur.
|
|
||||||
- Kötü amaçlı yazılım yaratıcıları, analizi zorlaştırmak için yerel kodu tercih eder.
|
|
||||||
- **Java Yerel Arayüzü (JNI) ve Android NDK:**
|
|
||||||
- JNI, Java yöntemlerinin yerel kodda uygulanmasına olanak tanır.
|
|
||||||
- NDK, yerel kod yazmak için Android'e özgü bir araç setidir.
|
|
||||||
- JNI ve NDK, Java (veya Kotlin) kodunu yerel kütüphanelerle birleştirir.
|
|
||||||
- **Kütüphane Yükleme ve Çalıştırma:**
|
|
||||||
- Kütüphaneler, `System.loadLibrary` veya `System.load` kullanılarak belleğe yüklenir.
|
|
||||||
- Kütüphane yüklenirken JNI_OnLoad çalıştırılır.
|
|
||||||
- Java'da tanımlanan yerel yöntemler, yerel işlevlerle bağlantı kurarak çalıştırılmasını sağlar.
|
|
||||||
- **Java Yöntemlerini Yerel İşlevlere Bağlama:**
|
|
||||||
- **Dinamik Bağlama:** Yerel kütüphanelerdeki işlev adları belirli bir desene uyar, otomatik bağlamaya olanak tanır.
|
|
||||||
- **Statik Bağlama:** Bağlama için `RegisterNatives` kullanır, işlev adlandırma ve yapısında esneklik sağlar.
|
|
||||||
- **Tersine Mühendislik Araçları ve Teknikleri:**
|
|
||||||
- Ghidra ve IDA Pro gibi araçlar, yerel kütüphaneleri analiz etmeye yardımcı olur.
|
|
||||||
- `JNIEnv`, JNI işlevlerini ve etkileşimlerini anlamak için kritik öneme sahiptir.
|
|
||||||
- Kütüphaneleri yükleme, yöntemleri bağlama ve yerel işlevleri tanımlama pratiği yapmak için alıştırmalar sağlanmaktadır.
|
|
||||||
|
|
||||||
### Kaynaklar:
|
1. **Kütüphaneyi çıkarın**
|
||||||
|
```bash
|
||||||
|
# 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/
|
||||||
|
```
|
||||||
|
2. **Mimari ve korumaları tanımlayın**
|
||||||
|
```bash
|
||||||
|
file libfoo.so # arm64 veya arm32 / x86
|
||||||
|
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, vb.
|
||||||
|
checksec --file libfoo.so # (peda/pwntools)
|
||||||
|
```
|
||||||
|
3. **Dışa aktarılan sembolleri ve JNI bağlamalarını listeleyin**
|
||||||
|
```bash
|
||||||
|
readelf -s libfoo.so | grep ' Java_' # dinamik bağlantılı JNI
|
||||||
|
strings libfoo.so | grep -i "RegisterNatives" -n # statik kayıtlı JNI
|
||||||
|
```
|
||||||
|
4. **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ı.
|
||||||
|
5. **Statik ve dinamik tersine mühendislik arasında karar verin:** soyulmuş, obfuscate edilmiş kod genellikle *enstrümantasyon* (Frida, ptrace/gdbserver, LLDB) gerektirir.
|
||||||
|
|
||||||
- **ARM Montaj Dili Öğrenimi:**
|
---
|
||||||
- Temel mimariyi daha iyi anlamak için önerilir.
|
|
||||||
- Azeria Labs'tan [ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/) önerilmektedir.
|
### Dinamik Enstrümantasyon (Frida ≥ 16)
|
||||||
- **JNI ve NDK Belgeleri:**
|
|
||||||
- [Oracle'ın JNI Spesifikasyonu](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
|
Frida’nın 16 serisi, hedef modern Clang/LLD optimizasyonları kullandığında yardımcı olan birkaç Android'e özgü iyileştirme getirdi:
|
||||||
- [Android'in JNI İpuçları](https://developer.android.com/training/articles/perf-jni)
|
|
||||||
- [NDK ile Başlarken](https://developer.android.com/ndk/guides/)
|
* `thumb-relocator` artık LLD’nin agresif hizalaması (`--icf=all`) tarafından üretilen *küçük ARM/Thumb fonksiyonlarını* *hook* yapabilir.
|
||||||
- **Yerel Kütüphaneleri Hata Ayıklama:**
|
* *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.
|
||||||
- [JEB Decompiler Kullanarak Android Yerel Kütüphanelerini Hata Ayıklama](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
* 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:
|
||||||
|
```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, 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. citeturn5search2turn5search0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 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.| citeturn2search0|
|
||||||
|
|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
|
||||||
|
|
||||||
|
- **ARM Assembly Öğrenme:** [Azeria Labs – ARM Assembly Temelleri](https://azeria-labs.com/writing-arm-assembly-part-1/)
|
||||||
|
- **JNI & NDK Dokümantasyonu:** [Oracle JNI Spesifikasyonu](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI İpuçları](https://developer.android.com/training/articles/perf-jni) · [NDK Kılavuzları](https://developer.android.com/ndk/guides/)
|
||||||
|
- **Yerel Kütüphaneleri Hata Ayıklama:** [JEB Decompiler Kullanarak Android Yerel Kütüphanelerini Hata Ayıklama](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||||
|
|
||||||
|
### Referanslar
|
||||||
|
|
||||||
|
- Frida 16.x değişiklik günlüğü (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/) citeturn5search0
|
||||||
|
- `libwebp` taşma CVE-2023-4863 için NVD tavsiyesi – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user