Dna es un marco de análisis binario estático construido sobre LLVM. En particular, se escribe casi por completo en C#, incluidas las enlaces administrados para LLVM, Remill y Souper.
Dna implementa una reconstrucción del gráfico de flujo de control iterativo inspirada en gran medida por el papel de Saturno. Se aplica iterativamente el descenso recursivo, el levantamiento (usando la remilla) y la resolución de ruta hasta que se recupere el gráfico de flujo de control completo. En el caso de las tablas de salto, utilizamos un algoritmo recursivo basado en Souper y Z3 para resolver el conjunto de posibles objetivos de mesa de salto. Puede encontrar el algoritmo de exploración iterativo aquí, y el algoritmo de resolución de la mesa de salto aquí.
Una vez que se ha explorado completamente un gráfico de flujo de control, se puede recompilar a X86 y volver a insertar en el binario usando los algoritmos de aquí y aquí. Aunque el código compilado no es bonito de ninguna manera, debe ejecutarse siempre que el gráfico de flujo de control recuperado sea correcto. Dicho esto, sigue siendo un prototipo de investigación: se esperan casos de errores y bordes. La exploración del gráfico de flujo de control puede fallar en el caso de las tablas de salto ilimitadas por ejemplo o instrucciones no dentables.
Algunas otras características notables:
try / catch y las intrínsecos filter se insertan en el gráfico de flujo de control. Aunque el recompilador no admite (todavía) SEH (las entradas SEH no están fijadas), por lo que las excepciones causarán bloqueos.MemorySSA , LoopInfo , Dominator Trees, Pass Wipeline Management, etc.Algunas advertencias:
Tenga en cuenta que Dna se basa actualmente en LLVM 17.
Dna no se construirá fuera de la caja. Se necesitaban parches personalizados para remillar y souper para que esto se construya en Windows. Si desea trabajar en el ADN, abra un problema o envíeme un correo electrónico [email protected] . En algún momento puedo publicar pasos de compilación adecuados, pero no doy garantías.