Colton1skees/Dna

GitHub: Colton1skees/Dna

Dna 是一个基于 LLVM 与 C# 构建的静态二进制分析框架,通过迭代控制流图重构和指令提升实现二进制级别的分析与重编译。

Stars: 354 | Forks: 33

# Dna `Dna` 是一个基于 LLVM 构建的静态二进制分析框架。值得注意的是,它几乎完全是用 C# 编写的,包括针对 LLVM、Remill 和 Souper 的托管绑定。 # 功能 `Dna` 实现了一种深受 [SATURN](https://arxiv.org/pdf/1909.01752) 论文启发的迭代控制流图重构。它迭代地应用递归下降、提升(使用 remill)和路径求解,直到恢复出完整的控制流图。在处理跳转表的情况下,我们使用基于 `Souper` 和 z3 的递归算法来求解可能的跳转表目标集合。你可以在此处找到迭代探索算法[这里](https://github.com/Colton1skees/Dna/blob/e70b48b1da4c9b3666cc2a218138c050ab6f9d8b/Dna.BinaryTranslator/Unsafe/IterativeFunctionTranslator.cs#L48),以及跳转表求解算法[这里](https://github.com/Colton1skees/Dna/blob/master/Dna.BinaryTranslator/JmpTables/Precise/SouperJumpTableSolver.cs#L41)。 一旦控制流图被完全探索,就可以使用[这里](https://github.com/Colton1skees/Dna/blob/master/Dna.BinaryTranslator/Safe/SafeFunctionTranslator.cs#L46)和[这里](https://github.com/Colton1skees/Dna/blob/master/Dna.BinaryTranslator/Safe/FunctionGroupCompiler.cs#L27)的算法将其重新编译为 x86 并重新插入到二进制文件中。虽然编译出的代码无论从*哪*种意义上来说都不算美观,但只要恢复出的控制流图是正确的,它就应该能运行。话虽如此,它仍然是一个研究原型——预期会存在 bug 和边缘情况。例如,在遇到无界跳转表或不可提升的指令时,控制流图的探索可能会失败。 其他一些值得注意的功能: - 支持*大多数*跳转表,包括 MSVC 的嵌套或所谓的压缩跳转表。 - 支持将带有 SEH 的代码提升为 LLVM IR。当存在 SEH 时,`try`/`catch` 语句和 `filter` 内部函数会被插入到控制流图中。尽管重新编译器(目前还)不支持 SEH(SEH 条目未得到修正),因此异常将导致崩溃。 - 包含一个强大的 API,用于原生地使用 C# 编写 LLVM pass。我们有例如 `MemorySSA`、`LoopInfo`、支配树、pass 管道管理等方面的绑定。 - 使用 graphviz 进行 LLVM IR 和二进制控制流图的图形可视化,或者作为替代,提供用于 binary ninja 的脚本生成器。 一些注意事项: - 仅支持 x86_64 - 重新编译的代码不符合 CET 标准 # 依赖项 - LLVM/LLVMSharp - Remill - Souper - AsmResolver - Rivers 请注意,`Dna` 目前基于 LLVM 17。 # VMProtect `Dna` 包含一个位于 `Dna.BinaryTranslator/VMProtect` 中的 VMProtect 去虚拟化插件。有关更多信息,请参见[此 PR](https://github.com/Colton1skees/Dna/pull/8)。 # 构建 Dna 目前以 LLVM 17 为目标,预期在 Windows x64 环境下使用 Visual Studio 2022 进行构建。 请在 **Release** 模式下构建 `Dna.LLVMInterop`;原生依赖树是 Release 构建的,不支持 Debug 互操作构建。 ## 前置条件 - Visual Studio 2022 及其 C++/MSBuild 工具 - CMake - Ninja - clang-cl / LLVM 工具(可从 VS 工具链中获取) - Rust/Cargo(用于 EqSat simplifier DLL) - .NET SDK 8+ 请在 VS x64 开发者 shell 或其他将 VS C++ 工具加入 `PATH` 的 shell 中运行以下命令。 ## 1. 构建原生依赖项 依赖项超级构建会将 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`。 ## 2. 构建 Rust simplifier DLL `Dna.Example` 和 simplifier 项目会从 Cargo 的 release 输出中复制 `eq_sat.dll`。 ``` cargo build --manifest-path Simplifier/EqSat/Cargo.toml --release ``` ## 3. 构建解决方案 ``` & "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" ` Dna.sln ` /restore ` /p:Configuration=Release ` /p:Platform=x64 ` /m ```
标签:Bash脚本, LLVM, 二进制重写, 可视化界面, 控制流图重构, 编译器, 静态二进制分析