Dna ist ein statisches Binäranalyse -Framework, das auf LLVM aufgebaut ist. Insbesondere ist es fast ausschließlich in C#geschrieben, einschließlich verwalteter Bindungen für LLVM, Erinnerung und Souper.
Dna implementiert eine iterative Kontrollflussgrafikrekonstruktion, die stark durch das Saturnpapier inspiriert wurde. Es wendet iterativ rekursive Abstammung, Anheben (mit Remill) und Pfadlösung an, bis das vollständige Steuerungsströmungsdiagramm wiederhergestellt ist. Bei Sprungtabellen verwenden wir einen rekursiven Algorithmus, der auf Souper und Z3 basiert, um die möglichen Aussprungstabellenziele zu lösen. Hier finden Sie den iterativen Explorationsalgorithmus und den Lösungsalgorithmus für Sprungtisch.
Sobald ein Kontrollflussgraphen vollständig untersucht wurden, kann er dann in X86 neu kompiliert und unter Verwendung der Algorithmen von hier und hier in die Binärdatei wieder eingelagert werden. Obwohl der kompilierte Code keineswegs hübsch ist, sollte er so lange ausgeführt werden, solange der wiederhergestellte Steuerflussdiagramm korrekt ist. Davon abgesehen ist es immer noch ein Forschungsprototyp - Fehler und Randfälle werden erwartet. Die Exploration von Kontrollflussdiagramme kann bei EG -unbegrenzten Sprungtabellen oder nicht abgeschlossenen Anweisungen ausfallen.
Einige andere bemerkenswerte Funktionen:
try / catch und filter in den Steuerflussdiagramm eingefügt. Obwohl der Recompiler nicht (noch) SEH unterstützt (die SEH -Einträge sind nicht festgelegt), führen Ausnahmen zu Abstürzen.MemorySSA , LoopInfo , Dominator -Bäume, Pass -Pipeline -Management usw.Einige Einschränkungen:
Beachten Sie, dass Dna derzeit auf LLVM 17 basiert.
Dna wird nicht aus der Schachtel aufbauen. Für dies wurden benutzerdefinierte Patches für Erinnerungen und Souper benötigt, um auf Windows zu erstellen. Wenn Sie an DNA arbeiten möchten, öffnen Sie ein Problem oder senden Sie mir eine E -Mail an [email protected] . Irgendwann kann ich die richtigen Bauschritte veröffentlichen, aber ich mache keine Garantien.