GaloisInc/macaw
GitHub: GaloisInc/macaw
Macaw 是一个可扩展的开源二进制分析框架,提供从多种架构的二进制文件中发现代码并进行符号执行的能力。
Stars: 250 | Forks: 25
这是 Macaw 二进制分析框架的主仓库,它具有两个关键目标:二进制代码发现和机器码的符号执行。实现该框架是为了提供对架构的可扩展支持(即,库客户端可以添加他们自己的架构并按需选择所需的架构支持)。
# 概述
代码发现算法基于强制执行,能够从一个或多个入口点发现代码。符号是可选的,但可以显著提高结果的质量。剥离符号的二进制文件可能会对 Macaw 构成挑战(尤其是静态且被剥离符号的二进制文件)。Macaw 支持将发现的机器码提升为适合通过 Crucible 库进行符号执行的 IR。
目前,Macaw 支持:
* x86-64
* PowerPC(32 位和 64 位)
* ARM(32 位)
* RISC-V
## 仓库结构
Macaw 库包括:
* macaw-base -- 核心的架构无关操作和算法。
* macaw-symbolic -- 通过 Crucible 提供 Macaw 程序符号模拟的库。
* macaw-x86 -- 提供使 Macaw 能够用于 X86_64 程序的定义。
* macaw-x86-symbolic -- 添加支持 x86 所需的 Macaw-symbolic 扩展。
* macaw-semmc -- 包含从 semmc 语义到 Macaw IR 转换中与架构无关的组件。这为我们所有的后端提供了共享的基础设施;这将包括 Template Haskell 函数,用于从 _semmc_ 库提供的已学习语义文件创建状态转换器函数。
* macaw-arm -- 通过读取 _semmc_ 生成的语义文件并使用 Template Haskell 生成一个根据已学习语义转换机器状态的函数,使 Macaw 能够用于 ARM(32 位)二进制文件。
* macaw-arm-symbolic -- 使 Macaw/Crucible 能够对 ARM(32 位)架构进行符号模拟。
* macaw-ppc -- 通过读取 _semmc_ 生成的语义文件并使用 Template Haskell 生成一个根据已学习语义转换机器状态的函数,使 Macaw 能够用于 PPC(32 位和 64 位)二进制文件。
* macaw-ppc-symbolic -- 使 Macaw/Crucible 能够对 PPC 架构进行符号模拟
* macaw-riscv -- 使 Macaw 能够用于 RISC-V(RV32GC 和 RV64GC 变体)二进制文件。
* macaw-loader -- 提供统一的接口来加载二进制文件(例如 ELF 格式),并将其转换为基于 Macaw 的内存和入口点列表。
* macaw-loader-{aarch32,ppc,riscv,x86} -- 分别为 ARM、PPC、RISC-V 和 x86_64 架构提供 macaw-loader 后端。
* macaw-refinement -- 启用额外的架构无关的代码发现细化。这可以发现比 macaw-base 中的分析所揭示的更多的功能。
* crucible-macaw-debug:在使用 [Crucible 的交互式调试器](https://github.com/GaloisInc/crucible/tree/master/crucible-debug) 时,支持内省 Macaw 特定的信息。
构成 Macaw 的各个库均在 BSD 许可证下发布。
这些 Macaw 核心库依赖于许多不同的支持库,包括:
* elf-edit -- 加载和解析 ELF 二进制文件
* galois-dwarf -- 从二进制文件中检索 Dwarf 调试信息
* flexdis86 -- 针对 x86 架构的反汇编和语义
* dismantle -- 针对 ARM 和 PPC 架构的反汇编
* semmc -- 针对 ARM 和 PPC 架构的语义定义
* crucible -- 符号执行和分析
* what4 -- Crucible 后端的符号表示
* parameterized-utils -- 用于处理参数化类型的实用工具
## 文档
可以在 [`doc`](doc) 子目录中找到一系列高层设计文档。关于单个 API 函数和数据类型的文档可以在代码中的 Haddock 注释里找到。
我们还编写了其他一些关于 Macaw 的资源:
* [Macaw:面向忙碌二进制分析师的机器码工具箱](http://www.arxiv.org/abs/2407.06375):一篇关于 Macaw 以及构建在 Macaw 之上的二进制分析工具的未发表论文。
* [构建可扩展的、基于 SMT 的机器码内存模型](https://galois.com/blog/2023/03/making-a-scalable-smt-based-machine-code-memory-model/):一篇关于 `macaw-symbolic` 延迟内存模型的博客文章(在 [`Data.Macaw.Symbolic.Memory.Lazy`](symbolic/src/Data/Macaw/Symbolic/Memory/Lazy.hs) 中实现)
# 构建
## 准备工作
构建 Macaw 时非来自 Hackage 的依赖项是通过 Git 子模块支持的:
```
$ git submodule update --init
```
### 为 RISC-V 后端准备 Softfloat
RISC-V 后端依赖于 softfloat-hs,而后者又依赖于 softfloat 库。Macaw 的构建系统会自动构建 softfloat,但必须递归克隆 softfloat-hs 仓库才能启用此功能。如果您不构建 `macaw-riscv`,则可以跳过此步骤。要递归克隆 softfloat-hs,请运行:
```
$ cd deps/softfloat-hs
$ git submodule update --init --recursive
```
## 使用 Cabal 构建
可以使用 Cabal 单独或集中构建 Macaw 库:
```
$ ln -s cabal.project.dist cabal.project
$ cabal configure
$ cabal build all
```
要构建单个库,可以指定该库名称来代替 `all`,或者在构建前切换到该库的子目录:
```
$ cabal build macaw-refinement
```
或者
```
$ cd refinement
$ cabal build
```
# 关于 Freeze 文件的说明
我们使用 `cabal.project.freeze.ghc-*` 文件来限制 CI 中的依赖项版本。要使用一组已知可用的 Hackage 依赖项进行构建:
```
ln -s cabal.GHC-.config cabal.project.freeze
```
这些 freeze 文件是使用 `scripts/regenerate-freeze-files.sh` 脚本生成的。
请注意,目前这些配置文件假定使用的是类 Unix 操作系统,因为我们目前没有在 CI 上测试 Windows。如果您想在 Windows 上使用这些配置文件,则需要手动进行一些更改以移除某些包和标志:
```
regex-posix
tasty +unix
unix
unix-compat
```
请注意,如果任何 Macaw 包在*没有* freeze 文件的情况下构建失败,这就是 `.cabal` 文件中指定的依赖项版本边界存在的一个 bug,应当予以报告 (https://github.com/GaloisInc/macaw/issues)。
# 许可证
此代码基于 BSD3 许可证提供,不提供任何支持。
标签:Crucible, DAST, Hakrawler, Haskell, IR, JA3, Macaw, PowerPC, RISC-V, Semantics, Wayback Machine, x86-64, 中间表示, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码发现, 反汇编, 多架构支持, 开源, 强制执行, 恶意软件分析, 机器码分析, 模糊分析, 符号执行, 逆向工程, 静态分析