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
8f8f11a77b
commit
e37958fa47
@ -4,41 +4,92 @@
|
||||
|
||||
**Aby uzyskać więcej informacji, sprawdź:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||
|
||||
Aplikacje na Androida mogą korzystać z bibliotek natywnych, zazwyczaj napisanych w C lub C++, do zadań wymagających dużej wydajności. Twórcy złośliwego oprogramowania również używają tych bibliotek, ponieważ są trudniejsze do inżynierii wstecznej niż kod bajtowy DEX. Sekcja ta podkreśla umiejętności inżynierii wstecznej dostosowane do Androida, zamiast uczyć języków asemblera. Wersje bibliotek dla ARM i x86 są dostarczane dla zapewnienia kompatybilności.
|
||||
Aplikacje Android mogą korzystać z bibliotek natywnych, zazwyczaj napisanych w C lub C++, do zadań krytycznych dla wydajności. Twórcy złośliwego oprogramowania również nadużywają tych bibliotek, ponieważ obiekty ELF są nadal trudniejsze do dekompilacji niż kod bajtowy DEX/OAT. Ta strona koncentruje się na *praktycznych* przepływach pracy i *najnowszych* ulepszeniach narzędzi (2023-2025), które ułatwiają dekompilację plików `.so` Androida.
|
||||
|
||||
### Kluczowe punkty:
|
||||
---
|
||||
|
||||
- **Biblioteki natywne w aplikacjach na Androida:**
|
||||
- Używane do zadań wymagających dużej wydajności.
|
||||
- Napisane w C lub C++, co utrudnia inżynierię wsteczną.
|
||||
- Znajdują się w formacie `.so` (obiekt współdzielony), podobnym do binarnych plików Linuxa.
|
||||
- Twórcy złośliwego oprogramowania preferują kod natywny, aby utrudnić analizę.
|
||||
- **Java Native Interface (JNI) i Android NDK:**
|
||||
- JNI pozwala na implementację metod Java w kodzie natywnym.
|
||||
- NDK to zestaw narzędzi specyficznych dla Androida do pisania kodu natywnego.
|
||||
- JNI i NDK łączą kod Java (lub Kotlin) z bibliotekami natywnymi.
|
||||
- **Ładowanie i wykonywanie bibliotek:**
|
||||
- Biblioteki są ładowane do pamięci za pomocą `System.loadLibrary` lub `System.load`.
|
||||
- JNI_OnLoad jest wykonywane po załadowaniu biblioteki.
|
||||
- Metody natywne zadeklarowane w Javie łączą się z funkcjami natywnymi, umożliwiając wykonanie.
|
||||
- **Łączenie metod Java z funkcjami natywnymi:**
|
||||
- **Linkowanie dynamiczne:** Nazwy funkcji w bibliotekach natywnych odpowiadają określonemu wzorcowi, co umożliwia automatyczne linkowanie.
|
||||
- **Linkowanie statyczne:** Używa `RegisterNatives` do linkowania, co zapewnia elastyczność w nazewnictwie funkcji i strukturze.
|
||||
- **Narzędzia i techniki inżynierii wstecznej:**
|
||||
- Narzędzia takie jak Ghidra i IDA Pro pomagają w analizie bibliotek natywnych.
|
||||
- `JNIEnv` jest kluczowe dla zrozumienia funkcji i interakcji JNI.
|
||||
- Zapewnione są ćwiczenia do praktyki ładowania bibliotek, łączenia metod i identyfikowania funkcji natywnych.
|
||||
### Szybki przepływ pracy triage dla świeżo pobranego `libfoo.so`
|
||||
|
||||
### Zasoby:
|
||||
1. **Wyodrębnij bibliotekę**
|
||||
```bash
|
||||
# Z zainstalowanej aplikacji
|
||||
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
|
||||
# Lub z APK (zip)
|
||||
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
|
||||
```
|
||||
2. **Zidentyfikuj architekturę i zabezpieczenia**
|
||||
```bash
|
||||
file libfoo.so # arm64 lub arm32 / x86
|
||||
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, itd.
|
||||
checksec --file libfoo.so # (peda/pwntools)
|
||||
```
|
||||
3. **Wypisz eksportowane symbole i powiązania JNI**
|
||||
```bash
|
||||
readelf -s libfoo.so | grep ' Java_' # dynamicznie powiązane JNI
|
||||
strings libfoo.so | grep -i "RegisterNatives" -n # statycznie zarejestrowane JNI
|
||||
```
|
||||
4. **Załaduj do dekompilatora** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper lub Cutter/Rizin) i uruchom auto-analizę. Nowsze wersje Ghidra wprowadziły dekompilator AArch64, który rozpoznaje stuby PAC/BTI i tagi MTE, znacznie poprawiając analizę bibliotek zbudowanych z użyciem Android 14 NDK.
|
||||
5. **Zdecyduj o dekompilacji statycznej vs dynamicznej:** zestrzelony, złośliwy kod często wymaga *instrumentacji* (Frida, ptrace/gdbserver, LLDB).
|
||||
|
||||
- **Nauka asemblera ARM:**
|
||||
- Sugerowane dla głębszego zrozumienia podstawowej architektury.
|
||||
- [Podstawy asemblera ARM](https://azeria-labs.com/writing-arm-assembly-part-1/) z Azeria Labs jest zalecane.
|
||||
- **Dokumentacja JNI i NDK:**
|
||||
- [Specyfikacja JNI Oracle](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
|
||||
- [Wskazówki JNI Androida](https://developer.android.com/training/articles/perf-jni)
|
||||
- [Rozpoczęcie pracy z NDK](https://developer.android.com/ndk/guides/)
|
||||
- **Debugowanie bibliotek natywnych:**
|
||||
- [Debugowanie bibliotek natywnych Androida za pomocą dekompilatora JEB](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||
---
|
||||
|
||||
### Dynamiczna Instrumentacja (Frida ≥ 16)
|
||||
|
||||
Seria 16 Frida wprowadziła kilka ulepszeń specyficznych dla Androida, które pomagają, gdy cel korzysta z nowoczesnych optymalizacji Clang/LLD:
|
||||
|
||||
* `thumb-relocator` może teraz *hookować małe funkcje ARM/Thumb* generowane przez agresywne wyrównanie LLD (`--icf=all`).
|
||||
* Enumerowanie i ponowne wiązanie *slotów importu ELF* działa na Androidzie, umożliwiając patchowanie `dlopen()`/`dlsym()` na poziomie modułu, gdy inline hooks są odrzucane.
|
||||
* Naprawiono hookowanie Java dla nowego **szybkiego punktu wejścia ART**, używanego, gdy aplikacje są kompilowane z `--enable-optimizations` na Androidzie 14.
|
||||
|
||||
Przykład: enumerowanie wszystkich funkcji zarejestrowanych przez `RegisterNatives` i zrzucanie ich adresów w czasie rzeczywistym:
|
||||
```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 będzie działać od razu na urządzeniach z włączonym PAC/BTI (Pixel 8/Android 14+), pod warunkiem użycia frida-server 16.2 lub nowszego – wcześniejsze wersje nie mogły zlokalizować paddingu dla inline hooks. citeturn5search2turn5search0
|
||||
|
||||
---
|
||||
|
||||
### Ostatnie luki, na które warto polować w APK
|
||||
|
||||
| Rok | CVE | Dotknięta biblioteka | Uwagi |
|
||||
|------|-----|------------------|-------|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Przepełnienie bufora na stercie dostępne z kodu natywnego, który dekoduje obrazy WebP. Wiele aplikacji na Androida bundluje podatne wersje. Gdy zobaczysz `libwebp.so` w APK, sprawdź jego wersję i spróbuj eksploatacji lub łatania.| citeturn2search0|
|
||||
|2024|Wiele|Seria OpenSSL 3.x|Wiele problemów z bezpieczeństwem pamięci i padding-oracle. Wiele pakietów Flutter i ReactNative dostarcza własne `libcrypto.so`.|
|
||||
|
||||
Gdy zauważysz *pliki*.so zewnętrznych dostawców w APK, zawsze sprawdź ich hash w odniesieniu do upstream advisories. SCA (Analiza Składu Oprogramowania) jest rzadkością na urządzeniach mobilnych, więc przestarzałe podatne wersje są powszechne.
|
||||
|
||||
---
|
||||
|
||||
### Trendy w zakresie anty-reversingu i hardeningu (Android 13-15)
|
||||
|
||||
* **Autoryzacja wskaźników (PAC) i identyfikacja celu gałęzi (BTI):** Android 14 włącza PAC/BTI w bibliotekach systemowych na wspieranym krzemie ARMv8.3+. Dekompilatory teraz wyświetlają pseudo-instrukcje związane z PAC; do analizy dynamicznej Frida wstrzykuje trampoliny *po* usunięciu PAC, ale twoje własne trampoliny powinny wywoływać `pacda`/`autibsp`, gdy to konieczne.
|
||||
* **MTE i Scudo wzmocniony alokator:** tagowanie pamięci jest opcjonalne, ale wiele aplikacji świadomych Play-Integrity buduje z `-fsanitize=memtag`; użyj `setprop arm64.memtag.dump 1` oraz `adb shell am start ...`, aby uchwycić błędy tagów.
|
||||
* **Obfuscator LLVM (nieprzezroczyste predykaty, spłaszczanie przepływu kontroli):** komercyjne pakery (np. Bangcle, SecNeo) coraz częściej chronią *natywne* kody, a nie tylko Java; spodziewaj się fałszywego przepływu kontroli i zaszyfrowanych blobów ciągów w `.rodata`.
|
||||
|
||||
---
|
||||
|
||||
### Zasoby
|
||||
|
||||
- **Nauka asemblera ARM:** [Azeria Labs – Podstawy asemblera ARM](https://azeria-labs.com/writing-arm-assembly-part-1/)
|
||||
- **Dokumentacja JNI i NDK:** [Specyfikacja JNI Oracle](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Porady dotyczące JNI Androida](https://developer.android.com/training/articles/perf-jni) · [Przewodniki NDK](https://developer.android.com/ndk/guides/)
|
||||
- **Debugowanie bibliotek natywnych:** [Debugowanie bibliotek natywnych Androida za pomocą dekompilatora JEB](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||
|
||||
### Odnośniki
|
||||
|
||||
- Dziennik zmian Frida 16.x (hooking Androida, relokacja małych funkcji) – [frida.re/news](https://frida.re/news/) citeturn5search0
|
||||
- Zawiadomienie NVD dotyczące przepełnienia `libwebp` CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user