Reversing Native Libraries
Reading time: 7 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Per ulteriori informazioni consulta: https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html
Le app Android possono usare librerie native, tipicamente scritte in C o C++, per attività che richiedono prestazioni critiche. Gli autori di malware abusano anche di queste librerie perché gli ELF shared objects sono ancora più difficili da decompilare rispetto al byte-code DEX/OAT.
Questa pagina si concentra su workflow pratici e miglioramenti degli strumenti recenti (2023-2025) che rendono più facile il reversing dei file Android .so
.
Flusso di triage rapido per un libfoo.so
appena estratto
- 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. Le versioni più recenti di Ghidra hanno introdotto un decompiler AArch64 che riconosce PAC/BTI stubs e MTE tags, migliorando notevolmente l'analisi delle librerie compilate con l'NDK di Android 14.
- Decide on static vs dynamic reversing: il codice stripped e offuscato spesso necessita di instrumentation (Frida, ptrace/gdbserver, LLDB).
Instrumentazione dinamica (Frida ≥ 16)
La serie 16 di Frida ha introdotto diversi miglioramenti specifici per Android che aiutano quando il target usa ottimizzazioni moderne di Clang/LLD:
thumb-relocator
può ora hook tiny ARM/Thumb functions generate dall'allineamento aggressivo di LLD (--icf=all
).- L'enumerazione e il rebinding degli ELF import slots funziona su Android, permettendo il patching
dlopen()
/dlsym()
per modulo quando gli inline hooks vengono rifiutati. - Il Java hooking è stato corretto per il nuovo ART quick-entrypoint usato quando le app sono compilate con
--enable-optimizations
su Android 14.
Esempio: enumerare tutte le funzioni registrate tramite RegisterNatives
e dumpare i loro indirizzi a runtime:
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 funzionerà immediatamente su dispositivi con PAC/BTI abilitato (Pixel 8/Android 14+) purché si usi frida-server 16.2 o successivo - le versioni precedenti non riuscivano a trovare il padding per gli inline hooks.
Process-local JNI telemetry via preloaded .so (SoTap)
Quando un'instrumentation completa è eccessiva o bloccata, è comunque possibile ottenere visibilità a livello nativo precaricando un piccolo logger all'interno del processo target. SoTap è una libreria nativa Android leggera (.so) che registra il comportamento runtime di altre librerie JNI (.so) all'interno dello stesso processo dell'app (no root required).
Key properties:
- Si inizializza precocemente e osserva le interazioni JNI/native all'interno del processo che lo carica.
- Persiste i log utilizzando più percorsi scrivibili con fallback elegante a Logcat quando lo storage è ristretto.
- Personalizzabile a livello di sorgente: modifica sotap.c per estendere/adeguare cosa viene registrato e ricompila per ABI.
Setup (repack the APK):
- Drop the proper ABI build into the APK so the loader can resolve libsotap.so:
- lib/arm64-v8a/libsotap.so (for arm64)
- lib/armeabi-v7a/libsotap.so (for arm32)
- Ensure SoTap loads before other JNI libs. Inject a call early (e.g., Application subclass static initializer or onCreate) so the logger is initialized first. Smali snippet example:
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
- Rebuild/sign/install, run the app, then collect 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
Note e risoluzione dei problemi:
- L'allineamento ABI è obbligatorio. Un mismatch provocherà UnsatisfiedLinkError e il logger non verrà caricato.
- Le limitazioni di storage sono comuni su Android moderni; se le scritture su file falliscono, SoTap continuerà comunque a emettere tramite Logcat.
- Comportamento/verbosità è pensato per essere personalizzato; ricompila dal sorgente dopo aver modificato sotap.c.
This approach is useful for malware triage and JNI debugging where observing native call flows from process start is critical but root/system-wide hooks aren’t available.
Vulnerabilità recenti da cercare negli APK
Anno | CVE | Libreria interessata | Note |
---|---|---|---|
2023 | CVE-2023-4863 | libwebp ≤ 1.3.1 | Heap buffer overflow reachable from native code that decodes WebP images. Several Android apps bundle vulnerable versions. When you see a libwebp.so inside an APK, check its version and attempt exploitation or patching. |
2024 | Multiple | OpenSSL 3.x series | Several memory-safety and padding-oracle issues. Many Flutter & ReactNative bundles ship their own libcrypto.so . |
When you spot third-party .so
files inside an APK, always cross-check their hash against upstream advisories. SCA (Software Composition Analysis) is uncommon on mobile, so outdated vulnerable builds are rampant.
Tendenze Anti-Reversing & Hardening (Android 13-15)
- Pointer Authentication (PAC) & Branch Target Identification (BTI): Android 14 abilita PAC/BTI nelle librerie di sistema su siliconi ARMv8.3+ supportati. I decompilatori ora mostrano pseudo-istruzioni correlate a PAC; per l'analisi dinamica Frida inietta trampolines after stripping PAC, ma i tuoi trampolines personalizzati dovrebbero chiamare
pacda
/autibsp
quando necessario. - MTE & Scudo hardened allocator: il memory-tagging è opt-in ma molte app Play-Integrity aware vengono compilate con
-fsanitize=memtag
; usasetprop arm64.memtag.dump 1
piùadb shell am start ...
per catturare tag faults. - LLVM Obfuscator (opaque predicates, control-flow flattening): i packer commerciali (e.g., Bangcle, SecNeo) proteggono sempre di più il codice native, non solo Java; aspettati bogus control-flow e blob di stringhe cifrate in
.rodata
.
Risorse
- 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
Riferimenti
- Frida 16.x change-log (Android hooking, tiny-function relocation) – frida.re/news
- Avviso NVD per l'overflow di
libwebp
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
- Come lavorare con SoTap? – t.me/ForYouTillEnd/13
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.