8.1 KiB
Reverzno inženjerstvo nativnih biblioteka
{{#include ../../banners/hacktricks-training.md}}
Za više informacija pogledajte: 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
- Extract the library
# From an installed application
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Or from the APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
- Identify architecture & protections
file libfoo.so # arm64 or arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
checksec --file libfoo.so # (peda/pwntools)
- List exported symbols & JNI bindings
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
- 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.
- 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:
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):
- 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)
- 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:
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
- 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
; koristitesetprop arm64.memtag.dump 1
plusadb 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
- JNI & NDK Documentation: Oracle JNI Spec · Android JNI Tips · NDK Guides
- Debugging Native Libraries: Debug Android Native Libraries Using JEB Decompiler
References
- Frida 16.x change-log (Android hooking, tiny-function relocation) – frida.re/news
- NVD advisory for
libwebp
overflow CVE-2023-4863 – nvd.nist.gov - SoTap: Lightweight in-app JNI (.so) behavior logger – github.com/RezaArbabBot/SoTap
- SoTap Releases – github.com/RezaArbabBot/SoTap/releases
- How to work with SoTap? – t.me/ForYouTillEnd/13
{{#include ../../banners/hacktricks-training.md}}