
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: