lifting-bits/sleigh
GitHub: lifting-bits/sleigh
将 Ghidra 的 SLEIGH 指令集描述引擎构建为独立的 C++ 库,支持多架构反汇编和 P-Code 语义提升功能。
Stars: 174 | Forks: 23
# Sleigh 库
[Sleigh](https://ghidra.re/ghidra_docs/languages/html/sleigh.html) 是一种用于描述通用微处理器指令集语义的语言,其详细程度足以促进针对这些架构编译的软件的逆向工程。它是 [Ghidra 逆向工程平台](https://github.com/NationalSecurityAgency/ghidra) 的一部分,并支撑了其两个主要组件:反汇编和反编译引擎。
本仓库提供了一个基于 CMake 的 Sleigh 构建项目,以便将其构建并打包为一个独立的库,从而在 Ghidra 以外的项目中复用。
## 支持的平台
| 名称 | 支持 |
| ---- | ------- |
| Linux | 是 |
| macOS | 是 |
| Windows | 是 |
## 依赖和前提条件
### 必需
| 名称 | 版本 | Linux 安装包 | macOS Homebrew 安装包 |
| ---- | ------- | ------------------------ | --------------------------------- |
| (HEAD 构建) [zlib](https://www.zlib.net/) | 最新版 | zlib1g-dev | zlib |
| [Git](https://git-scm.com/) | 最新版 | git | N/A |
| [CMake](https://cmake.org/) | 3.18+ | cmake | cmake |
**注意**:此 CMake 项目会在配置期间从互联网拉取 Ghidra 源代码。有关更多详细信息,请参阅 [关于 Ghidra 源代码的说明部分](#note-on-ghidra-source-code)。
### 可选
用于构建文档:
| 名称 | 版本 | Linux 安装包 | macOS Homebrew 安装包 |
| ---- | ------- | ------------------------ | --------------------------------- |
| [Doxygen](https://www.doxygen.nl/) | 最新版 | doxygen | doxygen |
| [GraphViz](https://graphviz.org/) | 最新版 | graphviz | graphviz |
## 构建和安装 Sleigh 库
```
# 克隆此仓库 (sleigh 的 CMake 项目)
git clone https://github.com/lifting-bits/sleigh.git
cd sleigh
# 配置 CMake
cmake -B build -S .
# 构建 Sleigh
cmake --build build --parallel 8
# 安装 Sleigh
cmake --install build --prefix ./install
```
### 关于 Ghidra 源代码的说明
Ghidra 源代码实际上并不包含在这个 git 仓库中,默认情况下,CMake 会自动从互联网为你拉取一个稳定版本。
关于如何自定义将使用/编译哪个 Ghidra 源代码提交(包括指定你自己的 Ghidra 源代码本地副本),请参阅 [`src/README.md`](src/README.md) 获取更多信息。
## 打包
CMake 配置还支持为 Sleigh 构建包。
例如:
```
# 打包 Sleigh
cmake --build build --target package
```
## API 用法
包含了一个名为 `sleigh-lift` 的示例程序,用于演示如何使用 Sleigh API。它接收一个十六进制字节字符串,并可以将其反汇编或提升为 p-code。该程序可以按如下方式调用,其中 `action` 参数必须是 `disassemble` 或 `pcode`:
```
sleigh-lift [action] [sla_file] [bytes] [-a address] [-p root_sla_dir] [-s pspec_file]
```
例如,要反汇编以下字节字符串:
```
$ sleigh-lift disassemble x86-64.sla 4881ecc00f0000
0x00000000: SUB RSP,0xfc0
```
并将其提升为 p-code:
```
$ sleigh-lift pcode x86-64.sla 4881ecc00f0000
(register,0x200,1) = INT_LESS (register,0x20,8) (const,0xfc0,8)
(register,0x20b,1) = INT_SBORROW (register,0x20,8) (const,0xfc0,8)
(register,0x20,8) = INT_SUB (register,0x20,8) (const,0xfc0,8)
(register,0x207,1) = INT_SLESS (register,0x20,8) (const,0x0,8)
(register,0x206,1) = INT_EQUAL (register,0x20,8) (const,0x0,8)
(unique,0x12c00,8) = INT_AND (register,0x20,8) (const,0xff,8)
(unique,0x12c80,1) = POPCOUNT (unique,0x12c00,8)
(unique,0x12d00,1) = INT_AND (unique,0x12c80,1) (const,0x1,1)
(register,0x202,1) = INT_EQUAL (unique,0x12d00,1) (const,0x0,1)
```
如果你不想构建 `sleigh-lift`,则必须在 CMake 配置期间将 CMake 变量 `sleigh_BUILD_EXTRATOOLS` 选项设置为 `OFF`。
## 辅助工具
本仓库包含一个不属于 Sleigh/Ghidra 的辅助工具,你可以在 `support` 目录中找到它。它具有以下签名,可以帮助用户在系统上找到给定 spec 文件的位置:
```
std::optional
FindSpecFile(std::string_view file_name,
const std::vector &search_paths =
gDefaultSearchPaths);
```
`sleigh::FindSpecFile` 函数将在用户通过 `search_paths` 参数提供的路径中搜索名为 `file_name` 的 spec 文件。`search_paths` 的默认参数是 `sleigh::gDefaultSearchPaths`,其中包含 CMake 配置期间生成的安装/构建目录以及一组常见的安装位置。
如果你不想构建辅助工具,则必须在 CMake 配置期间将 CMake 变量 `sleigh_BUILD_SUPPORT` 选项设置为 `OFF`。
## 作为依赖项集成
Sleigh 的安装提供了一个 CMake 接口,你可以在构建项目时使用它。
你可以在 [find_package](tests/find_package/CMakeLists.txt) 示例中找到有关如何使用 CMake 包配置文件的示例。
我们还提供了一个 CMake 辅助函数 [`sleigh_compile`](cmake/modules/sleighCompile.cmake),用于使用 sleigh 编译器编译你的 `.slaspec` 文件。
你可以在 [`example`](example/CMakeLists.txt) 目录中找到一个更复杂的 CMake 示例,其中包含编译 Sleigh 规范的内容,该示例使用了上游提供的 sleigh 示例源代码。
最后,你可以通过 CMake 变量 `sleigh_INSTALL_SPECDIR` 找到已安装的编译后的 sleigh 文件,这是编译后的 sleigh 文件根目录的绝对路径——你应该手动检查此路径以了解预期内容。
还建议参考 [CMake 配置文件](cmake/install-config.cmake.in) 和 [`specfiles` CMake 文件](sleighspecs/specfiles.cmake.in),以了解有关公开的 CMake 变量和模块的更多信息。
## 许可证
请参阅 [LICENSE 文件](LICENSE)。
标签:Bash脚本, C++, CMake, Ghidra, Hakrawler, Lifting-Bits, NSA, SLEIGH, URL提取, Wayback Machine, Zlib, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码构建, 反汇编, 反编译, 威胁情报, 库打包, 开发者工具, 指令集架构, 数据擦除, 网络取, 语义描述, 跨平台编译, 逆向工程, 静态分析