Reversing Native Libraries

Reading time: 5 minutes

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Aby uzyskać więcej informacji, sprawdź: https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html

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.


Szybki przepływ pracy triage dla świeżo pobranego libfoo.so

  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/
  1. 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)
  1. 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
  1. 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.
  2. Zdecyduj o dekompilacji statycznej vs dynamicznej: zestrzelony, złośliwy kod często wymaga instrumentacji (Frida, ptrace/gdbserver, LLDB).

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. citeturn5search2turn5search0


Ostatnie luki, na które warto polować w APK

RokCVEDotknięta bibliotekaUwagi
2023CVE-2023-4863libwebp ≤ 1.3.1Przepeł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.
2024WieleSeria OpenSSL 3.xWiele 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

Odnośniki

  • Dziennik zmian Frida 16.x (hooking Androida, relokacja małych funkcji) – frida.re/news citeturn5search0
  • Zawiadomienie NVD dotyczące przepełnienia libwebp CVE-2023-4863 – nvd.nist.gov citeturn2search0

tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks