Dna é uma estrutura de análise binária estática construída sobre o LLVM. Notavelmente, está escrito quase inteiramente em C#, incluindo ligações gerenciadas para LLVM, Remill e Souper.
Dna implementa uma reconstrução do gráfico de fluxo de controle iterativo inspirado fortemente pelo papel de Saturno. Ele aplica iterativamente a descida recursiva, levantamento (usando remill) e resolução de caminho até que o gráfico de fluxo de controle completo seja recuperado. No caso das tabelas de salto, usamos um algoritmo recursivo baseado em Souper e Z3 para resolver o conjunto de possíveis alvos de mesa de salto. Você pode encontrar o algoritmo de exploração iterativo aqui e o algoritmo de solução de mesa de salto aqui.
Depois que um gráfico de fluxo de controle é totalmente explorado, ele pode ser recompilado ao x86 e reinserido no binário usando os algoritmos daqui e daqui. Embora o código compilado não seja bonito, ele deve ser executado enquanto o gráfico de fluxo de controle recuperado estiver correto. Dito isto, ainda é um protótipo de pesquisa - os casos de bugs e borda são esperados. A exploração do gráfico de fluxo de controle pode falhar no caso de mesas de salto ilimitado ou instruções inacessíveis.
Alguns outros recursos notáveis:
try / catch instruções e filter Intrinsics são inseridos no gráfico de fluxo de controle. Embora o recompilador ainda não suportasse o SEH (as entradas do SEH não são corrigidas), as exceções causam falhas.MemorySSA , LoopInfo , árvores de dominador, gerenciamento de oleodutos, etc.Algumas advertências:
Observe que Dna é atualmente baseado no LLVM 17.
Dna não será construído para fora da caixa. Patches personalizados para remilhar e Souper eram necessários para que isso se baseasse no Windows. Se você deseja trabalhar no DNA, abra um problema ou envie um e -mail para [email protected] . Em algum momento, posso publicar etapas adequadas de construção, mas não tenho garantias.