2 个版本
0.1.1 | 2024 年 5 月 22 日 |
---|---|
0.1.0 | 2024 年 5 月 21 日 |
#1 in #ghidra
每月下载 53 次
用于 jingle
4.5MB
107K SLoC
jingle_sleigh
: 基于 Ghidra SLEIGH 的 Rust FFI 层
sleigh
是 Ghidra 优秀反汇编器的核心代码转换器。它将指令字节转换为一系列 PCODE
,这是在理想化机器上处理器语义的中间表示。
许可证
sleigh
与 ghidra 的其余部分一样,采用 APACHE 2 许可证,并且可以在 此处 找到原始许可证。 jingle
对 sleigh
中的现有代码没有进行修改,而是为了 FFI 目的添加了外部代码。虽然 sleigh
源代码不在此存储库中(而是通过子模块拉取),但我将许可证包含在内,因为通过 crates.io 进行分发将需要将 sleigh 源代码存入包中。
为什么这么做?
这几乎不是第一次有人围绕 sleigh
编写 Rust FFI。然而,由于我对 jingle
有特定的要求,我想控制 FFI,所以觉得“再增加一个也无妨?”
如何使用?
此库仅提供 sleigh
的 Rust 绑定,您需要提供自己的架构定义以便 sleigh 解析。最简单的方法是安装 Ghidra,打开给定架构的文件,然后将 jingle_sleigh
指向该 Ghidra 安装。更有抱负的用户可以自行运行 sleigh 编译器。
我本来希望允许在此库中编译 slaspecs,但由于 sleigh 中解析架构的大部分逻辑存在于一个同时包含 main
的文件中,而且当然没有链接器喜欢处理多个 main
,因此有一些链接 sleigh 这些部分的困难。
但无论如何,这里有一个从测试中摘录的用法示例
#[test]
fn get_one() {
let mov_eax_0: [u8; 6] = [0xb8, 0x00, 0x00, 0x00, 0x00, 0xc3];
let ctx_builder =
SleighContextBuilder::load_ghidra_installation("/Applications/ghidra").unwrap();
let ctx = ctx_builder
.set_image(Image::from(mov_eax_0.as_slice()))
.build("x86:LE:64:default")
.unwrap();
let instr = ctx.read(0, 1).last().unwrap();
assert_eq!(instr.length, 5);
assert!(instr.disassembly.mnemonic.eq("MOV"));
assert!(!instr.ops.is_empty());
varnode!(&ctx, #0:4).unwrap();
let _op = PcodeOperation::Copy {
input: varnode!(&ctx, #0:4).unwrap(),
output: varnode!(&ctx, "register"[0]:4).unwrap(),
};
assert!(matches!(&instr.ops[0], _op))
}
依赖关系
~1.8–4MB
~66K SLoC