
Plugin do Binary Ninja para identificar código ofuscado e outras construções de código interessantes
Autor: Tim Blazytko
Detecta automaticamente código ofuscado e outras construções de código interessantes
Obfuscation Detection é um plugin do Binary Ninja para detectar código ofuscado e construções de código interessantes (ex.: máquinas de estado) em binários. Dado um binário, o plugin facilita a análise ao identificar locais de código que podem merecer uma análise mais aprofundada durante a engenharia reversa.
Baseado em várias heurísticas, o plugin identifica funções que contêm construções de código complexas ou incomuns. Essas construções de código podem implementar:
Os seguintes posts de blog fornecem mais informações sobre as heurísticas subjacentes e demonstram seus casos de uso:
Alguns exemplos de uso podem ser encontrados em exemplos. Além disso, a palestra do REcon "Unveiling Secrets in Binaries using Code Detection Strategies" demonstra alguns casos de uso. Os slides podem ser encontrados aqui; a gravação pode ser encontrada aqui.
A ferramenta pode ser instalada usando o gerenciador de plugins do Binary Ninja.
Para a versão headless, siga estes passos:
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# instalar obfuscation_detection
pip install .
O plugin pode ser usado na interface do usuário e no modo headless.
Escolha Plugins -> Obfuscation Detection para executar heurísticas individuais, ou Plugins -> Obfuscation Detection -> Utils para executar detecções de utilitários individuais. O comando Plugins -> Obfuscation Detection -> All executa todas as heurísticas e todos os utilitários juntos.
Os resultados são exibidos na janela de Log:
Ao clicar nos endereços de funções identificadas, o Binary Ninja navega para a função selecionada.
Para usar o plugin em modo headless, execute scripts/detect_obfuscation.py:
$ python3 scripts/detect_obfuscation.py <binário>
Isso executa todas as heurísticas e todos os utilitários. Para saída legível por máquina, use --json:
$ python3 scripts/detect_obfuscation.py --json <binário>
O payload JSON contém todos os resultados sob a chave detections. Cada detecção possui um id estável para automação e um name legível por humanos. Cada achado de função marcada inclui o tipo de tag e a descrição usada pelo plugin do Binary Ninja.
Para executar apenas a heurística de máquina de estado em modo headless, use scripts/detect_state_machine.py:
$ python3 scripts/detect_state_machine.py [--json] <binário>
O plugin implementa várias heurísticas de detecção para detectar diferentes construções de código. A seguir, descrevemos brevemente as heurísticas individuais e explicamos seu uso.
A heurística de bloco básico grande identifica as 10% principais funções com o maior número médio de instruções por bloco básico. Permite detectar:
A heurística de função complexa identifica as 10% principais funções com os grafos de fluxo de controle mais complexos (com base na complexidade ciclomática). Permite identificar:
A heurística de máquina de estado usa propriedades teóricas de grafos para identificar funções que implementam máquinas de estado. Geralmente, essas máquinas de estado podem ser representadas como instruções switch que são despachadas em um loop. A heurística permite identificar:
A heurística de sequência de instruções incomum realiza uma análise estatística para identificar as 10% principais funções cujos padrões de código se desviam de uma referência pré-computada. Dessa forma, a heurística permite identificar:
A heurística de instrução sobreposta identifica funções com instruções desalinhadas (bytes de instrução são compartilhados por duas instruções diferentes). A heurística identifica:
Se a heurística for usada na interface do usuário do Binary Ninja, as instruções sobrepostas também são destacadas na visualização de grafo.
A heurística de função mais chamada identifica as 10% principais funções com o maior número de chamadas de diferentes funções. Dessa forma, a heurística pode identificar:
A heurística identifica funções com um alto número de loops. Esses tipos de funções podem implementar:
A heurística também ajuda a identificar possíveis gargalos de desempenho.
A heurística identifica funções com estruturas de loop raras e complexas que geralmente sugerem:
A heurística identifica funções que realizam uma operação XOR com uma constante dentro de um loop. Dessa forma, a heurística pode identificar:
A heurística identifica funções nas quais as expressões têm mais de uma operação aritmética e uma operação booleana simultaneamente. Dessa forma, a heurística pode identificar:
A heurística usa uma abordagem iterativa de hashing de contexto para detectar estruturas de múltiplos blocos repetidas dentro do grafo de fluxo de controle de cada função. Ao comparar a assinatura de opcode de cada bloco junto com as assinaturas de seus sucessores, a heurística identifica subgrafos que são duplicados ou quase duplicados em uma única função. Isso ajuda a identificar:
O plugin também inclui utilitários mais específicos para funções e regiões de código interessantes. Eles permanecem disponíveis no submenu Utils; o comando All os executa junto com as heurísticas mais amplas.
Este utilitário identifica funções sem chamadores conhecidos. Essas funções podem ser:
Este utilitário identifica funções que não chamam outras funções. Esses tipos de funções podem, por exemplo, ser funções que:
Este utilitário identifica funções recursivas — funções que chamam a si mesmas direta ou indiretamente. Funções recursivas podem indicar:
Este utilitário avalia a entropia de cada seção. Entropia é uma medida estatística de aleatoriedade com valores variando entre 0 e 8. Seções com entropia próxima de 8 indicam um alto grau de aleatoriedade e podem sugerir:
Este utilitário detecta implementações potenciais do algoritmo RC4 empregando marcadores heurísticos tipicamente associados ao Algoritmo de Agendamento de Chaves (KSA) e ao Algoritmo de Geração Pseudo-Aleatória (PRGA) do RC4. O RC4 é amplamente usado em malware para fins como:
Para mais informações, entre em contato com @mr_phrazer.