Omgekeerde ingenieurswese van inheemse biblioteke

Reading time: 8 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Vir verdere inligting, kyk: https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html

Android-apps kan inheemse biblioteke gebruik, gewoonlik geskryf in C of C++, vir prestasie-kritiese take. Malware-skepper misbruik ook hierdie biblioteke omdat ELF shared objects steeds moeiliker is om te dekompileer as DEX/OAT byte-code. Hierdie blad fokus op praktykgebaseerde werkvloei en onlangse gereedskapverbeterings (2023-2025) wat die reversing van Android .so-lĂȘers makliker maak.


Vinnige triage-werkvloei vir 'n pas onttrekte libfoo.so

  1. Onttrek die biblioteek
bash
# 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. Identifiseer argitektuur & beskermings
bash
file libfoo.so        # arm64 or arm32 / x86
readelf -h libfoo.so  # OS ABI, PIE, NX, RELRO, etc.
checksec --file libfoo.so  # (peda/pwntools)
  1. Lys uitgevoerde simbole & JNI-koppellings
bash
readelf -s libfoo.so | grep ' Java_'     # dynamic-linked JNI
strings libfoo.so   | grep -i "RegisterNatives" -n   # static-registered JNI
  1. Laai in 'n dekompiler (Ghidra ≄ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) en voer outo-analise uit. Nuweer Ghidra-weergawes het 'n AArch64-dekompiler ingestel wat PAC/BTI-stubs en MTE-tags herken, wat die analise van biblioteke gebou met die Android 14 NDK baie verbeter.
  2. Besluit staties vs dinamies reverse: gestrippe, obfuskeer kode benodig dikwels instrumentation (Frida, ptrace/gdbserver, LLDB).

Dynamiese Instrumentasie (Frida ≄ 16)

Frida’s 16-reeks het verskeie Android-spesifieke verbeterings gebring wat help wanneer die teiken moderne Clang/LLD optimisasies gebruik:

  • thumb-relocator kan nou hook klein ARM/Thumb-funksies wat deur LLD se aggressiewe uitlyning gegenereer is (--icf=all).
  • Enumerering en herbinding van ELF import slots werk op Android, wat per-module dlopen()/dlsym() patching moontlik maak wanneer inline hooks verwerp word.
  • Java hooking is reggestel vir die nuwe ART quick-entrypoint wat gebruik word wanneer apps saamgestel is met --enable-optimizations op Android 14.

Voorbeeld: enumerering van alle funksies geregistreer deur RegisterNatives en die uitgooi van hul adresse by runtime:

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 sal sonder ekstra konfigurasie werk op PAC/BTI-enabled toestelle (Pixel 8/Android 14+) solank jy frida-server 16.2 of later gebruik – vroeĂ«r weergawes het nie padding vir inline hooks kon lokaliseer nie.

Process-local JNI telemetry via preloaded .so (SoTap)

Wanneer vol-funksionele instrumentation oordrewe of geblokkeer is, kan jy steeds native-vlak sigbaarheid kry deur 'n klein logger vooraf in die teikenproses te laai. SoTap is 'n liggewig Android native (.so) biblioteek wat die runtime-gedrag van ander JNI (.so) biblioteke binne dieselfde app-proses log (geen root benodig).

Belangrike eienskappe:

  • Initialiseer vroeg en monitor JNI/native-interaksies binne die proses wat dit laai.
  • Stoor logs deur verskeie skryfbare paaie te gebruik, met 'n elegante terugval na Logcat wanneer stoorruimte beperk is.
  • Bron-aanpasbaar: wysig sotap.c om uit te brei/aan te pas wat aangeteken word en herbou per ABI.

Opstelling (herpak die APK):

  1. Plaas die toepaslike ABI build in die APK sodat die laaier libsotap.so kan oplos:
  • lib/arm64-v8a/libsotap.so (for arm64)
  • lib/armeabi-v7a/libsotap.so (for arm32)
  1. Verseker dat SoTap laai voordat ander JNI libs laai. Injekteer 'n oproep vroeg (bv. Application subclass static initializer of onCreate) sodat die logger eerstens geĂŻnitialiseer word. Smali snippet example:
smali
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
  1. Herbou/handteken/installeer, maak die app oop, en versamel dan logs.

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

Notes en probleemoplossing:

  • ABI-belyning is verpligtend. 'n Ongelykheid (mismatch) sal 'n UnsatisfiedLinkError veroorsaak en die logger sal nie laai nie.
  • Bergingbeperkings is algemeen op moderne Android; as lĂȘerskryf misluk, sal SoTap steeds via Logcat uitset lewer.
  • Gedrag/uitvoerigheid is bedoel om aangepas te word; herbou vanaf die bron nadat jy sotap.c gewysig het.

Hierdie benadering is nuttig vir malware-triage en JNI-debugging waar dit kritiek is om native oproepvloei vanaf die prosesbegin te observeer, maar root/sisteemwye hooks nie beskikbaar is nie.


Sien ook: in‑memory native code execution via JNI

'n Algemene aanvalspatroon is om 'n rou shellcode-blob tydens runtime af te laai en dit direk uit geheue deur 'n JNI-brug uit te voer (geen on‑disk ELF). Details en gereed-vir-gebruik JNI-snippet hier:

In Memory Jni Shellcode Execution


Onlangse kwesbaarhede wat die moeite werd is om in APKs te soek

JaarCVEGeaffekteerde biblioteekNotas
2023CVE-2023-4863libwebp ≀ 1.3.1Heap buffer overflow bereikbaar vanaf native kode wat WebP-beelde dekodeer. Verskeie Android-apps pak kwesbare weergawes in. Wanneer jy 'n libwebp.so binne 'n APK sien, kontroleer die weergawe en probeer eksploitasie of pleistering.
2024MultipleOpenSSL 3.x seriesVerskeie geheue-veiligheid- en padding-oracle-kwessies. Baie Flutter- & ReactNative-bundels lewer hul eie libcrypto.so.

Wanneer jy third-party .so-lĂȘers binne 'n APK raak, kruisverifieer altyd hul hash teen upstream advisories. SCA (Software Composition Analysis) is ongereeld op mobiele toestelle, dus is verouderde kwesbare builds volop.


Anti-Reversing & Hardening-neigings (Android 13–15)

  • Pointer Authentication (PAC) & Branch Target Identification (BTI): Android 14 aktiveer PAC/BTI in stelselbiblioteke op ondersteunde ARMv8.3+ silikon. Decompilers vertoon nou PAC-verwante pseudo-instruksies; vir dinamiese analise injekteer Frida trampoliene nĂĄ die verwydering van PAC, maar jou eie trampoliene behoort pacda/autibsp aan te roep waar nodig.
  • MTE & Scudo hardened allocator: Memory-tagging is opsioneel maar baie Play-Integrity-bewuste apps bou met -fsanitize=memtag; gebruik setprop arm64.memtag.dump 1 plus adb shell am start ... om tag-foute vas te vang.
  • LLVM Obfuscator (opaque predicates, control-flow flattening): KommersiĂ«le packers (bv. Bangcle, SecNeo) beskerm toenemend native kode, nie net Java nie; verwag vals control-flow en enkripteerde string-blobs in .rodata.

Hulpbronne

Verwysings

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks