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

96 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Reversing Native Libraries
{{#include ../../banners/hacktricks-training.md}}
**Za više informacija pogledajte:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Android aplikacije mogu koristiti native biblioteke, obično napisane u C ili C++, za zadatke koji zahtevaju visoke performanse. Kreatori malvera takođe zloupotrebljavaju ove biblioteke jer su ELF deljeni objekti i dalje teži za dekompilaciju od DEX/OAT bajtkoda. Ova stranica se fokusira na *praktične* radne tokove i *nedavne* poboljšanja alata (2023-2025) koja olakšavaju obrnuto inženjerstvo Android `.so` fajlova.
---
### Brza procena za svež `libfoo.so`
1. **Izvucite biblioteku**
```bash
# Iz instalirane aplikacije
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Ili iz APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
```
2. **Identifikujte arhitekturu i zaštite**
```bash
file libfoo.so # arm64 ili arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, itd.
checksec --file libfoo.so # (peda/pwntools)
```
3. **Nabrojite eksportovane simbole i JNI veze**
```bash
readelf -s libfoo.so | grep ' Java_' # dinamički povezani JNI
strings libfoo.so | grep -i "RegisterNatives" -n # statički registrovani JNI
```
4. **Učitajte u dekompajler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper ili Cutter/Rizin) i pokrenite automatsku analizu. Novije verzije Ghidre su uvele AArch64 dekompajler koji prepoznaje PAC/BTI stubove i MTE oznake, što značajno poboljšava analizu biblioteka napravljenih sa Android 14 NDK.
5. **Odlučite o statičkom naspram dinamičkom obrnuto inženjerstvu:** skraćeni, obfuskovani kod često zahteva *instrumentaciju* (Frida, ptrace/gdbserver, LLDB).
---
### Dinamička Instrumentacija (Frida ≥ 16)
Frida 16-serija je donela nekoliko poboljšanja specifičnih za Android koja pomažu kada cilj koristi moderne Clang/LLD optimizacije:
* `thumb-relocator` sada može *hook-ovati male ARM/Thumb funkcije* generisane LLD-ovim agresivnim poravnanjem (`--icf=all`).
* Nabrajanje i ponovno povezivanje *ELF import slotova* funkcioniše na Androidu, omogućavajući po-modulno `dlopen()`/`dlsym()` patch-ovanje kada su inline hook-ovi odbijeni.
* Java hooking je ispravljen za novi **ART quick-entrypoint** koji se koristi kada su aplikacije kompajlirane sa `--enable-optimizations` na Android 14.
Primer: nabrajanje svih funkcija registrovanih putem `RegisterNatives` i ispis njihovih adresa u vreme izvođenja:
```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 će raditi odmah na PAC/BTI omogućеним uređajima (Pixel 8/Android 14+) sve dok koristite frida-server 16.2 ili noviji ranije verzije nisu uspele da lociraju padding za inline hooks. citeturn5search2turn5search0
---
### Nedavne ranjivosti koje vredi istražiti u APK-ima
| Godina | CVE | Pogođena biblioteka | Napomene |
|--------|-----|---------------------|----------|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Prelivanje bafera na heap-u dostupno iz nativnog koda koji dekodira WebP slike. Nekoliko Android aplikacija sadrži ranjive verzije. Kada vidite `libwebp.so` unutar APK-a, proverite njegovu verziju i pokušajte sa eksploatacijom ili zakrpanjem.| citeturn2search0|
|2024|Više|OpenSSL 3.x serija|Nekoliko problema sa bezbednošću memorije i padding-oracle. Mnogi Flutter i ReactNative paketi isporučuju svoj `libcrypto.so`.|
Kada primetite *treće strane* `.so` datoteke unutar APK-a, uvek proverite njihov hash protiv uzvodnih obaveštenja. SCA (Analiza softverskog sastava) je retka na mobilnim uređajima, pa su zastarele ranjive verzije rasprostranjene.
---
### Anti-reversing & Hardening trendovi (Android 13-15)
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 omogućava PAC/BTI u sistemskim bibliotekama na podržanom ARMv8.3+ silikonu. Decompilatori sada prikazuju PACpovezane pseudo-instrukcije; za dinamičku analizu Frida ubrizgava trampoline *nakon* uklanjanja PAC-a, ali vaše prilagođene trampoline treba da pozivaju `pacda`/`autibsp` gde je to potrebno.
* **MTE & Scudo ojačani alokator:** označavanje memorije je opcionalno, ali mnoge aplikacije svesne Play-Integrity se grade sa `-fsanitize=memtag`; koristite `setprop arm64.memtag.dump 1` plus `adb shell am start ...` da zabeležite greške u oznakama.
* **LLVM Obfuscator (neprozirni predikati, izravnavanje toka kontrole):** komercijalni pakeri (npr., Bangcle, SecNeo) sve više štite *nativni* kod, ne samo Java; očekujte lažne tokove kontrole i enkriptovane string blobove u `.rodata`.
---
### Resursi
- **Učenje ARM Assemblera:** [Azeria Labs Osnovi ARM Assemblera](https://azeria-labs.com/writing-arm-assembly-part-1/)
- **JNI & NDK Dokumentacija:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Saveti](https://developer.android.com/training/articles/perf-jni) · [NDK Vodiči](https://developer.android.com/ndk/guides/)
- **Debagovanje Nativnih Biblioteka:** [Debagovanje Android Nativnih Biblioteka koristeći JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
### Reference
- Frida 16.x promena (Android hooking, relokacija malih funkcija) [frida.re/news](https://frida.re/news/) citeturn5search0
- NVD obaveštenje za `libwebp` prelivanje CVE-2023-4863 [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
{{#include ../../banners/hacktricks-training.md}}