# Reverzno inženjerstvo nativnih biblioteka {{#include ../../banners/hacktricks-training.md}} **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 native biblioteke, obično napisane u C ili C++, za zadatke koji zahtevaju visok performans. Maliciozni autori takođe zloupotrebljavaju ove biblioteke jer su ELF shared object fajlovi i dalje teži za dekompajliranje od DEX/OAT bajt-koda. Ova stranica se fokusira na *praktične* tokove rada i *skorašnja* poboljšanja alata (2023–2025) koja olakšavaju reverzno inženjerstvo Android `.so` fajlova. --- ### Brzi workflow trijaže za upravo izvučeni `libfoo.so` 1. **Extract the library** ```bash # From an installed application adb shell "run-as cat lib/arm64-v8a/libfoo.so" > libfoo.so # Or from the APK (zip) unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/ ``` 2. **Identify architecture & protections** ```bash file libfoo.so # arm64 or arm32 / x86 readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc. checksec --file libfoo.so # (peda/pwntools) ``` 3. **List exported symbols & JNI bindings** ```bash readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI ``` 4. **Load in a decompiler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) and run auto-analysis. Novije verzije Ghidra-e su uvele AArch64 dekompajler koji prepoznaje PAC/BTI stubove i MTE tagove, značajno poboljšavajući analizu biblioteka izgrađenih sa Android 14 NDK-om. 5. **Decide on static vs dynamic reversing:** stripped, obfuscated code često zahteva *instrumentation* (Frida, ptrace/gdbserver, LLDB). --- ### Dinamička instrumentacija (Frida ≥ 16) Frida serija 16 donela je nekoliko Android-specifičnih poboljšanja koja pomažu kada meta koristi moderne Clang/LLD optimizacije: * `thumb-relocator` sada može *hook tiny ARM/Thumb functions* generisane agresivnim poravnanjem LLD-a (`--icf=all`). * Enumerisanje i ponovno vezivanje *ELF import slots* radi na Androidu, omogućavajući per-module `dlopen()`/`dlsym()` patching kada inline hooks budu odbijeni. * Java hooking je ispravljen za novi **ART quick-entrypoint** koji se koristi kada su aplikacije kompajlirane sa `--enable-optimizations` na Android 14. Primer: enumerisanje svih funkcija registrovanih putem `RegisterNatives` i dump njihovih adresa tokom izvršavanja: ```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 will work out of the box on PAC/BTI-enabled devices (Pixel 8/Android 14+) as long as you use frida-server 16.2 or later – earlier versions failed to locate padding for inline hooks. ### Process-local JNI telemetry via preloaded .so (SoTap) Kada je full-featured instrumentation previše ili je blokirana, i dalje možete dobiti vidljivost na nivou native tako što ćete preload-ovati mali logger unutar ciljnog procesa. SoTap je lagana Android native (.so) biblioteka koja beleži runtime ponašanje drugih JNI (.so) biblioteka unutar istog procesa aplikacije (nije potreban root). Key properties: - Inicijalizuje se rano i posmatra JNI/native interakcije unutar procesa koji ga učitava. - Čuva logove koristeći više putanja koje omogućavaju pisanje, sa automatskim prelaskom na Logcat kada je skladištenje ograničeno. - Prilagodljivo iz izvornog koda: izmenite sotap.c da proširite/podesite šta se loguje i ponovo izgradite po ABI. Setup (repack the APK): 1) Ubacite odgovarajući ABI build u APK tako da loader može da pronađe libsotap.so: - lib/arm64-v8a/libsotap.so (for arm64) - lib/armeabi-v7a/libsotap.so (for arm32) 2) Obezbedite da SoTap bude učitan pre ostalih JNI libova. Inject-ujte poziv rano (npr. static initializer Application podklase ili onCreate) tako da se logger inicijalizuje prvi. Smali snippet example: ```smali const-string v0, "sotap" invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V ``` 3) Rebuild/sign/install, pokrenite aplikaciju, pa prikupite logove. Log paths (checked in order): ``` /data/user/0/%s/files/sotap.log /data/data/%s/files/sotap.log /sdcard/Android/data/%s/files/sotap.log /sdcard/Download/sotap-%s.log # If all fail: fallback to Logcat only ``` Beleške i rešavanje problema: - ABI poravnanje je obavezno. Neusklađenost će izazvati UnsatisfiedLinkError i logger se neće učitati. - Ograničenja skladištenja su česta na modernom Androidu; ako pisanje fajlova ne uspe, SoTap će i dalje emitovati preko Logcat. - Ponašanje/detaljnost je predviđena za prilagođavanje; ponovo izgradite iz izvora nakon uređivanja sotap.c. Ovaj pristup je koristan za malware triage i JNI debugging gde je kritično posmatrati tokove poziva native koda od pokretanja procesa, ali root/system-wide hooks nisu dostupni. --- ### Nedavne ranjivosti vredne potrage u APK-ovima | Year | CVE | Affected library | Notes | |------|-----|------------------|-------| |2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow dostupan iz native koda koji dekodira WebP slike. Nekoliko Android aplikacija pakuje ranjive verzije. Kada vidite `libwebp.so` unutar APK-a, proverite njegovu verziju i pokušajte eksploatisati ili zakrpiti.| | |2024|Multiple|OpenSSL 3.x series|Nekoliko problema vezanih za memory-safety i padding-oracle. Mnogi Flutter & ReactNative bundle-i isporučuju sopstveni `libcrypto.so`.| Kada uočite *third-party* `.so` fajlove unutar APK-a, uvek uporedite njihov hash sa upstream advisories. SCA (Software Composition Analysis) je retka na mobilnim platformama, tako da su zastarele ranjive verzije učestale. --- ### Anti-Reversing & Hardening trends (Android 13-15) * **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 omogućava PAC/BTI u sistemskim bibliotekama na podržanom ARMv8.3+ hardveru. Decompileri sada prikazuju PAC‐relirane pseudo-instrukcije; za dinamičku analizu Frida ubacuje trampoline *posle* uklanjanja PAC, ali vaši prilagođeni trampolini treba da pozivaju `pacda`/`autibsp` gde je potrebno. * **MTE & Scudo hardened allocator:** memory-tagging je opcionalno, ali mnoge aplikacije koje vode računa o Play-Integrity se grade sa `-fsanitize=memtag`; koristite `setprop arm64.memtag.dump 1` plus `adb shell am start ...` da uhvatite tag faults. * **LLVM Obfuscator (opaque predicates, control-flow flattening):** komercijalni packeri (npr. Bangcle, SecNeo) sve više štite *native* kod, ne samo Java; očekujte lažan control-flow i enkriptovane string blobove u `.rodata`. --- ### Resources - **Learning ARM Assembly:** [Azeria Labs – ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/) - **JNI & NDK Documentation:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](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) ### References - Frida 16.x change-log (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/) - NVD advisory for `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) - SoTap: Lightweight in-app JNI (.so) behavior logger – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap) - SoTap Releases – [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases) - How to work with SoTap? – [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13) {{#include ../../banners/hacktricks-training.md}}