2 个版本

0.1.1 2024 年 5 月 22 日
0.1.0 2024 年 5 月 21 日

#1 in #ghidra

Download history 284/week @ 2024-05-20 1/week @ 2024-06-10

每月下载 53
用于 jingle

MIT 许可证

4.5MB
107K SLoC

C++ 105K SLoC // 0.2% comments Rust 2.5K SLoC // 0.0% comments

jingle_sleigh: 基于 Ghidra SLEIGH 的 Rust FFI 层

sleigh 是 Ghidra 优秀反汇编器的核心代码转换器。它将指令字节转换为一系列 PCODE,这是在理想化机器上处理器语义的中间表示。

许可证

sleigh 与 ghidra 的其余部分一样,采用 APACHE 2 许可证,并且可以在 此处 找到原始许可证。 jinglesleigh 中的现有代码没有进行修改,而是为了 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