hacktricks/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md

8.1 KiB
Raw Blame History

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 (20232025) koja olakšavaju reverzno inženjerstvo Android .so fajlova.


Brzi workflow trijaže za upravo izvučeni libfoo.so

  1. 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/
  1. 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)
  1. List exported symbols & JNI bindings
readelf -s libfoo.so | grep ' Java_'     # dynamic-linked JNI
strings libfoo.so   | grep -i "RegisterNatives" -n   # static-registered JNI
  1. 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.
  2. 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):

  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)
  1. 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
  1. 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.


  • 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 PACrelirane 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

References

{{#include ../../banners/hacktricks-training.md}}