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, 二进制重写, 可视化界面, 控制流图重构, 编译器, 静态二进制分析