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

96 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Reversão de Bibliotecas Nativas
{{#include ../../banners/hacktricks-training.md}}
**Para mais informações, consulte:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](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/
```
2. **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)
```
3. **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
```
4. **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.
5. **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
| Ano | CVE | Biblioteca afetada | Notas |
|------|-----|------------------|-------|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Buffer 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.| citeturn2search0|
|2024|Múltiplos|Série OpenSSL 3.x|Vá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
- **Aprendendo Assembly ARM:** [Azeria Labs Fundamentos de Assembly ARM](https://azeria-labs.com/writing-arm-assembly-part-1/)
- **Documentação JNI & NDK:** [Especificação JNI da Oracle](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Dicas JNI para Android](https://developer.android.com/training/articles/perf-jni) · [Guias NDK](https://developer.android.com/ndk/guides/)
- **Depurando Bibliotecas Nativas:** [Depure Bibliotecas Nativas do Android Usando JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
### Referências
- Registro de alterações do Frida 16.x (hooking Android, realocação de função pequena) [frida.re/news](https://frida.re/news/) citeturn5search0
- Aviso da NVD para overflow `libwebp` CVE-2023-4863 [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
{{#include ../../banners/hacktricks-training.md}}