Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati

This commit is contained in:
Translator 2025-07-10 21:34:39 +00:00
parent 3513d6eb34
commit 8f3713d042

View File

@ -1,44 +1,95 @@
# Omgekeerde Native Biblioteke
# Reversing Native Libraries
{{#include ../../banners/hacktricks-training.md}}
**Vir verdere inligting, kyk:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Android-apps kan native biblioteke gebruik, tipies geskryf in C of C++, vir prestasiekritieke take. Malware-skeppers gebruik ook hierdie biblioteke, aangesien dit moeiliker is om om te keer as DEX bytecode. Die afdeling beklemtoon omgekeerde ingenieursvaardighede wat op Android toegespits is, eerder as om assembler tale te leer. ARM en x86 weergawes van biblioteke word verskaf vir kompatibiliteit.
Android-toepassings kan inheemse biblioteke gebruik, wat tipies in C of C++ geskryf is, vir prestasiekritieke take. Malware-skeppers misbruik ook hierdie biblioteke omdat ELF gedeelde voorwerpe steeds moeiliker is om te dekompileer as DEX/OAT byte-kode. Hierdie bladsy fokus op *praktiese* werksvloeie en *onlangse* hulpmiddelverbeterings (2023-2025) wat die omkering van Android `.so` lêers makliker maak.
### Sleutelpunte:
---
- **Native Biblioteke in Android Apps:**
- Gebruik vir prestasiewe intensive take.
- Geskryf in C of C++, wat omgekeerde ingenieurswerk uitdagend maak.
- Gevind in `.so` (gedeelde objek) formaat, soortgelyk aan Linux binêre.
- Malware-skeppers verkies native kode om analise moeiliker te maak.
- **Java Native Interface (JNI) & Android NDK:**
- JNI laat Java-metodes toe om in native kode geïmplementeer te word.
- NDK is 'n Android-spesifieke stel gereedskap om native kode te skryf.
- JNI en NDK verbind Java (of Kotlin) kode met native biblioteke.
- **Biblioteek Laai en Uitvoering:**
- Biblioteke word in geheue gelaai met `System.loadLibrary` of `System.load`.
- JNI_OnLoad word uitgevoer tydens biblioteeklaai.
- Java-verklaarde native metodes skakel na native funksies, wat uitvoering moontlik maak.
- **Koppeling van Java Metodes aan Native Funksies:**
- **Dinamiese Koppeling:** Funksienaam in native biblioteke pas by 'n spesifieke patroon, wat outomatiese koppeling moontlik maak.
- **Statische Koppeling:** Gebruik `RegisterNatives` vir koppeling, wat buigsaamheid in funksienaam en struktuur bied.
- **Omgekeerde Ingenieursgereedskap en Tegnieke:**
- Gereedskap soos Ghidra en IDA Pro help om native biblioteke te analiseer.
- `JNIEnv` is noodsaaklik om JNI-funksies en interaksies te verstaan.
- Oefeninge word verskaf om te oefen met die laai van biblioteke, die koppeling van metodes, en die identifisering van native funksies.
### Vinnige triage-werksvloei vir 'n vars getrokke `libfoo.so`
### Hulpbronne:
1. **Onthaal die biblioteek**
```bash
# Van 'n geïnstalleerde toepassing
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Of van die APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
```
2. **Identifiseer argitektuur & beskermings**
```bash
file libfoo.so # arm64 of arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, ens.
checksec --file libfoo.so # (peda/pwntools)
```
3. **Lys geëksporteerde simbole & JNI bindings**
```bash
readelf -s libfoo.so | grep ' Java_' # dinamies-gekoppelde JNI
strings libfoo.so | grep -i "RegisterNatives" -n # staties-geregistreerde JNI
```
4. **Laai in 'n dekompiler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper of Cutter/Rizin) en voer outomatiese analise uit. Nuwe Ghidra weergawes het 'n AArch64 dekompiler bekendgestel wat PAC/BTI stubs en MTE-tags herken, wat die analise van biblioteke wat met die Android 14 NDK gebou is, aansienlik verbeter.
5. **Bepaal op statiese vs dinamiese omkering:** gestript, obfuskeer kode benodig dikwels *instrumentasie* (Frida, ptrace/gdbserver, LLDB).
- **Leer ARM Assembly:**
- Aangerade vir 'n dieper begrip van die onderliggende argitektuur.
- [ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/) van Azeria Labs word aanbeveel.
- **JNI & NDK Dokumentasie:**
- [Oracle se JNI Spesifikasie](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
- [Android se JNI Wenke](https://developer.android.com/training/articles/perf-jni)
- [Begin met die NDK](https://developer.android.com/ndk/guides/)
- **Foutopsporing van Native Biblioteke:**
- [Foutopsporing van Android Native Biblioteke met JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
---
### Dinamiese Instrumentasie (Frida ≥ 16)
Frida se 16-reeks het verskeie Android-spesifieke verbeterings gebring wat help wanneer die teiken moderne Clang/LLD optimaliseringe gebruik:
* `thumb-relocator` kan nou *klein ARM/Thumb funksies* wat deur LLD se aggressiewe uitlijning (`--icf=all`) gegenereer is, *hook*.
* Die opnoem en herbinding van *ELF invoer slots* werk op Android, wat per-module `dlopen()`/`dlsym()` patching moontlik maak wanneer inline hooks verwerp word.
* Java hooking is reggestel vir die nuwe **ART vinnige toegangspunt** wat gebruik word wanneer toepassings gecompileer word met `--enable-optimizations` op Android 14.
Voorbeeld: opnoem van alle funksies wat deur `RegisterNatives` geregistreer is en hul adresse tydens uitvoering dump:
```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 sal uit die boks werk op PAC/BTI-geaktiveerde toestelle (Pixel 8/Android 14+) solank jy frida-server 16.2 of later gebruik vroeëre weergawes het gefaal om padding vir inline hooks te vind. citeturn5search2turn5search0
---
### Onlangse kwesbaarhede wat die moeite werd is om in APK's te jag
| Jaar | CVE | Aangetaste biblioteek | Aantekeninge |
|------|-----|------------------|-------|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow bereikbaar vanaf native kode wat WebP-prente decodeer. Verskeie Android-apps bundel kwesbare weergawes. Wanneer jy 'n `libwebp.so` binne 'n APK sien, kontroleer sy weergawe en probeer om te exploiteer of te patch.| citeturn2search0|
|2024|Meervoudig|OpenSSL 3.x reeks|Verskeie geheue-veilige en padding-orakel probleme. Baie Flutter & ReactNative bundels verskaf hul eie `libcrypto.so`.|
Wanneer jy *derdeparty* `.so` lêers binne 'n APK opmerk, kontroleer altyd hul hash teen opwaartse advies. SCA (Software Composition Analysis) is ongewoon op mobiele toestelle, so verouderde kwesbare boue is volop.
---
### Anti-Reversing & Hardening neigings (Android 13-15)
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 stel PAC/BTI in stelselbiblioteke op ondersteunde ARMv8.3+ silikoon in. Decompilers vertoon nou PAC-verwante pseudo-instruksies; vir dinamiese analise injecteer Frida trampolines *nadat* PAC verwyder is, maar jou eie trampolines moet `pacda`/`autibsp` aanroep waar nodig.
* **MTE & Scudo geharde allokator:** geheue-tagging is opt-in maar baie Play-Integrity bewuste apps bou met `-fsanitize=memtag`; gebruik `setprop arm64.memtag.dump 1` plus `adb shell am start ...` om tag foute te vang.
* **LLVM Obfuscator (opake predikate, kontrole-stroom afvlakking):** kommersiële packers (bv. Bangcle, SecNeo) beskerm toenemend *native* kode, nie net Java nie; verwag valse kontrole-stroom en versleutelde string blobs in `.rodata`.
---
### Hulpbronne
- **Leer ARM Assembly:** [Azeria Labs ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
- **JNI & NDK Dokumentasie:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Wenke](https://developer.android.com/training/articles/perf-jni) · [NDK Gidse](https://developer.android.com/ndk/guides/)
- **Debugging Native Libraries:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
### Verwysings
- Frida 16.x verandering-log (Android hooking, tiny-function herlokasie) [frida.re/news](https://frida.re/news/) citeturn5search0
- NVD advies vir `libwebp` overflow CVE-2023-4863 [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
{{#include ../../banners/hacktricks-training.md}}