
Основанный на LLVM фреймворк для статического анализа бинарных файлов
Dna — это фреймворк для статического анализа бинарных файлов, построенный на основе LLVM. Примечательно, что он написан почти полностью на C#, включая управляемые привязки для LLVM, Remill и Souper.
Dna реализует итеративную реконструкцию графа потока управления, вдохновлённую статьёй SATURN. Он итеративно применяет рекурсивный спуск, подъём (lifting) с использованием remill и решение путей до тех пор, пока не будет восстановлен полный граф потока управления. В случае таблиц переходов мы используем рекурсивный алгоритм на основе Souper и z3 для вычисления множества возможных целей таблицы переходов. Алгоритм итеративного исследования можно найти здесь, а алгоритм решения таблиц переходов — здесь.
После полного исследования графа потока управления его можно перекомпилировать в x86 и повторно вставить в бинарный файл с помощью алгоритмов отсюда здесь и здесь. Хотя скомпилированный код далёк от красоты, он должен работать, если восстановленный граф потока управления корректен. Тем не менее, это всё ещё исследовательский прототип — ожидаются ошибки и граничные случаи. Исследование графа потока управления может не удаться, например, в случае неограниченных таблиц переходов или не поднимаемых инструкций.
Некоторые другие примечательные особенности:
try/catch и внутренние функции filter. Однако перекомпилятор пока не поддерживает SEH (записи SEH не исправляются), поэтому исключения приведут к сбоям.MemorySSA, LoopInfo, деревьев доминаторов, управления конвейером проходов и т.д.Некоторые предостережения:
Обратите внимание, что Dna в настоящее время основан на LLVM 17.
Dna содержит плагин девиртуализации VMProtect, расположенный в Dna.BinaryTranslator/VMProtect. Смотрите этот PR для получения дополнительной информации.
Dna в настоящее время нацелен на LLVM 17 и предполагается сборка на Windows x64 с Visual Studio 2022. Соберите Dna.LLVMInterop в режиме Release; дерево нативных зависимостей собирается в Release, сборки Debug interop не поддерживаются.
Запускайте команды ниже из оболочки разработчика VS x64 или из другой оболочки, где инструменты C++ VS находятся в PATH.
Суперсборка зависимостей устанавливает LLVM 17, Remill, Z3, XED, gflags/glog и связанные нативные библиотеки в 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
Если вы меняете компилятор, тип сборки или настройки CRT, удалите как Dna.LLVMInterop/dependencies/build, так и Dna.LLVMInterop/dependencies/install перед перенастройкой.
Проекты Dna.Example и упрощения копируют eq_sat.dll из выходного каталога Cargo release.
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