Reversing Native Libraries

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Para más información, consulta: https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html

Las aplicaciones de Android pueden usar bibliotecas nativas, típicamente escritas en C o C++, para tareas críticas de rendimiento. Los creadores de malware también abusan de estas bibliotecas porque los objetos compartidos ELF son aún más difíciles de descompilar que el bytecode DEX/OAT. Esta página se centra en flujos de trabajo prácticos y mejoras de herramientas recientes (2023-2025) que facilitan la reversión de archivos .so de Android.


Flujo de trabajo rápido de triaje para un libfoo.so recién extraído

  1. Extraer la biblioteca
bash
# Desde una aplicación instalada
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# O desde el APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
  1. Identificar arquitectura y protecciones
bash
file libfoo.so        # arm64 o arm32 / x86
readelf -h libfoo.so  # ABI del OS, PIE, NX, RELRO, etc.
checksec --file libfoo.so  # (peda/pwntools)
  1. Listar símbolos exportados y enlaces JNI
bash
readelf -s libfoo.so | grep ' Java_'     # JNI vinculado dinámicamente
strings libfoo.so   | grep -i "RegisterNatives" -n   # JNI registrado estáticamente
  1. Cargar en un descompilador (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper o Cutter/Rizin) y ejecutar análisis automático. Las versiones más recientes de Ghidra introdujeron un descompilador AArch64 que reconoce los stubs PAC/BTI y las etiquetas MTE, mejorando enormemente el análisis de bibliotecas construidas con el NDK de Android 14.
  2. Decidir entre reversión estática y dinámica: el código despojado y ofuscado a menudo necesita instrumentación (Frida, ptrace/gdbserver, LLDB).

Instrumentación Dinámica (Frida ≥ 16)

La serie 16 de Frida trajo varias mejoras específicas de Android que ayudan cuando el objetivo utiliza optimizaciones modernas de Clang/LLD:

  • thumb-relocator ahora puede enganchar funciones pequeñas de ARM/Thumb generadas por la alineación agresiva de LLD (--icf=all).
  • Enumerar y volver a enlazar slots de importación ELF funciona en Android, habilitando parches dlopen()/dlsym() por módulo cuando se rechazan los hooks en línea.
  • La vinculación de Java se corrigió para el nuevo punto de entrada rápido ART utilizado cuando las aplicaciones se compilan con --enable-optimizations en Android 14.

Ejemplo: enumerar todas las funciones registradas a través de RegisterNatives y volcar sus direcciones en tiempo de ejecución:

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 funcionará sin problemas en dispositivos habilitados para PAC/BTI (Pixel 8/Android 14+) siempre que utilices frida-server 16.2 o posterior; las versiones anteriores no lograron localizar el relleno para hooks en línea. citeturn5search2turn5search0


Vulnerabilidades recientes que vale la pena buscar en APKs

AñoCVEBiblioteca afectadaNotas
2023CVE-2023-4863libwebp ≤ 1.3.1Desbordamiento de búfer en el heap accesible desde código nativo que decodifica imágenes WebP. Varias aplicaciones de Android incluyen versiones vulnerables. Cuando veas un libwebp.so dentro de un APK, verifica su versión e intenta la explotación o el parcheo.
2024MúltiplesSerie OpenSSL 3.xVarios problemas de seguridad de memoria y oracle de relleno. Muchos paquetes de Flutter y ReactNative incluyen su propio libcrypto.so.

Cuando encuentres archivos .so de terceros dentro de un APK, siempre verifica su hash contra los avisos de upstream. SCA (Análisis de Composición de Software) es poco común en móviles, por lo que las versiones vulnerables desactualizadas son comunes.


Tendencias de Anti-Reversión y Endurecimiento (Android 13-15)

  • Autenticación de Punteros (PAC) e Identificación de Objetivos de Rama (BTI): Android 14 habilita PAC/BTI en bibliotecas del sistema en silicio ARMv8.3+ compatibles. Los descompiladores ahora muestran pseudo-instrucciones relacionadas con PAC; para análisis dinámico, Frida inyecta trampolines después de eliminar PAC, pero tus trampolines personalizados deben llamar a pacda/autibsp donde sea necesario.
  • MTE y asignador endurecido Scudo: el etiquetado de memoria es opcional, pero muchas aplicaciones conscientes de Play-Integrity se construyen con -fsanitize=memtag; usa setprop arm64.memtag.dump 1 más adb shell am start ... para capturar fallos de etiqueta.
  • Ofuscador LLVM (predicados opacos, aplanamiento de flujo de control): los empaquetadores comerciales (por ejemplo, Bangcle, SecNeo) protegen cada vez más el código nativo, no solo Java; espera flujos de control falsos y blobs de cadenas encriptadas en .rodata.

Recursos

Referencias

  • Registro de cambios de Frida 16.x (enganche de Android, reubicación de funciones pequeñas) – frida.re/news citeturn5search0
  • Aviso de NVD para el desbordamiento de libwebp CVE-2023-4863 – nvd.nist.gov citeturn2search0

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks