# Reversing Native Libraries {{#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 visoke performanse. Kreatori malvera takođe zloupotrebljavaju ove biblioteke jer su ELF deljeni objekti i dalje teži za dekompilaciju od DEX/OAT bajtkoda. Ova stranica se fokusira na *praktične* radne tokove i *nedavne* poboljšanja alata (2023-2025) koja olakšavaju obrnuto inženjerstvo Android `.so` fajlova. --- ### Brza procena za svež `libfoo.so` 1. **Izvucite biblioteku** ```bash # Iz instalirane aplikacije adb shell "run-as cat lib/arm64-v8a/libfoo.so" > libfoo.so # Ili iz APK (zip) unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/ ``` 2. **Identifikujte arhitekturu i zaštite** ```bash file libfoo.so # arm64 ili arm32 / x86 readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, itd. checksec --file libfoo.so # (peda/pwntools) ``` 3. **Nabrojite eksportovane simbole i JNI veze** ```bash readelf -s libfoo.so | grep ' Java_' # dinamički povezani JNI strings libfoo.so | grep -i "RegisterNatives" -n # statički registrovani JNI ``` 4. **Učitajte u dekompajler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper ili Cutter/Rizin) i pokrenite automatsku analizu. Novije verzije Ghidre su uvele AArch64 dekompajler koji prepoznaje PAC/BTI stubove i MTE oznake, što značajno poboljšava analizu biblioteka napravljenih sa Android 14 NDK. 5. **Odlučite o statičkom naspram dinamičkom obrnuto inženjerstvu:** skraćeni, obfuskovani kod često zahteva *instrumentaciju* (Frida, ptrace/gdbserver, LLDB). --- ### Dinamička Instrumentacija (Frida ≥ 16) Frida 16-serija je donela nekoliko poboljšanja specifičnih za Android koja pomažu kada cilj koristi moderne Clang/LLD optimizacije: * `thumb-relocator` sada može *hook-ovati male ARM/Thumb funkcije* generisane LLD-ovim agresivnim poravnanjem (`--icf=all`). * Nabrajanje i ponovno povezivanje *ELF import slotova* funkcioniše na Androidu, omogućavajući po-modulno `dlopen()`/`dlsym()` patch-ovanje kada su inline hook-ovi odbijeni. * Java hooking je ispravljen za novi **ART quick-entrypoint** koji se koristi kada su aplikacije kompajlirane sa `--enable-optimizations` na Android 14. Primer: nabrajanje svih funkcija registrovanih putem `RegisterNatives` i ispis njihovih adresa u vreme izvođenja: ```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 će raditi odmah na PAC/BTI omogućеним uređajima (Pixel 8/Android 14+) sve dok koristite frida-server 16.2 ili noviji – ranije verzije nisu uspele da lociraju padding za inline hooks. citeturn5search2turn5search0 --- ### Nedavne ranjivosti koje vredi istražiti u APK-ima | Godina | CVE | Pogođena biblioteka | Napomene | |--------|-----|---------------------|----------| |2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Prelivanje bafera na heap-u dostupno iz nativnog koda koji dekodira WebP slike. Nekoliko Android aplikacija sadrži ranjive verzije. Kada vidite `libwebp.so` unutar APK-a, proverite njegovu verziju i pokušajte sa eksploatacijom ili zakrpanjem.| citeturn2search0| |2024|Više|OpenSSL 3.x serija|Nekoliko problema sa bezbednošću memorije i padding-oracle. Mnogi Flutter i ReactNative paketi isporučuju svoj `libcrypto.so`.| Kada primetite *treće strane* `.so` datoteke unutar APK-a, uvek proverite njihov hash protiv uzvodnih obaveštenja. SCA (Analiza softverskog sastava) je retka na mobilnim uređajima, pa su zastarele ranjive verzije rasprostranjene. --- ### Anti-reversing & Hardening trendovi (Android 13-15) * **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 omogućava PAC/BTI u sistemskim bibliotekama na podržanom ARMv8.3+ silikonu. Decompilatori sada prikazuju PAC‐povezane pseudo-instrukcije; za dinamičku analizu Frida ubrizgava trampoline *nakon* uklanjanja PAC-a, ali vaše prilagođene trampoline treba da pozivaju `pacda`/`autibsp` gde je to potrebno. * **MTE & Scudo ojačani alokator:** označavanje memorije je opcionalno, ali mnoge aplikacije svesne Play-Integrity se grade sa `-fsanitize=memtag`; koristite `setprop arm64.memtag.dump 1` plus `adb shell am start ...` da zabeležite greške u oznakama. * **LLVM Obfuscator (neprozirni predikati, izravnavanje toka kontrole):** komercijalni pakeri (npr., Bangcle, SecNeo) sve više štite *nativni* kod, ne samo Java; očekujte lažne tokove kontrole i enkriptovane string blobove u `.rodata`. --- ### Resursi - **Učenje ARM Assemblera:** [Azeria Labs – Osnovi ARM Assemblera](https://azeria-labs.com/writing-arm-assembly-part-1/) - **JNI & NDK Dokumentacija:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Saveti](https://developer.android.com/training/articles/perf-jni) · [NDK Vodiči](https://developer.android.com/ndk/guides/) - **Debagovanje Nativnih Biblioteka:** [Debagovanje Android Nativnih Biblioteka koristeći JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) ### Reference - Frida 16.x promena (Android hooking, relokacija malih funkcija) – [frida.re/news](https://frida.re/news/) citeturn5search0 - NVD obaveštenje za `libwebp` prelivanje CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0 {{#include ../../banners/hacktricks-training.md}}