mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/reversing-nati
This commit is contained in:
parent
cfb2e0a1e1
commit
6405e5ca81
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Cheatsheets de Forense
|
||||
## CheatSheets de Forense
|
||||
|
||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||
|
||||
@ -25,7 +25,7 @@ sudo apt-get install -y yara
|
||||
#### Preparar regras
|
||||
|
||||
Use este script para baixar e mesclar todas as regras yara de malware do github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Crie o diretório _**rules**_ e execute-o. Isso criará um arquivo chamado _**malware_rules.yar**_ que contém todas as regras yara para malware.
|
||||
Crie o diretório _**rules**_ e execute-o. Isso criará um arquivo chamado _**malware_rules.yar**_ que contém todas as regras yara de malware.
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
@ -49,7 +49,7 @@ python3.exe yarGen.py --excludegood -m ../../mals/
|
||||
```
|
||||
sudo apt-get install -y clamav
|
||||
```
|
||||
#### Scan
|
||||
#### Varredura
|
||||
```bash
|
||||
sudo freshclam #Update rules
|
||||
clamscan filepath #Scan 1 file
|
||||
@ -57,25 +57,25 @@ clamscan folderpath #Scan the whole folder
|
||||
```
|
||||
### [Capa](https://github.com/mandiant/capa)
|
||||
|
||||
**Capa** detecta **capacidades** potencialmente maliciosas em executáveis: PE, ELF, .NET. Assim, encontrará coisas como Att\&ck tactics, ou capacidades suspeitas como:
|
||||
**Capa** detecta potencialmente **capacidades** maliciosas em executáveis: PE, ELF, .NET. Assim, encontrará coisas como Att\&ck táticas, ou capacidades suspeitas como:
|
||||
|
||||
- verificar erro em OutputDebugString
|
||||
- verificar erro OutputDebugString
|
||||
- executar como um serviço
|
||||
- criar processo
|
||||
|
||||
Obtenha-o no [**Github repo**](https://github.com/mandiant/capa).
|
||||
Get it int he [**Github repo**](https://github.com/mandiant/capa).
|
||||
|
||||
### IOCs
|
||||
|
||||
IOC significa Indicador de Comprometimento. Um IOC é um conjunto de **condições que identificam** algum software potencialmente indesejado ou confirmado **malware**. Blue Teams usam esse tipo de definição para **procurar por esse tipo de arquivos maliciosos** em seus **sistemas** e **redes**.\
|
||||
Compartilhar essas definições é muito útil, pois quando um malware é identificado em um computador e um IOC para esse malware é criado, outras Blue Teams podem usá-lo para identificar o malware mais rapidamente.
|
||||
IOC significa Indicator Of Compromise. Um IOC é um conjunto de **condições que identificam** algum software potencialmente indesejado ou **malware** confirmado. As Blue Teams usam esse tipo de definição para **procurar por esse tipo de arquivos maliciosos** em seus **sistemas** e **redes**.\
|
||||
Compartilhar essas definições é muito útil, pois quando um malware é identificado em um computador e um IOC para esse malware é criado, outras Blue Teams podem usá‑lo para identificar o malware mais rapidamente.
|
||||
|
||||
Uma ferramenta para criar ou modificar IOCs é [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
Você pode usar ferramentas como [**Redline**](https://www.fireeye.com/services/freeware/redline.html) para **procurar IOCs definidos em um dispositivo**.
|
||||
Você pode usar ferramentas como [**Redline**](https://www.fireeye.com/services/freeware/redline.html) para **buscar por IOCs definidos em um dispositivo**.
|
||||
|
||||
### Loki
|
||||
|
||||
[**Loki**](https://github.com/Neo23x0/Loki) é um scanner para Indicadores Simples de Comprometimento.\
|
||||
[**Loki**](https://github.com/Neo23x0/Loki) é um scanner para Simple Indicators of Compromise.\
|
||||
A detecção é baseada em quatro métodos de detecção:
|
||||
```
|
||||
1. File Name IOC
|
||||
@ -92,7 +92,7 @@ Compares process connection endpoints with C2 IOCs (new since version v.10)
|
||||
```
|
||||
### Linux Malware Detect
|
||||
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) é um scanner de malware para Linux lançado sob a licença GNU GPLv2, projetado para as ameaças enfrentadas em ambientes de hospedagem compartilhada. Ele usa dados de ameaça de sistemas de detecção de intrusão de borda de rede para extrair malware que está sendo usado ativamente em ataques e gerar assinaturas para detecção. Além disso, os dados de ameaça também são derivados de submissões de usuários com o recurso checkout do LMD e de recursos da comunidade de malware.
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) é um scanner de malware para Linux lançado sob a licença GNU GPLv2, projetado para as ameaças enfrentadas em ambientes de hospedagem compartilhada. Ele utiliza dados de ameaça de sistemas de detecção de intrusão na borda da rede para extrair malware que está sendo usado ativamente em ataques e gerar assinaturas para detecção. Além disso, os dados de ameaça também são derivados de envios de usuários com o recurso LMD checkout e de recursos da comunidade de malware.
|
||||
|
||||
### rkhunter
|
||||
|
||||
@ -102,31 +102,31 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk
|
||||
```
|
||||
### FLOSS
|
||||
|
||||
[**FLOSS**](https://github.com/mandiant/flare-floss) é uma ferramenta que tenta encontrar strings ofuscadas dentro de executáveis usando diferentes técnicas.
|
||||
[**FLOSS**](https://github.com/mandiant/flare-floss) é uma ferramenta que tenta encontrar obfuscated strings dentro de executáveis usando diferentes técnicas.
|
||||
|
||||
### PEpper
|
||||
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper) verifica alguns elementos básicos dentro do executável (binary data, entropy, URLs and IPs, algumas regras yara).
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper) verifica alguns aspetos básicos dentro do executável (binary data, entropy, URLs and IPs, some yara rules).
|
||||
|
||||
### PEstudio
|
||||
|
||||
[PEstudio](https://www.winitor.com/download) é uma ferramenta que permite obter informações de executáveis Windows como imports, exports, headers, mas também verifica o VirusTotal e encontra potenciais técnicas do Att\&ck.
|
||||
[PEstudio](https://www.winitor.com/download) é uma ferramenta que permite obter informação de executáveis Windows, como imports, exports, headers, mas também verifica VirusTotal e encontra potenciais Att\&ck techniques.
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) é uma ferramenta para detectar se um arquivo está **criptografado** e também encontrar **packers**.
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) é uma ferramenta para detectar se um ficheiro está **encrypted** e também para encontrar **packers**.
|
||||
|
||||
### NeoPI
|
||||
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)is um script Python que usa uma variedade de **métodos estatísticos** para detectar conteúdo **ofuscado** e **criptografado** dentro de arquivos de texto/script. O propósito do NeoPI é auxiliar na **detecção de código de web shell oculto**.
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) é um script Python que usa uma variedade de **métodos estatísticos** para detectar conteúdo **obfuscated** e **encrypted** em ficheiros de texto/script. O objetivo do NeoPI é auxiliar na **detecção de código web shell oculto**.
|
||||
|
||||
### **php-malware-finder**
|
||||
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) faz o seu melhor para detectar código **ofuscado**/**suspeito** assim como arquivos que usam funções **PHP** frequentemente usadas em **malwares**/webshells.
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) faz o seu melhor para detectar **obfuscated**/**dodgy code** assim como ficheiros que usam funções **PHP** frequentemente usadas em **malwares**/webshells.
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
Ao analisar alguma **amostra de malware** você deve sempre **verificar a assinatura** do binário, pois o **desenvolvedor** que a assinou pode já estar **relacionado** com **malware.**
|
||||
Ao analisar uma **malware sample** deve sempre **verificar a assinatura** do binário, pois o **developer** que a assinou pode já estar **related** com **malware.**
|
||||
```bash
|
||||
#Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
@ -141,23 +141,23 @@ spctl --assess --verbose /Applications/Safari.app
|
||||
|
||||
### File Stacking
|
||||
|
||||
Se você sabe que alguma pasta contendo os **files** de um **web server** foi **atualizada por último em uma determinada data**, **verifique** a **data** em que todos os **files** no **web server** foram criados e modificados e se alguma data for **suspeita**, cheque esse file.
|
||||
Se você souber que alguma pasta contendo os **arquivos** de um servidor web foi **atualizada pela última vez em alguma data**, **verifique** a **data** em que todos os **arquivos** no **servidor web foram criados e modificados** e, se alguma data for **suspeita**, analise esse arquivo.
|
||||
|
||||
### Baselines
|
||||
|
||||
Se os **files** de uma pasta **não deveriam ter sido modificados**, você pode calcular o **hash** dos **original files** da pasta e **compará-los** com os atuais. Qualquer coisa modificada será **suspeita**.
|
||||
Se os arquivos de uma pasta **não deveriam ter sido modificados**, você pode calcular o **hash** dos **arquivos originais** da pasta e **compará-los** com os atuais. Qualquer coisa modificada será **suspeita**.
|
||||
|
||||
### Statistical Analysis
|
||||
|
||||
Quando a informação é salva em logs você pode **verificar estatísticas, como quantas vezes cada file de um web server foi acessado, já que um web shell pode ser um dos mais**.
|
||||
Quando a informação é salva em logs, você pode **verificar estatísticas**, como quantas vezes cada arquivo de um servidor web foi acessado — já que um web shell pode ser um dos mais acessados.
|
||||
|
||||
---
|
||||
|
||||
### Android in-app native telemetry (no root)
|
||||
### Telemetria nativa in-app no Android (sem root)
|
||||
|
||||
On Android, você pode instrumentar código nativo dentro do processo do app alvo pré-carregando uma pequena biblioteca logger antes que outras libs JNI inicializem. Isso dá visibilidade precoce do comportamento nativo sem hooks a nível de sistema ou root. Uma abordagem popular é SoTap: coloque libsotap.so para a ABI correta dentro do APK e injete uma chamada System.loadLibrary("sotap") cedo (por exemplo, em um inicializador estático ou Application.onCreate), então colete logs de caminhos internos/externos ou use Logcat como fallback.
|
||||
No Android, você pode instrumentar código nativo dentro do processo do app alvo pré-carregando uma pequena biblioteca de logger antes que as outras libs JNI inicializem. Isso fornece visibilidade precoce do comportamento nativo sem hooks a nível de sistema ou root. Uma abordagem popular é SoTap: coloque o libsotap.so para a ABI correta dentro do APK e injete uma chamada System.loadLibrary("sotap") cedo (por exemplo, inicializador estático ou Application.onCreate), então colete logs de caminhos internos/externos ou usando Logcat como fallback.
|
||||
|
||||
See the Android native reversing page for setup details and log paths:
|
||||
Veja a página de reversing nativo para Android para detalhes de configuração e caminhos de log:
|
||||
|
||||
{{#ref}}
|
||||
../../mobile-pentesting/android-app-pentesting/reversing-native-libraries.md
|
||||
@ -165,13 +165,13 @@ See the Android native reversing page for setup details and log paths:
|
||||
|
||||
---
|
||||
|
||||
## Desobfuscando Control-Flow Dinâmico (JMP/CALL RAX Dispatchers)
|
||||
## Desofuscação do Fluxo de Controle Dinâmico (JMP/CALL RAX Dispatchers)
|
||||
|
||||
Famílias modernas de malware abusam fortemente da obfuscação do Control-Flow Graph (CFG): em vez de um jump/call direto elas calculam o destino em tempo de execução e executam um `jmp rax` ou `call rax`. Um pequeno *dispatcher* (tipicamente nove instruções) define o alvo final dependendo das flags da CPU `ZF`/`CF`, quebrando completamente a recuperação estática do CFG.
|
||||
As famílias de malware modernas abusam fortemente da ofuscação do Grafo de Fluxo de Controle (CFG): em vez de um jump/call direto, elas calculam o destino em tempo de execução e executam um `jmp rax` ou `call rax`. Um pequeno *dispatcher* (tipicamente nove instruções) define o alvo final dependendo das flags `ZF`/`CF` da CPU, quebrando completamente a recuperação estática do CFG.
|
||||
|
||||
A técnica – demonstrada pelo loader SLOW#TEMPEST – pode ser derrotada com um fluxo de trabalho em três passos que depende apenas de IDAPython e do emulador de CPU Unicorn.
|
||||
A técnica — demonstrada pelo loader SLOW#TEMPEST — pode ser derrotada com um fluxo de trabalho em três passos que depende apenas de IDAPython e do emulador de CPU Unicorn.
|
||||
|
||||
### 1. Localize cada jump/call indireto
|
||||
### 1. Localizar cada indirect jump / call
|
||||
```python
|
||||
import idautils, idc
|
||||
|
||||
@ -180,7 +180,7 @@ mnem = idc.print_insn_mnem(ea)
|
||||
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
|
||||
print(f"[+] Dispatcher found @ {ea:X}")
|
||||
```
|
||||
### 2. Extrair o byte-code do dispatcher
|
||||
### 2. Extraia o byte-code do dispatcher
|
||||
```python
|
||||
import idc
|
||||
|
||||
@ -211,9 +211,9 @@ mu.reg_write(UC_X86_REG_RAX, 0)
|
||||
mu.emu_start(BASE, BASE+len(code))
|
||||
return mu.reg_read(UC_X86_REG_RAX)
|
||||
```
|
||||
Execute `run(code,0,0)` e `run(code,1,1)` para obter os alvos de branch *false* e *true*.
|
||||
Execute `run(code,0,0)` e `run(code,1,1)` para obter os *false* e *true* branch targets.
|
||||
|
||||
### 4. Aplicar patch para um jump / call direto
|
||||
### 4. Patch back a direct jump / call
|
||||
```python
|
||||
import struct, ida_bytes
|
||||
|
||||
@ -222,12 +222,12 @@ op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32
|
||||
disp = target - (ea + 5) & 0xFFFFFFFF
|
||||
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
|
||||
```
|
||||
Após aplicar o patch, force o IDA a reanalisar a função para que o CFG completo e a saída do Hex-Rays sejam restaurados:
|
||||
Após patching, force o IDA a reanalisar a função para que o CFG completo e a saída do Hex-Rays sejam restaurados:
|
||||
```python
|
||||
import ida_auto, idaapi
|
||||
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
||||
```
|
||||
### 5. Rotular chamadas de API indiretas
|
||||
### 5. Rotular chamadas indiretas de API
|
||||
|
||||
Uma vez que o destino real de cada `call rax` seja conhecido, você pode informar o IDA sobre ele para que os tipos de parâmetros & nomes de variáveis sejam recuperados automaticamente:
|
||||
```python
|
||||
@ -236,7 +236,7 @@ idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
||||
### Benefícios práticos
|
||||
|
||||
* Restaura o CFG real → a decompilação passa de *10* linhas para milhares.
|
||||
* Permite string-cross-reference & xrefs, tornando a reconstrução do comportamento trivial.
|
||||
* Habilita string-cross-reference & xrefs, tornando a reconstrução do comportamento trivial.
|
||||
* Scripts são reutilizáveis: coloque-os em qualquer loader protegido pelo mesmo truque.
|
||||
|
||||
---
|
||||
|
@ -1,50 +1,50 @@
|
||||
# Reversão de Bibliotecas Nativas
|
||||
# Reversing Native Libraries
|
||||
|
||||
{{#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)
|
||||
**For further information check:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||
|
||||
Apps 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 ELF shared objects ainda são mais difíceis de decompilar do que byte-code DEX/OAT.
|
||||
Esta página foca em fluxos de trabalho *práticos* e em melhorias recentes de tooling (2023-2025) que tornam a reversão de arquivos `.so` do Android mais fácil.
|
||||
Android apps podem usar native libraries, tipicamente escritas em C ou C++, para tarefas que exigem desempenho. Criadores de malware também abusam dessas bibliotecas porque ELF shared objects ainda são mais difíceis de decompilar que byte-code DEX/OAT.
|
||||
Esta página foca em workflows *práticos* e melhorias de tooling *recentes* (2023-2025) que tornam o reversing de arquivos `.so` do Android mais fácil.
|
||||
|
||||
---
|
||||
|
||||
### Fluxo rápido de triagem para um `libfoo.so` recém-extraído
|
||||
### Quick triage-workflow for a freshly pulled `libfoo.so`
|
||||
|
||||
1. **Extrair a biblioteca**
|
||||
1. **Extract the library**
|
||||
```bash
|
||||
# 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/
|
||||
```
|
||||
2. **Identificar arquitetura e proteções**
|
||||
2. **Identify architecture & protections**
|
||||
```bash
|
||||
file libfoo.so # arm64 or arm32 / x86
|
||||
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
|
||||
checksec --file libfoo.so # (peda/pwntools)
|
||||
```
|
||||
3. **Listar símbolos exportados e bindings JNI**
|
||||
3. **List exported symbols & JNI bindings**
|
||||
```bash
|
||||
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
|
||||
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
|
||||
```
|
||||
4. **Carregar em um decompilador** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) e executar a análise automática.
|
||||
Versões mais recentes do Ghidra introduziram um decompilador AArch64 que reconhece stubs PAC/BTI e tags MTE, melhorando bastante a análise de bibliotecas compiladas com o Android 14 NDK.
|
||||
5. **Decida entre reversing estático vs dinâmico:** código stripped ou ofuscado frequentemente precisa de *instrumentation* (Frida, ptrace/gdbserver, LLDB).
|
||||
4. **Load in a decompiler** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) and run auto-analysis.
|
||||
Newer Ghidra versions introduced an AArch64 decompiler that recognises PAC/BTI stubs and MTE tags, greatly improving analysis of libraries built with the Android 14 NDK.
|
||||
5. **Decide on static vs dynamic reversing:** stripped, obfuscated code often needs *instrumentation* (Frida, ptrace/gdbserver, LLDB).
|
||||
|
||||
---
|
||||
|
||||
### Instrumentação Dinâmica (Frida ≥ 16)
|
||||
### Dynamic Instrumentation (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:
|
||||
Frida’s 16-series trouxe várias melhorias específicas para Android que ajudam quando o alvo usa otimizações modernas do Clang/LLD:
|
||||
|
||||
* `thumb-relocator` agora pode *hook tiny ARM/Thumb functions* geradas pelo alinhamento agressivo do LLD (`--icf=all`).
|
||||
* Enumeração e rebinding de *ELF import slots* funciona no Android, permitindo patching por módulo com `dlopen()`/`dlsym()` quando inline hooks são rejeitados.
|
||||
* A enumeração e rebind de *ELF import slots* funciona no Android, permitindo patching por módulo com `dlopen()`/`dlsym()` quando hooks inline são rejeitados.
|
||||
* Java hooking foi corrigido para o novo **ART quick-entrypoint** usado quando apps são compilados com `--enable-optimizations` no Android 14.
|
||||
|
||||
Exemplo: enumerar todas as funções registradas via `RegisterNatives` e despejar seus endereços em tempo de execução:
|
||||
Example: enumerating all functions registered through `RegisterNatives` and dumping their addresses at runtime:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
var Runtime = Java.use('java.lang.Runtime');
|
||||
@ -61,29 +61,29 @@ console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' met
|
||||
});
|
||||
});
|
||||
```
|
||||
Frida will work out of the box on PAC/BTI-enabled devices (Pixel 8/Android 14+) as long as you use frida-server 16.2 or later – earlier versions failed to locate padding for inline hooks.
|
||||
Frida will work out of the box on PAC/BTI-enabled devices (Pixel 8/Android 14+) as long as you use frida-server 16.2 or later – earlier versions failed to locate o preenchimento para inline hooks.
|
||||
|
||||
### Telemetria JNI local ao processo via .so pré-carregado (SoTap)
|
||||
|
||||
Quando instrumentação completa é exagerada ou bloqueada, você ainda pode obter visibilidade em nível nativo pré-carregando um pequeno logger dentro do processo alvo. SoTap é uma biblioteca nativa Android leve (.so) que registra o comportamento em tempo de execução de outras bibliotecas JNI (.so) dentro do mesmo processo do app (não requer root).
|
||||
Quando uma instrumentação completa é overkill ou bloqueada, você ainda pode obter visibilidade em nível nativo pré-carregando um pequeno logger dentro do processo alvo. SoTap é uma biblioteca nativa Android leve (.so) que registra o comportamento em tempo de execução de outras bibliotecas JNI (.so) dentro do mesmo processo do app (não é necessário root).
|
||||
|
||||
Propriedades principais:
|
||||
- Inicializa cedo e observa interações JNI/nativas dentro do processo que a carrega.
|
||||
- Persiste logs usando múltiplos caminhos graváveis com fallback elegante para Logcat quando o armazenamento é restrito.
|
||||
- Personalizável no código-fonte: edite sotap.c para estender/ajustar o que é registrado e reconstrua por ABI.
|
||||
Principais propriedades:
|
||||
- Inicializa cedo e observa interações JNI/native dentro do processo que a carrega.
|
||||
- Persiste logs usando múltiplos caminhos graváveis com fallback gracioso para Logcat quando o armazenamento está restrito.
|
||||
- Personalizável no código-fonte: edite sotap.c para estender/ajustar o que é registrado e recompile por ABI.
|
||||
|
||||
Configuração (reempacotar o APK):
|
||||
1) Coloque a build para a ABI correta dentro do APK para que o loader consiga resolver libsotap.so:
|
||||
1) Coloque o build ABI apropriado dentro do APK para que o loader possa resolver libsotap.so:
|
||||
- lib/arm64-v8a/libsotap.so (for arm64)
|
||||
- lib/armeabi-v7a/libsotap.so (for arm32)
|
||||
2) Assegure que SoTap seja carregado antes de outras libs JNI. Injete uma chamada cedo (por exemplo, no inicializador estático de uma subclasse de Application ou onCreate) para que o logger seja inicializado primeiro. Exemplo de snippet Smali:
|
||||
2) Garanta que o SoTap seja carregado antes de outras libs JNI. Injete uma chamada cedo (por exemplo, inicializador estático da subclasse Application ou onCreate) para que o logger seja inicializado primeiro. Exemplo de trecho Smali:
|
||||
```smali
|
||||
const-string v0, "sotap"
|
||||
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||
```
|
||||
3) Reconstrua/assine/instale, execute o app e então colete os logs.
|
||||
3) Recompile/assine/instale, execute o app e então colete os logs.
|
||||
|
||||
Caminhos de log (verificados na ordem):
|
||||
Caminhos de log (verificados em ordem):
|
||||
```
|
||||
/data/user/0/%s/files/sotap.log
|
||||
/data/data/%s/files/sotap.log
|
||||
@ -91,46 +91,46 @@ Caminhos de log (verificados na ordem):
|
||||
/sdcard/Download/sotap-%s.log
|
||||
# If all fail: fallback to Logcat only
|
||||
```
|
||||
Notes and troubleshooting:
|
||||
- Alinhamento da ABI é obrigatório. Uma incompatibilidade causará um UnsatisfiedLinkError e o logger não será carregado.
|
||||
- Restrições de armazenamento são comuns em Android modernos; se gravações de arquivo falharem, SoTap ainda emitirá via Logcat.
|
||||
- Comportamento/verbosidade devem ser customizados; reconstrua a partir do código-fonte após editar sotap.c.
|
||||
Notas e solução de problemas:
|
||||
- O alinhamento de ABI é obrigatório. Uma incompatibilidade causará UnsatisfiedLinkError e o logger não será carregado.
|
||||
- Restrições de armazenamento são comuns no Android moderno; se gravações de arquivo falharem, SoTap ainda emitirá via Logcat.
|
||||
- Comportamento/verbosidade deve ser personalizado; reconstrua a partir do código-fonte após editar sotap.c.
|
||||
|
||||
Esta abordagem é útil para triagem de malware e depuração JNI quando observar fluxos de chamadas nativas desde o início do processo é crítico, mas hooks root/system-wide não estão disponíveis.
|
||||
Essa abordagem é útil para triagem de malware e depuração JNI, onde observar fluxos de chamadas nativas desde o início do processo é crítico, mas root/ganchos em todo o sistema não estão disponíveis.
|
||||
|
||||
---
|
||||
|
||||
### Recent vulnerabilities worth hunting for in APKs
|
||||
### Vulnerabilidades recentes que valem a pena procurar em APKs
|
||||
|
||||
| Year | CVE | Affected library | Notes |
|
||||
|------|-----|------------------|-------|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Overflow de buffer no heap alcançável a partir de código nativo que decodifica imagens WebP. Vários apps Android empacotam versões vulneráveis. Quando você encontrar um `libwebp.so` dentro de um APK, verifique sua versão e tente exploração ou patching.| |
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|Heap buffer overflow alcançável a partir de código nativo que decodifica imagens WebP. Vários apps Android empacotam versões vulneráveis. Quando você encontrar um `libwebp.so` dentro de um APK, verifique sua versão e tente exploração ou correção.| |
|
||||
|2024|Multiple|OpenSSL 3.x series|Várias questões de segurança de memória e padding-oracle. Muitos bundles Flutter & ReactNative incluem seu próprio `libcrypto.so`.|
|
||||
|
||||
Quando você spotar arquivos `.so` *de terceiros* dentro de um APK, sempre verifique o hash contra advisories upstream. SCA (Software Composition Analysis) é incomum em mobile, então builds desatualizados e vulneráveis são comuns.
|
||||
Quando você identificar arquivos `.so` de *third-party* dentro de um APK, sempre confira seu hash contra advisories upstream. SCA (Software Composition Analysis) é incomum em mobile, então builds vulneráveis e desatualizados são comuns.
|
||||
|
||||
---
|
||||
|
||||
### Anti-Reversing & Hardening trends (Android 13-15)
|
||||
### Tendências de Anti-Reversing & Hardening (Android 13-15)
|
||||
|
||||
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 habilita PAC/BTI em bibliotecas do sistema em silício ARMv8.3+ suportado. Decompilers agora exibem pseudo-instruções relacionadas a PAC; para análise dinâmica o Frida injeta trampolines *after* stripping PAC, mas seus trampolines customizados devem chamar `pacda`/`autibsp` quando necessário.
|
||||
* **MTE & Scudo hardened allocator:** memory-tagging é opt-in, mas muitos apps com Play-Integrity são compilados com `-fsanitize=memtag`; use `setprop arm64.memtag.dump 1` plus `adb shell am start ...` para capturar tag faults.
|
||||
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** packers comerciais (e.g., Bangcle, SecNeo) protegem cada vez mais o código *nativo*, não só Java; espere control-flow falso e blobs de strings criptografadas em `.rodata`.
|
||||
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 habilita PAC/BTI em system libraries em silicon ARMv8.3+ suportado. Decompiladores agora mostram pseudo-instruções relacionadas a PAC; para análise dinâmica o Frida injeta trampolines *após* remover o PAC, mas seus trampolines customizados devem chamar `pacda`/`autibsp` quando necessário.
|
||||
* **MTE & Scudo hardened allocator:** a marcação de memória (memory-tagging) é opt-in, mas muitos apps compatíveis com Play-Integrity são buildados com `-fsanitize=memtag`; use `setprop arm64.memtag.dump 1` mais `adb shell am start ...` para capturar tag faults.
|
||||
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** packers comerciais (ex.: Bangcle, SecNeo) protegem cada vez mais código *native*, não apenas Java; espere fluxo de controle falso e blobs de strings criptografadas em `.rodata`.
|
||||
|
||||
---
|
||||
|
||||
### Resources
|
||||
|
||||
- **Aprendendo ARM Assembly:** [Azeria Labs – ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
|
||||
- **Documentação JNI & NDK:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](https://developer.android.com/ndk/guides/)
|
||||
- **Depuração de bibliotecas nativas:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||
- **Learning ARM Assembly:** [Azeria Labs – ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
|
||||
- **JNI & NDK Documentation:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](https://developer.android.com/ndk/guides/)
|
||||
- **Debugging Native Libraries:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||
|
||||
### References
|
||||
|
||||
- Changelog do Frida 16.x (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/)
|
||||
- Aviso NVD para `libwebp` overflow CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
|
||||
- SoTap: Logger leve in-app de comportamento JNI (.so) – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
- Releases do SoTap – [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases)
|
||||
- Como trabalhar com SoTap? – [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13)
|
||||
- Aviso NVD para overflow de `libwebp` CVE-2023-4863 – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
|
||||
- SoTap: Lightweight in-app JNI (.so) behavior logger – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
- SoTap Releases – [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases)
|
||||
- How to work with SoTap? – [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,13 +1,13 @@
|
||||
# Smali - Decompilando/[Modificando]/Compilando
|
||||
# Smali - Decompiling/[Modifying]/Compiling
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
Às vezes é interessante modificar o código da aplicação para acessar informações ocultas para você (talvez senhas bem ofuscadas ou flags). Então, pode ser interessante decompilar o apk, modificar o código e recompilá-lo.
|
||||
Às vezes é interessante modificar o código do aplicativo para acessar informações ocultas para você (talvez senhas bem ofuscadas ou flags). Então, pode ser interessante decompilar o apk, modificar o código e recompilá-lo.
|
||||
|
||||
**Referência de opcodes:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
|
||||
## Maneira Rápida
|
||||
## Maneira rápida
|
||||
|
||||
Usando **Visual Studio Code** e a extensão [APKLab](https://github.com/APKLab/APKLab), você pode **decompilar automaticamente**, modificar, **recompilar**, assinar e instalar o aplicativo sem executar nenhum comando.
|
||||
|
||||
@ -15,43 +15,43 @@ Outro **script** que facilita muito essa tarefa é [**https://github.com/ax/apk.
|
||||
|
||||
## Decompilar o APK
|
||||
|
||||
Usando APKTool você pode acessar o **smali code and resources**:
|
||||
Usando o APKTool você pode acessar o **smali code and resources**:
|
||||
```bash
|
||||
apktool d APP.apk
|
||||
```
|
||||
Se **apktool** lhe der algum erro, tente[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
If **apktool** gives you any error, try[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
Alguns **arquivos interessantes que você deve verificar são**:
|
||||
Some **interesting files you should look are**:
|
||||
|
||||
- _res/values/strings.xml_ (e todos os xmls dentro de res/values/*)
|
||||
- _res/values/strings.xml_ (and all xmls inside res/values/*)
|
||||
- _AndroidManifest.xml_
|
||||
- Qualquer arquivo com extensão _.sqlite_ ou _.db_
|
||||
- Any file with extension _.sqlite_ or _.db_
|
||||
|
||||
Se `apktool` tiver **problemas ao decodificar a aplicação** consulte [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) ou tente usar o argumento **`-r`** (Não decodificar recursos). Então, se o problema estava em um recurso e não no código-fonte, você não terá o problema (você também não decompilará os recursos).
|
||||
If `apktool` has **problems decoding the application** take a look to [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) or try using the argument **`-r`** (Do not decode resources). Then, if the problem was in a resource and not in the source code, you won't have the problem (you won't also decompile the resources).
|
||||
|
||||
## Alterar código smali
|
||||
## Change smali code
|
||||
|
||||
Você pode **alterar** **instruções**, alterar o **valor** de algumas variáveis ou **adicionar** novas instruções. Eu altero o código Smali usando [**VS Code**](https://code.visualstudio.com), em seguida instalo a **smalise extension** e o editor dirá se alguma **instrução estiver incorreta**.\
|
||||
Alguns **exemplos** podem ser encontrados aqui:
|
||||
You can **change** **instructions**, change the **value** of some variables or **add** new instructions. I change the Smali code using [**VS Code**](https://code.visualstudio.com), you then install the **smalise extension** and the editor will tell you if any **instruction is incorrect**.\
|
||||
Some **examples** can be found here:
|
||||
|
||||
- [Smali changes examples](smali-changes.md)
|
||||
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
|
||||
Ou você pode [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
|
||||
Or you can [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
|
||||
|
||||
## Recompile the APK
|
||||
|
||||
Após modificar o código você pode **recompilar** o código usando:
|
||||
After modifying the code you can **recompile** the code using:
|
||||
```bash
|
||||
apktool b . #In the folder generated when you decompiled the application
|
||||
```
|
||||
Ele vai **compile** o novo APK **inside** a pasta _**dist**_.
|
||||
Isso irá **compilar** o novo APK **dentro** da pasta _**dist**_.
|
||||
|
||||
Se o **apktool** lançar um **erro**, tente[ instalar a **última versão**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
Se o **apktool** lançar um **erro**, tente[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
### **Assinar o novo APK**
|
||||
|
||||
Então, você precisa **gerar uma chave** (será solicitado uma senha e algumas informações que você pode preencher aleatoriamente):
|
||||
Então, você precisa **gerar uma chave** (você será solicitado a fornecer uma senha e algumas informações que pode preencher aleatoriamente):
|
||||
```bash
|
||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
||||
```
|
||||
@ -61,14 +61,14 @@ jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
||||
```
|
||||
### Otimizar nova aplicação
|
||||
|
||||
**zipalign** é uma ferramenta de alinhamento de arquivos que otimiza arquivos de aplicações Android (APK). [More information here](https://developer.android.com/studio/command-line/zipalign).
|
||||
**zipalign** é uma ferramenta de alinhamento de arquivos que fornece otimizações importantes para Android application (APK) files. [Mais informações aqui](https://developer.android.com/studio/command-line/zipalign).
|
||||
```bash
|
||||
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
||||
zipalign -v 4 infile.apk
|
||||
```
|
||||
### **Assinar o novo APK (de novo?)**
|
||||
### **Assine o novo APK (de novo?)**
|
||||
|
||||
Se você **prefere** usar [**apksigner**](https://developer.android.com/studio/command-line/) em vez de jarsigner, **você deve assinar o apk** depois de aplicar **a otimização com** zipaling. MAS NOTE QUE VOCÊ SÓ PRECISA **ASSINAR A APLICAÇÃO UMA VEZ** COM jarsigner (antes do zipalign) OU COM aspsigner (após zipaling).
|
||||
Se você **prefere** usar [**apksigner**](https://developer.android.com/studio/command-line/) em vez de jarsigner, **você deve assinar o apk** depois de aplicar **a otimização com** zipaling. MAS NOTE QUE VOCÊ SÓ PRECISA **ASSINAR A APLICAÇÃO UMA VEZ** COM jarsigner (antes do zipalign) OU COM aspsigner (depois do zipaling).
|
||||
```bash
|
||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||
```
|
||||
@ -80,7 +80,7 @@ public static void printHelloWorld() {
|
||||
System.out.println("Hello World")
|
||||
}
|
||||
```
|
||||
O código Smali seria:
|
||||
O Smali code seria:
|
||||
```java
|
||||
.method public static printHelloWorld()V
|
||||
.registers 2
|
||||
@ -90,11 +90,11 @@ invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
|
||||
return-void
|
||||
.end method
|
||||
```
|
||||
The Smali instruction set is available [aqui](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||
O conjunto de instruções Smali está disponível [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||
|
||||
### Alterações leves
|
||||
|
||||
### Modificar valores iniciais de uma variável dentro de uma função
|
||||
### Modificar os valores iniciais de uma variável dentro de uma função
|
||||
|
||||
Algumas variáveis são definidas no início da função usando o opcode _const_, você pode modificar seus valores, ou pode definir novas:
|
||||
```bash
|
||||
@ -104,7 +104,7 @@ const/4 v8, 0x1
|
||||
#Strings
|
||||
const-string v5, "wins"
|
||||
```
|
||||
### Operações Básicas
|
||||
### Operações básicas
|
||||
```bash
|
||||
#Math
|
||||
add-int/lit8 v0, v2, 0x1 #v2 + 0x1 and save it in v0
|
||||
@ -127,9 +127,9 @@ iput v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save v0 inside
|
||||
if-ne v0, v9, :goto_6 #If not equals, go to: :goto_6
|
||||
goto :goto_6 #Always go to: :goto_6
|
||||
```
|
||||
### Mudanças Maiores
|
||||
### Alterações maiores
|
||||
|
||||
### Logging
|
||||
### Registro
|
||||
```bash
|
||||
#Log win: <number>
|
||||
iget v5, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Get this.o inside v5
|
||||
@ -138,19 +138,19 @@ move-result-object v1 #Move to v1
|
||||
const-string v5, "wins" #Save "win" inside v5
|
||||
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"
|
||||
```
|
||||
Recomendações:
|
||||
Recommendations:
|
||||
|
||||
- Se você for usar variáveis declaradas dentro da função (declaradas v0,v1,v2...) coloque essas linhas entre _.local <number>_ e as declarações das variáveis (_const v0, 0x1_)
|
||||
- Se quiser colocar o código de logging no meio do código de uma função:
|
||||
- Se você quiser inserir o código de logging no meio do código de uma função:
|
||||
- Adicione 2 ao número de variáveis declaradas: Ex: de _.locals 10_ para _.locals 12_
|
||||
- As novas variáveis devem ser os próximos números das variáveis já declaradas (neste exemplo devem ser _v10_ e _v11_, lembre-se que começa em v0).
|
||||
- As novas variáveis devem ser os números seguintes das já declaradas (neste exemplo devem ser _v10_ e _v11_, lembre-se que começa em v0).
|
||||
- Altere o código da função de logging e use _v10_ e _v11_ em vez de _v5_ e _v1_.
|
||||
|
||||
### Exibindo Toast
|
||||
|
||||
Lembre-se de adicionar 3 ao número de _.locals_ no início da função.
|
||||
|
||||
Este código está preparado para ser inserido no **meio de uma função** (**altere** o número das **variáveis** conforme necessário). Ele irá pegar o **valor de this.o**, **transformá-lo** em **String** e então **fazer** um **toast** com seu valor.
|
||||
Este código está preparado para ser inserido no **meio de uma função** (**altere** o número das **variáveis** conforme necessário). Ele pegará o **valor de this.o**, **transformará** em **String** e então **fará** um **toast** com seu valor.
|
||||
```bash
|
||||
const/4 v10, 0x1
|
||||
const/4 v11, 0x1
|
||||
@ -162,9 +162,9 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
|
||||
move-result-object v12
|
||||
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
|
||||
```
|
||||
### Carregando uma Biblioteca Nativa na Inicialização (System.loadLibrary)
|
||||
### Carregar uma Biblioteca Nativa na Inicialização (System.loadLibrary)
|
||||
|
||||
Às vezes você precisa pré-carregar uma biblioteca nativa para que ela seja inicializada antes de outras JNI libs (por exemplo, para habilitar process-local telemetry/logging). Você pode injetar uma chamada para System.loadLibrary() em um inicializador estático ou no início de Application.onCreate(). Exemplo smali para um inicializador estático de classe (<clinit>):
|
||||
Às vezes você precisa pré-carregar uma biblioteca nativa para que ela seja inicializada antes de outras libs JNI (por exemplo, para habilitar telemetry/logging local do processo). Você pode injetar uma chamada para System.loadLibrary() em um inicializador estático ou no início de Application.onCreate(). Exemplo smali para um inicializador de classe estático (<clinit>):
|
||||
```smali
|
||||
.class public Lcom/example/App;
|
||||
.super Landroid/app/Application;
|
||||
@ -176,7 +176,7 @@ invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||
return-void
|
||||
.end method
|
||||
```
|
||||
Alternativamente, coloque as mesmas duas instruções no início do seu Application.onCreate() para garantir que a biblioteca seja carregada o mais cedo possível:
|
||||
Como alternativa, coloque as mesmas duas instruções no início do seu Application.onCreate() para garantir que a biblioteca seja carregada o mais cedo possível:
|
||||
```smali
|
||||
.method public onCreate()V
|
||||
.locals 1
|
||||
@ -190,10 +190,10 @@ return-void
|
||||
```
|
||||
Notas:
|
||||
- Certifique-se de que a variante ABI correta da biblioteca exista em lib/<abi>/ (por exemplo, arm64-v8a/armeabi-v7a) para evitar UnsatisfiedLinkError.
|
||||
- Carregar muito cedo (class static initializer) garante que o native logger possa observar a atividade JNI subsequente.
|
||||
- O carregamento muito cedo (class static initializer) garante que o logger nativo possa observar a atividade JNI subsequente.
|
||||
|
||||
## Referências
|
||||
|
||||
- SoTap: registrador leve in-app de comportamento JNI (.so) – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
- SoTap: Logger leve in-app de comportamento JNI (.so) – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user