Dna представляет собой статическую структуру бинарного анализа, построенная на вершине LLVM. Примечательно, что он написан почти полностью в C#, включая управляемые привязки для LLVM, Remill и Souper.
Dna реализует итерационную реконструкцию потока управления, вдохновленную бумагой Сатурна. Он итеративно применяет рекурсивный спуск, подъем (с использованием remill) и решение пути до тех пор, пока полный график потока управления не будет восстановлен. В случае таблиц прыжков мы используем рекурсивный алгоритм, основанный на Souper и Z3, чтобы решить набор возможных целей таблицы прыжков. Здесь вы можете найти итеративный алгоритм исследования и алгоритм решения прыжков здесь.
После того, как график потока управления был полностью изучен, он может быть перекомпилирован до x86 и повторно вставлен в двоичный файл, используя алгоритмы отсюда и здесь. Хотя скомпилированный код не является симпатичным способом , он должен работать до тех пор, пока верный график потока управления является правильным. При этом, это все еще исследовательский прототип - ожидаются ошибки и крайние случаи. Исследование графика управления может выйти из строя в случае неограниченных таблиц прыжков или нерешимых инструкций.
Некоторые другие примечательные функции:
try / catch и filter . Несмотря на то, что перекомпилятор не (пока) поддерживает SEH (записи SEH не зафиксированы), исключения вызовут сбои.MemorySSA , LoopInfo , Dominator Trees, Management Pass Tipelish и т. Д.Некоторые предостережения:
Обратите внимание, что Dna в настоящее время основана на LLVM 17.
Dna не будет строить из коробки. Пользовательские патчи для переоборудования и суеты были необходимы для того, чтобы построить Windows. Если вы хотите поработать над DNA, откройте проблему или напишите мне [email protected] . В какой -то момент я могу опубликовать правильные шаги построения, но я не даю никаких гарантий.