Reversão de Bibliotecas Nativas

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Para mais informações, consulte: https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html

Aplicativos Android podem usar bibliotecas nativas, tipicamente escritas em C ou C++, para tarefas críticas de desempenho. Criadores de malware também abusam dessas bibliotecas porque objetos compartilhados ELF ainda são mais difíceis de descompilar do que byte-code DEX/OAT. Esta página foca em fluxos de trabalho práticos e melhorias de ferramentas recentes (2023-2025) que facilitam a reversão de arquivos .so do Android.


Fluxo de trabalho rápido de triagem para um libfoo.so recém-extraído

  1. Extraia a biblioteca
bash
# De um aplicativo instalado
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# Ou do APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
  1. Identifique a arquitetura e proteções
bash
file libfoo.so        # arm64 ou arm32 / x86
readelf -h libfoo.so  # OS ABI, PIE, NX, RELRO, etc.
checksec --file libfoo.so  # (peda/pwntools)
  1. Liste símbolos exportados e ligações JNI
bash
readelf -s libfoo.so | grep ' Java_'     # JNI dinâmico
strings libfoo.so   | grep -i "RegisterNatives" -n   # JNI registrado estaticamente
  1. Carregue em um descompilador (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper ou Cutter/Rizin) e execute a análise automática. Versões mais novas do Ghidra introduziram um descompilador AArch64 que reconhece stubs PAC/BTI e tags MTE, melhorando significativamente a análise de bibliotecas construídas com o NDK do Android 14.
  2. Decida entre reversão estática e dinâmica: código ofuscado ou removido frequentemente precisa de instrumentação (Frida, ptrace/gdbserver, LLDB).

Instrumentação Dinâmica (Frida ≥ 16)

A série 16 do Frida trouxe várias melhorias específicas para Android que ajudam quando o alvo usa otimizações modernas do Clang/LLD:

  • thumb-relocator agora pode hookear pequenas funções ARM/Thumb geradas pelo alinhamento agressivo do LLD (--icf=all).
  • Enumerar e reatribuir slots de importação ELF funciona no Android, permitindo patching dlopen()/dlsym() por módulo quando hooks inline são rejeitados.
  • O hooking Java foi corrigido para o novo ponto de entrada rápido ART usado quando aplicativos são compilados com --enable-optimizations no Android 14.

Exemplo: enumerando todas as funções registradas através de RegisterNatives e despejando seus endereços em tempo de execução:

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á imediatamente em dispositivos habilitados para PAC/BTI (Pixel 8/Android 14+) desde que você use frida-server 16.2 ou posterior – versões anteriores falharam em localizar o preenchimento para hooks inline. citeturn5search2turn5search0


Vulnerabilidades recentes que valem a pena investigar em APKs

AnoCVEBiblioteca afetadaNotas
2023CVE-2023-4863libwebp ≤ 1.3.1Buffer overflow na heap acessível a partir de código nativo que decodifica imagens WebP. Vários aplicativos Android incluem versões vulneráveis. Quando você vê um libwebp.so dentro de um APK, verifique sua versão e tente exploração ou correção.
2024MúltiplosSérie OpenSSL 3.xVários problemas de segurança de memória e oracle de preenchimento. Muitos pacotes Flutter & ReactNative incluem seu próprio libcrypto.so.

Quando você encontrar arquivos .so de terceiros dentro de um APK, sempre verifique seu hash contra avisos upstream. SCA (Análise de Composição de Software) é incomum em dispositivos móveis, então builds vulneráveis desatualizados são comuns.


Tendências de Anti-Reversão & Hardening (Android 13-15)

  • Autenticação de Ponteiros (PAC) & Identificação de Alvo de Ramificação (BTI): O Android 14 habilita PAC/BTI em bibliotecas do sistema em silício ARMv8.3+ suportado. Descompiladores agora exibem pseudo-instruções relacionadas ao PAC; para análise dinâmica, o Frida injeta trampolinas após remover o PAC, mas suas trampolinas personalizadas devem chamar pacda/autibsp quando necessário.
  • MTE & Alocador endurecido Scudo: a marcação de memória é opcional, mas muitos aplicativos cientes do Play-Integrity são construídos com -fsanitize=memtag; use setprop arm64.memtag.dump 1 mais adb shell am start ... para capturar falhas de tag.
  • Ofuscador LLVM (predicados opacos, achatamento de fluxo de controle): empacotadores comerciais (por exemplo, Bangcle, SecNeo) protegem cada vez mais o código nativo, não apenas Java; espere fluxo de controle falso e blobs de string criptografados em .rodata.

Recursos

Referências

  • Registro de alterações do Frida 16.x (hooking Android, realocação de função pequena) – frida.re/news citeturn5search0
  • Aviso da NVD para overflow libwebp CVE-2023-4863 – nvd.nist.gov citeturn2search0

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks