
Framework de análisis estático de binarios basado en LLVM
Dna es un framework de análisis binario estático construido sobre LLVM. Cabe destacar que está escrito casi en su totalidad en C#, incluyendo enlaces administrados para LLVM, Remill y Souper.
Dna implementa una reconstrucción iterativa del grafo de flujo de control fuertemente inspirada en el artículo SATURN. Aplica de forma iterativa descenso recursivo, elevación (usando remill) y resolución de caminos hasta que se recupera el grafo de flujo de control completo. En el caso de tablas de salto, utilizamos un algoritmo recursivo basado en Souper y z3 para resolver el conjunto de posibles destinos de la tabla de salto. Puede encontrar el algoritmo de exploración iterativa aquí, y el algoritmo de resolución de tablas de salto aquí.
Una vez que se ha explorado completamente un grafo de flujo de control, se puede recompilar a x86 y reinsertar en el binario utilizando los algoritmos de aquí y aquí. Aunque el código compilado no es bonito en absoluto, debería ejecutarse siempre que el grafo de flujo de control recuperado sea correcto. Dicho esto, sigue siendo un prototipo de investigación: se esperan errores y casos extremos. La exploración del grafo de flujo de control puede fallar en casos como, por ejemplo, tablas de salto no acotadas o instrucciones no elevables.
Otras características notables:
try/catch y las intrínsecas filter. Sin embargo, el recompilador aún no soporta SEH (las entradas SEH no se corrigen), por lo que las excepciones causarán fallos.MemorySSA, LoopInfo, árboles de dominancia, gestión de la canalización de pases, etc.Algunas advertencias:
Tenga en cuenta que Dna actualmente está basado en LLVM 17.
Dna contiene un plugin de desvirtualización de VMProtect ubicado en Dna.BinaryTranslator/VMProtect. Consulte este PR para obtener más información.
Dna actualmente apunta a LLVM 17 y se espera que se compile en Windows x64 con Visual Studio 2022.
Compile Dna.LLVMInterop en modo Release; el árbol de dependencias nativas está compilado en Release y no se admiten compilaciones de interoperabilidad en Debug.
Ejecute los comandos a continuación desde un shell de desarrollador de VS x64, u otro shell con las herramientas C++ de VS en PATH.
La supercompilación de dependencias instala LLVM 17, Remill, Z3, XED, gflags/glog y las bibliotecas nativas relacionadas en Dna.LLVMInterop/dependencies/install.
cmake -S Dna.LLVMInterop/dependencies `
-B Dna.LLVMInterop/dependencies/build `
-G Ninja `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_C_COMPILER=clang-cl `
-DCMAKE_CXX_COMPILER=clang-cl
cmake --build Dna.LLVMInterop/dependencies/build
Si cambia el compilador, el tipo de compilación o la configuración de CRT, elimine tanto Dna.LLVMInterop/dependencies/build como Dna.LLVMInterop/dependencies/install antes de reconfigurar.
Dna.Example y los proyectos simplificadores copian eq_sat.dll desde la salida de la versión de Cargo.
cargo build --manifest-path Simplifier/EqSat/Cargo.toml --release
& "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" `
Dna.sln `
/restore `
/p:Configuration=Release `
/p:Platform=x64 `
/m