Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati

This commit is contained in:
Translator 2025-07-10 21:34:34 +00:00
parent b0ac8fcfd9
commit deb2ce0e89

View File

@ -4,41 +4,92 @@
**Para mais informações, consulte:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html) **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 usam essas bibliotecas, pois são mais difíceis de reverter do que o bytecode DEX. A seção enfatiza habilidades de engenharia reversa adaptadas ao Android, em vez de ensinar linguagens de montagem. Versões ARM e x86 das bibliotecas são fornecidas para compatibilidade. 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.
### Pontos Chave: ---
- **Bibliotecas Nativas em Aplicativos Android:** ### Fluxo de trabalho rápido de triagem para um `libfoo.so` recém-extraído
- Usadas para tarefas intensivas em desempenho.
- Escritas em C ou C++, tornando a engenharia reversa desafiadora.
- Encontradas no formato `.so` (objeto compartilhado), semelhante a binários do Linux.
- Criadores de malware preferem código nativo para dificultar a análise.
- **Java Native Interface (JNI) & Android NDK:**
- JNI permite que métodos Java sejam implementados em código nativo.
- NDK é um conjunto de ferramentas específico do Android para escrever código nativo.
- JNI e NDK conectam código Java (ou Kotlin) com bibliotecas nativas.
- **Carregamento e Execução de Bibliotecas:**
- Bibliotecas são carregadas na memória usando `System.loadLibrary` ou `System.load`.
- JNI_OnLoad é executado ao carregar a biblioteca.
- Métodos nativos declarados em Java se conectam a funções nativas, permitindo a execução.
- **Vinculando Métodos Java a Funções Nativas:**
- **Vinculação Dinâmica:** Nomes de funções em bibliotecas nativas correspondem a um padrão específico, permitindo vinculação automática.
- **Vinculação Estática:** Usa `RegisterNatives` para vinculação, proporcionando flexibilidade na nomeação e estrutura das funções.
- **Ferramentas e Técnicas de Engenharia Reversa:**
- Ferramentas como Ghidra e IDA Pro ajudam a analisar bibliotecas nativas.
- `JNIEnv` é crucial para entender funções e interações JNI.
- Exercícios são fornecidos para praticar o carregamento de bibliotecas, vinculação de métodos e identificação de funções nativas.
### Recursos: 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).
- **Aprendendo Assembly ARM:** ---
- Sugerido para uma compreensão mais profunda da arquitetura subjacente.
- [Fundamentos de Assembly ARM](https://azeria-labs.com/writing-arm-assembly-part-1/) da Azeria Labs é recomendado. ### Instrumentação Dinâmica (Frida ≥ 16)
- **Documentação JNI & NDK:**
- [Especificação JNI da Oracle](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) 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:
- [Dicas JNI do Android](https://developer.android.com/training/articles/perf-jni)
- [Introdução ao NDK](https://developer.android.com/ndk/guides/) * `thumb-relocator` agora pode *hookear pequenas funções ARM/Thumb* geradas pelo alinhamento agressivo do LLD (`--icf=all`).
- **Depurando Bibliotecas Nativas:** * Enumerar e reatribuir *slots de importação ELF* funciona no Android, permitindo patching `dlopen()`/`dlsym()` por módulo quando hooks inline são rejeitados.
- [Depurando Bibliotecas Nativas do Android Usando JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) * 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}} {{#include ../../banners/hacktricks-training.md}}