
LLVM-basiertes Framework für statische Binäranalyse
Dna ist ein statisches Binary-Analyse-Framework, das auf LLVM aufbaut. Es ist bemerkenswerterweise fast ausschließlich in C# geschrieben, einschließlich verwalteter Bindungen für LLVM, Remill und Souper.
Dna implementiert eine iterative Kontrollflussgraphen-Rekonstruktion, die stark von der SATURN-Veröffentlichung inspiriert ist. Es wendet iterativ rekursiven Abstieg, Lifting (unter Verwendung von Remill) und Pfad-Lösung an, bis der vollständige Kontrollflussgraph wiederhergestellt ist. Im Fall von Sprungtabellen verwenden wir einen rekursiven Algorithmus basierend auf Souper und z3, um die Menge der möglichen Sprungtabellenziele zu lösen. Sie finden den iterativen Explorationsalgorithmus hier und den Sprungtabellen-Lösungsalgorithmus hier.
Sobald ein Kontrollflussgraph vollständig erkundet wurde, kann er dann mit den Algorithmen von hier und hier zurück nach x86 kompiliert und in die Binärdatei eingefügt werden. Auch wenn der kompilierte Code keineswegs schön ist, sollte er laufen, solange der wiederhergestellte Kontrollflussgraph korrekt ist. Dennoch handelt es sich immer noch um einen Forschungsprototypen – Fehler und Randfälle sind zu erwarten. Die Exploration des Kontrollflussgraphen kann beispielsweise bei unbegrenzten Sprungtabellen oder nicht lifbaren Instruktionen fehlschlagen.
Einige weitere bemerkenswerte Funktionen:
try/catch-Anweisungen und filter-Intrinsics in den Kontrollflussgraphen eingefügt. Der Recompiler unterstützt SEH jedoch (noch) nicht (die SEH-Einträge werden nicht repariert), sodass Ausnahmen zu Abstürzen führen.MemorySSA, LoopInfo, Dominatorbäume, Pass-Pipeline-Verwaltung usw.Einige Einschränkungen:
Beachten Sie, dass Dna derzeit auf LLVM 17 basiert.
Dna enthält ein VMProtect-Devirtualisierungs-Plugin, das sich in Dna.BinaryTranslator/VMProtect befindet. Weitere Informationen finden Sie in diesem PR.
Dna zielt derzeit auf LLVM 17 ab und soll unter Windows x64 mit Visual Studio 2022 gebaut werden.
Erstellen Sie Dna.LLVMInterop im Release-Modus; der native Abhängigkeitsbaum ist im Release-Modus gebaut, und Debug-Interop-Builds werden nicht unterstützt.
Führen Sie die folgenden Befehle von einer VS x64-Entwickler-Shell oder einer anderen Shell mit den VS C++-Tools in PATH aus.
Der Dependency-Superbuild installiert LLVM 17, Remill, Z3, XED, gflags/glog und zugehörige native Bibliotheken in 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
Wenn Sie Compiler, Build-Typ oder CRT-Einstellungen ändern, löschen Sie sowohl Dna.LLVMInterop/dependencies/build als auch Dna.LLVMInterop/dependencies/install vor der Neukonfiguration.
Dna.Example und die Simplifier-Projekte kopieren eq_sat.dll aus der Cargo-Release-Ausgabe.
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