Sleigh 是一种用于描述通用微处理器指令集语义的语言,其细节足以支持对为这些架构编译的软件进行逆向工程。它是 Ghidra 逆向工程平台 的一部分,并支撑着该平台的两个主要组件:反汇编引擎和反编译引擎。
本仓库提供了一个基于 CMake 的 Sleigh 构建项目,使其能够作为独立库进行构建和打包,并可在 Ghidra 之外的项目中复用。
| 名称 | 支持情况 |
|---|---|
| Linux | 是 |
| macOS | 是 |
| Windows | 是 |
| 名称 | 版本 | 需安装的 Linux 软件包 | 需安装的 macOS Homebrew 软件包 |
|---|---|---|---|
| (HEAD 构建) zlib | 近期版本 | zlib1g-dev | zlib |
| Git | 最新版 | git | 不适用 |
| CMake | 3.18+ | cmake | cmake |
注意:此 CMake 项目在配置期间会从互联网拉取 Ghidra 源代码。更多详情请参阅 关于 Ghidra 源代码的说明部分。
用于构建文档:
| 名称 | 版本 | 需安装的 Linux 软件包 | 需安装的 macOS Homebrew 软件包 |
|---|---|---|---|
| Doxygen | 最新版 | doxygen | doxygen |
| GraphViz | 最新版 | graphviz | graphviz |
# Clone this repository (CMake project for sleigh)
git clone https://github.com/lifting-bits/sleigh.git
cd sleigh
# Configure CMake
cmake -B build -S .
# Build Sleigh
cmake --build build --parallel 8
# Install Sleigh
cmake --install build --prefix ./install
Ghidra 源代码实际上并未包含在此 git 仓库中,默认情况下,CMake 会自动从互联网拉取一个稳定版本供你使用。
有关如何自定义使用/编译哪个 Ghidra 源代码提交(包括指定你自己的本地 Ghidra 源代码副本)的更多信息,请参阅 src/README.md。
CMake 配置还支持为 Sleigh 构建软件包。
例如:
# Package Sleigh
cmake --build build --target package
我们包含了一个名为 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<std::filesystem::path>
FindSpecFile(std::string_view file_name,
const std::vector<std::filesystem::path> &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 示例中找到如何使用 CMake 包配置文件的一个示例。
我们还提供了一个 CMake 辅助函数 sleigh_compile,用于使用 sleigh 编译器编译你的 .slaspec 文件。
你可以在 example 目录中找到一个更复杂的、包含编译 Sleigh 规范的 CMake 示例,该示例使用了上游提供的 sleigh 示例源代码。
最后,你可以通过 CMake 变量 sleigh_INSTALL_SPECDIR 定位已安装的编译后的 sleigh 文件,该变量是编译后的 sleigh 文件根目录的绝对路径——你应该手动检查它以了解预期内容。
还建议参考 CMake 配置文件 和 specfiles CMake 文件,以了解更多关于所暴露的 CMake 变量和模块的信息。
请参阅 LICENSE 文件。