
Plugin Binary Ninja para analisar e simplificar código ofuscado
Autores: Tim Blazytko & Nicolò Altamura
Analise e simplifique código ofuscado
Obfuscation Analysis é um plugin do Binary Ninja que elimina a dor de trabalhar com binários fortemente protegidos. Ele reúne alguns auxiliares focados que permitem
Alguns exemplos de casos de uso podem ser encontrados em examples. Além disso, a palestra da REcon "Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications" demonstra alguns casos de uso. Os slides podem ser encontrados aqui. O plugin complementa o Obfuscation Detection: uma vez que funções suspeitas são sinalizadas, Obfuscation Analysis ajuda você a limpá-las e entendê-las. Mais auxiliares serão adicionados com o tempo.
A ferramenta pode ser instalada usando o gerenciador de plugins do Binary Ninja.
Para uma instalação manual, siga estes passos na pasta de plugins do Binary Ninja:
git clone https://github.com/mrphrazer/obfuscation_analysis.git
cd obfuscation_analysis
# optionally: use a virtual environment
python -m venv obfana-env
source obfana-env/bin/activate
# install requirements
pip install -r requirements.txt
Se você usar um ambiente virtual, precisará definir manualmente o caminho de site-packages nas configurações do Binary Ninja.
O plugin está disponível no menu da barra superior do Binary Ninja em Plugins -> Obfuscation Analysis.
Para simplificar a ofuscação aritmética, primeiro destaque a expressão HLIL que você deseja simplificar na visão do descompilador. Em seguida, escolha Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify. O plugin resolve a computação completa, a executa através do msynth e insere o resultado simplificado como um comentário na mesma linha. A animação curta abaixo mostra todo o fluxo de trabalho:
A simplificação de MBA depende do msynth. Por padrão, o plugin usa o oráculo de simplificação padrão do msynth, que acompanha o plugin e já vem pré-configurado. Se você quiser usar um oráculo maior ou personalizado, defina obfuscation_analysis.mba_oracle_path manualmente ou navegue até o arquivo na janela de Configurações do Binary Ninja.
Se algo der errado, o plugin escreve uma mensagem concisa ao usuário no painel de Log; mude a visualização do log para Debug para ver o rastreamento completo.
O plugin traz auxiliares focados que visam obstáculos comuns que você encontra ao fazer engenharia reversa de binários protegidos, cada um executável como uma tarefa em segundo plano a partir da interface ou de scripts head-less. Abaixo estão os recursos atualmente disponíveis.
Funções Corrompidas são funções cuja desmontagem mostra artefatos indefinidos—blocos básicos vazios, instruções inválidas ou sobrepostas, e similares. Este auxiliar percorre todo o BinaryView, sinaliza funções com esses sintomas e as lista de forma que o analista possa inspecionar rapidamente código que foi mal interpretado ou deliberadamente ofuscado. Uma ação opcional de remoção apaga cada função sinalizada e força uma nova análise, limpando a lista de funções. É particularmente útil para localizar
Aritmética Mista-Booleana (MBA) é uma técnica de ofuscação que enterra computações simples em longas cadeias de operações aritméticas e booleanas. Este recurso simplifica tais expressões no descompilador. Quando você escolhe uma instrução HLIL, o plugin coleta sua cadeia de computação completa com um slice reverso de SSA restrito ao bloco básico atual, traduz esse slice para Miasm IR, o alimenta no msynth e, finalmente, adiciona o resultado simplificado como um comentário na visão do descompilador. Este recurso permite que você
Para a função atualmente selecionada, este auxiliar embute recursivamente cada função chamada dentro da visão do descompilador, dando ao Binary Ninja uma IL única e autocontida. Com todas as fronteiras removidas, o descompilador pode propagar dados entre funções, permitindo dobramento de constantes mais profundo, eliminação de código morto e lógica geralmente mais clara. Use-o para
Observe que o HLIL pode se tornar muito grande e lento para renderizar em funções muito grandes ou árvores de chamadas profundas. Além disso, algumas otimizações do descompilador podem ser menos eficazes depois que tudo é mesclado em uma única unidade. Para controlar isso, você pode limitar a profundidade de embutimento: defina Settings -> Obfuscation Analysis -> Max Function Inlining Depth para um limite superior N (por padrão definido como 1). Com um limite de profundidade, apenas os primeiros N níveis de chamada são embutidos; chamadas mais profundas não são embutidas.
O plugin tem algumas ressalvas que você deve conhecer, a maioria delas relacionada ao pipeline de simplificação de MBA:
bug do Binary Ninja: no BN 5.0 stable, o passo de slicing reverso pode falhar por causa de type-casts de HLIL ausentes: https://github.com/Vector35/binaryninja-api/issues/6371; o problema é corrigido em 5.1.7477-de e versões mais recentes
slice confinado a um bloco básico: definições de variáveis localizadas em blocos predecessores são ignoradas (frequentemente dependentes de fluxo de controle), então alguns termos de MBA podem permanecer parcialmente resolvidos
lacunas de tradução de HLIL para Miasm IR: nem toda construção HLIL tem um equivalente sólido em Miasm; quando a tradução falha, a expressão é ignorada e um erro é registrado
cobertura de IL: nós de fluxo de controle e operações de ponto flutuante atualmente não são traduzidos
restrições herdadas do msynth : a simplificação de MBA herda todas as limitações do msynth
Para mais informações, entre em contato com Tim Blazytko (@mr_phrazer) ou Nicolò Altamura (@nicolodev).