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
220d3877ff
commit
7d47fcc56d
@ -4,41 +4,92 @@
|
|||||||
|
|
||||||
**Za više informacija pogledajte:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
**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 nativne biblioteke, obično napisane u C ili C++, za zadatke koji zahtevaju visoke performanse. Kreatori malvera takođe koriste ove biblioteke, jer su teže za obrnuto inženjerstvo od DEX bajtkoda. Odeljak naglašava veštine obrnute inženjeringa prilagođene Androidu, umesto da uči jezike asemblera. ARM i x86 verzije biblioteka su obezbeđene za kompatibilnost.
|
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.
|
||||||
|
|
||||||
### Ključne tačke:
|
---
|
||||||
|
|
||||||
- **Nativne biblioteke u Android aplikacijama:**
|
### Brza procena za svež `libfoo.so`
|
||||||
- Koriste se za zadatke koji zahtevaju visoke performanse.
|
|
||||||
- Napisane u C ili C++, što otežava obrnuto inženjerstvo.
|
|
||||||
- Pronađene u `.so` (deljeni objekat) formatu, slično Linux binarnim datotekama.
|
|
||||||
- Kreatori malvera preferiraju nativni kod kako bi otežali analizu.
|
|
||||||
- **Java Native Interface (JNI) & Android NDK:**
|
|
||||||
- JNI omogućava implementaciju Java metoda u nativnom kodu.
|
|
||||||
- NDK je set alata specifičnih za Android za pisanje nativnog koda.
|
|
||||||
- JNI i NDK povezuju Java (ili Kotlin) kod sa nativnim bibliotekama.
|
|
||||||
- **Učitavanje i izvršavanje biblioteka:**
|
|
||||||
- Biblioteke se učitavaju u memoriju koristeći `System.loadLibrary` ili `System.load`.
|
|
||||||
- JNI_OnLoad se izvršava prilikom učitavanja biblioteke.
|
|
||||||
- Java-deklarisane nativne metode povezuju se sa nativnim funkcijama, omogućavajući izvršavanje.
|
|
||||||
- **Povezivanje Java metoda sa nativnim funkcijama:**
|
|
||||||
- **Dinamičko povezivanje:** Imena funkcija u nativnim bibliotekama odgovaraju specifičnom obrascu, omogućavajući automatsko povezivanje.
|
|
||||||
- **Statčko povezivanje:** Koristi `RegisterNatives` za povezivanje, pružajući fleksibilnost u imenovanju i strukturi funkcija.
|
|
||||||
- **Alati i tehnike obrnute inženjeringa:**
|
|
||||||
- Alati poput Ghidra i IDA Pro pomažu u analizi nativnih biblioteka.
|
|
||||||
- `JNIEnv` je ključan za razumevanje JNI funkcija i interakcija.
|
|
||||||
- Pružene su vežbe za vežbanje učitavanja biblioteka, povezivanja metoda i identifikacije nativnih funkcija.
|
|
||||||
|
|
||||||
### Resursi:
|
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).
|
||||||
|
|
||||||
- **Učenje ARM asemblera:**
|
---
|
||||||
- Preporučuje se za dublje razumevanje osnovne arhitekture.
|
|
||||||
- [Osnovi ARM asemblera](https://azeria-labs.com/writing-arm-assembly-part-1/) iz Azeria Labs se preporučuje.
|
### Dinamička Instrumentacija (Frida ≥ 16)
|
||||||
- **JNI & NDK dokumentacija:**
|
|
||||||
- [Oracle-ova JNI specifikacija](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
|
Frida 16-serija je donela nekoliko poboljšanja specifičnih za Android koja pomažu kada cilj koristi moderne Clang/LLD optimizacije:
|
||||||
- [Android-ovi JNI saveti](https://developer.android.com/training/articles/perf-jni)
|
|
||||||
- [Početak sa NDK](https://developer.android.com/ndk/guides/)
|
* `thumb-relocator` sada može *hook-ovati male ARM/Thumb funkcije* generisane LLD-ovim agresivnim poravnanjem (`--icf=all`).
|
||||||
- **Debagovanje nativnih biblioteka:**
|
* 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.
|
||||||
- [Debagovanje Android nativnih biblioteka koristeći JEB dekompajler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
* 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. citeturn5search2turn5search0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 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.| citeturn2search0|
|
||||||
|
|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 PAC‐povezane 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/) citeturn5search0
|
||||||
|
- NVD obaveštenje za `libwebp` prelivanje CVE-2023-4863 – [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