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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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
- Wyodrębnij bibliotekę
# 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/
- Zidentyfikuj architekturę i zabezpieczenia
file libfoo.so # arm64 lub arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, itd.
checksec --file libfoo.so # (peda/pwntools)
- Wypisz eksportowane symbole i powiązania JNI
readelf -s libfoo.so | grep ' Java_' # dynamicznie powiązane JNI
strings libfoo.so | grep -i "RegisterNatives" -n # statycznie zarejestrowane JNI
- 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.
- 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:
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. |
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żyjsetprop arm64.memtag.dump 1
orazadb 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
- Dokumentacja JNI i NDK: Specyfikacja JNI Oracle · Porady dotyczące JNI Androida · Przewodniki NDK
- Debugowanie bibliotek natywnych: Debugowanie bibliotek natywnych Androida za pomocą dekompilatora JEB
Odnośniki
- Dziennik zmian Frida 16.x (hooking Androida, relokacja małych funkcji) – frida.re/news citeturn5search0
- Zawiadomienie NVD dotyczące przepełnienia
libwebp
CVE-2023-4863 – nvd.nist.gov citeturn2search0
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.