Desobsfuscação do Android - Parte 1
O código desobsfuscante de aplicativos Android pode ser feito usando várias ferramentas como:
- § Simplify
- § JavaDeObfuscator JDO
- § Dex-oracle
- § Androguard – androapkinfo.py
As estratégias de desobsfusação são de dois critérios como:
- Correspondência de padrões – usando dexoracle, androguard, JavaDeObfuscator
- Execução Virtual – utilizando smalivm + simplify
Tipos de ofuscação:
- Remapeando Identificador
- Criptografia literal
- White noise (Ruído branco)
- Packers
I. Remapeando Identificador
- Nomes de classe Ø
- Nomes do método Ø
- Nomes variáveis Ø
- Ø ProGuard repesca e tira informações de depuração
- Ø ProGuard mais comum e fraco
- § Tais como classes renomeadas em ordem alfabética durante a ofuscação
- § Os nomes dos membros não mudaram ou não usaram configurações agressivas do ProGuard durante a ofuscação[ex: int final estático privado JPEG_ENCODING_QUALITY]
- § Parâmetros/nomes de variáveis locais removidos durante a ofuscação [ex: (params)]
- § Métodos renomeados durante a ofuscação[ex: c();]
II. Criptografia literal:
- Strings Ø, números, cargas de matriz
- Ø Original substituído por versão criptografada e chamada para método de descriptografia
- Ø Ou substituído pelo método de pesquisa
III. Ruído branco:
- Ø Muitas operações inúteis ou chamadas de método
- Ø Sem efeitos colaterais diretos ou indiretos fora do método
- Ø não modifica o estado de classe
- Sem I/O (arquivo, rede)
- Não afeta o valor de retorno
- Ex: x=5; 1+2+3*4/5%8; retorno x;
- Ø Valores nunca utilizados: ex: novo Integer(0).intValue();<-valores nunca usados dentro do método ou código
IV. Packers:
- Ø ORIGINAL DEX substituído por desembalador DEX
- Ø Original DEX é geralmente criptografado e escondido em APK
- Ø Descriptografa e carrega DEX no tempo de execução
- Ex: Bangcle (SecNeo), APKProtect, Qihoo
Simplify - Generic Android DeObfuscator:
Simplify aplica otimizações como propagação constante, remoção de código morto, retração e otimizações específicas do olho mágico. As otimizações são bastante simples, mas quando aplicadas em conjunto e em sucessão, podem descriptografar strings, descascar camadas de ofuscação e simplificar muito o código.
Simplify a ferramenta funciona muito apenas em plataformas Linux e ferramenta simplificadora integrada com Vezir Linux VM, Santako Linux VM desenvolvido especialmente para testes de aplicativos móveis android com todas as ferramentas como Apktool, dex2jar, smali, baksmali, JD-GUI, Jadx, Androguard, Androbugs framework, eclipse, enjarify, sqlmap, gerente AVD, laboratórios vulneráveis para a prática.
Ferramenta disponível em -> http://github.com/CalebFenton/simplify
Instalação:
Como este projeto contém submodules para frameworks Android, ou clone com –recursivo:
git clone --https://github.com/CalebFenton/simplify.git recursiva
Ou atualizar submodules a qualquer momento com:
git submodule atualização --init --recursivo
Então, para o build de um único jar:
./gradlew fatjar
O Simplify jar estará em simplificar/construir/libs/simplificar.jar. Você pode testar que está funcionando simplificando o aplicativo de exemplo ofuscado:
java -jar simplify/build/libs/simplify.jar -it 'org/cf' simplify/obfuscated-example
Solucionando problemas:
Simplificar está em estágios iniciais de desenvolvimento. Se você encontrar um fracasso, tente essas recomendações, em ordem:
- Inclua apenas alguns métodos ou classes com -it.
- Se a falha for devido ao máximo de visitas excedidas, tente usar visitas mais altas –max-address-visits, -max-call-depth e –max-method-visits.
- Tente com -v ou -v 2 e informe o problema com os registros.
- Tente novamente, mas não quebre o contato visual. Simplificar pode sentir medo.
Uso:
Etiqueta 1: Após a instalação da simplificação, tente usar o comando abaixo mencionado para verificar a instalação adequada.
Etiqueta 2: Este é o comando para desobsfumar usando simplificar com os arquivos smali descompilados de um APK.
Etiqueta 3: A saída da ferramenta Simplificar para a aplicação será neste formulário.
Etiqueta 4: A saída será na forma de arquivo .dex residido no caminho ‘simplificar/simplificar/construir/libs’
Etiqueta 5: Existem inúmeras maneiras de extrair os arquivos smali e aqui é usado com “Baksmali” com o arquivo .dex como entrada da saída que o pegamos de simplificar.
Etiqueta 6: Compare os arquivos smali de código ofuscado e desobsfuscado do arquivo APK usando gedit ou qualquer ferramenta de editor de texto.
Etiqueta 7: O primeiro ponto a ser relatado e observado é que a **remoção do código Dead, substituiu o valor do parâmetro original e os nomes do método e o método Não refletado.
Remoção de código morto:
O código está morto se removê-lo não pode alterar o comportamento do aplicativo. O caso mais óbvio é se o código é inalcançável, por exemplo, se (falso) { // morto }). Se o código for alcançável, ele pode ser considerado morto se não afetar nenhum estado fora do método, ou seja, não tem efeito colateral.
a Código nãousado (código morto) adicionado durante a ofuscação ou seja, o código smali na imagem é extraído do arquivo apk original.
(b) Código não usado (remoção de código morto) durante a DeObfuscação usando a ferramenta simplificada.
Propagação constante:
Se uma operação colocar um valor de um tipo que pode ser transformado em uma constante, como uma sequência, número ou booleano, essa otimização substituirá essa operação pela constante. Por exemplo:
c Nomes de parâmetros e nomes de funções na aplicação ofuscada de APK
d Os nomes originais de parâmetro e método usados no APK revelados durante o DeObfuscation usando a ferramenta Simplificar
Unreflection:
Um grande desafio com a análise estática de Java é a reflexão. Só não é possível saber que os argumentos são para métodos de reflexão sem fazer uma análise cuidadosa do fluxo de dados.
e O código Smali tem alguns métodos refletidos usados no código APK para dificultar a compreensão do código após a engenharia reversa, ou seja, para fazer APK codificado
f ‘Simplificar’ removeu os métodos não refletados dos arquivos smali para melhor compreensão do fluxo de processos.
Autor: Kailesh Manoharan