
Framework d'analyse binaire statique basé sur LLVM
Dna est un framework d'analyse statique de binaires construit sur LLVM. Il est notamment écrit presque entièrement en C#, incluant des liaisons gérées pour LLVM, Remill et Souper.
Dna implémente une reconstruction itérative de graphe de flot de contrôle fortement inspirée de l'article SATURN. Il applique de manière itérative la descente récursive, le lifting (à l'aide de remill) et la résolution de chemins jusqu'à ce que le graphe de flot de contrôle complet soit reconstitué. Dans le cas des tables de saut, nous utilisons un algorithme récursif basé sur Souper et z3 pour résoudre l'ensemble des cibles possibles de la table de saut. Vous pouvez trouver l'algorithme d'exploration itérative ici, et l'algorithme de résolution des tables de saut ici.
Une fois qu'un graphe de flot de contrôle a été entièrement exploré, il peut ensuite être recompilé en x86 et réinséré dans le binaire à l'aide des algorithmes ici et ici. Bien que le code compilé ne soit pas joli, loin de là, il devrait s'exécuter tant que le graphe de flot de contrôle reconstruit est correct. Cela dit, il s'agit encore d'un prototype de recherche – des bogues et des cas particuliers sont attendus. L'exploration du graphe de flot de contrôle peut échouer dans le cas, par exemple, de tables de saut non bornées ou d'instructions non liftables.
Quelques autres fonctionnalités notables :
try/catch et les intrinsèques filter sont insérées dans le graphe de flot de contrôle. Cependant, le recompilateur ne prend pas (encore) en charge SEH (les entrées SEH ne sont pas corrigées), donc les exceptions provoqueront des plantages.MemorySSA, LoopInfo, les arbres de dominance, la gestion du pipeline de passes, etc.Quelques mises en garde :
Notez que Dna est actuellement basé sur LLVM 17.
Dna contient un plugin de dévirtualisation VMProtect situé dans Dna.BinaryTranslator/VMProtect. Voir cette PR pour plus d'informations.
Dna cible actuellement LLVM 17 et doit être compilé sur Windows x64 avec Visual Studio 2022.
Compilez Dna.LLVMInterop en mode Release ; l'arbre de dépendances natif est compilé en Release et les builds d'interop en Debug ne sont pas pris en charge.
Exécutez les commandes ci-dessous à partir d'une invite de commandes développeur VS x64, ou d'un autre shell avec les outils C++ VS dans PATH.
Le superbuild de dépendances installe LLVM 17, Remill, Z3, XED, gflags/glog et les bibliothèques natives associées dans 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 vous changez de compilateur, de type de build ou de paramètres CRT, supprimez à la fois Dna.LLVMInterop/dependencies/build et Dna.LLVMInterop/dependencies/install avant de reconfigurer.
Dna.Example et les projets simplificateurs copient eq_sat.dll depuis la sortie de la version 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