3 个版本

0.1.3 2024年6月21日
0.1.2 2024年6月21日
0.1.1 2024年6月20日
0.1.0 2024年6月20日

#116 in 编程语言

Download history 303/week @ 2024-06-19 300/week @ 2024-06-26 441/week @ 2024-07-03 466/week @ 2024-07-10 625/week @ 2024-07-17 292/week @ 2024-07-24 214/week @ 2024-07-31 258/week @ 2024-08-07

1,492 每月下载量

MIT 许可证

76KB
1K SLoC

C++ 804 SLoC // 0.1% comments Rust 387 SLoC // 0.2% comments

nyxstone-rs

Github Rust CI Badge

Nyxstone 汇编器/反汇编器引擎的官方绑定。

构建

可以通过在 cargo build 中运行项目来构建,前提是已安装支持静态链接的 LLVM 15,并位于 $PATH 或环境变量 $NYXSTONE_LLVM_PREFIX 指向此类 LLVM 15 库的安装位置。有关更多信息,请参阅 Nyxstone README.md。绑定还期望 Nyxstone 库安装在 nyxstone 子目录中。这可以通过使用 Makefile 目标 nyxstone 来完成。

安装

在您的 Cargo.toml 中添加 nyxstone 作为依赖项

[dependencies]
nyxstone = "0.0.1"

构建 Nyxstone 需要在您的系统上安装 C/C++ 编译器。此外,Nyxstone 需要安装 LLVM 15。有关设置 LLVM 安装位置的更多信息,请参阅构建部分。

示例

以下是一个使用 Nyxstone 的简短示例

extern crate anyhow;
extern crate nyxstone;

use std::collections::HashMap;

use anyhow::Result;
use nyxstone::{IntegerBase, Nyxstone, NyxstoneConfig};

fn main() -> Result<()> {
    // Creating a nyxstone instance can fail, for example if the triple is invalid.
    let nyxstone = Nyxstone::new("x86_64", NyxstoneConfig::default())?;

    // Assemble a single instruction
    let instructions = nyxstone.assemble_to_instructions("xor rax, rax", 0x100)?;

    println!("Assembled: ");
    for instr in instructions {
        println!("0x{:04x}: {:15} - {:02x?}", instr.address, instr.assembly, instr.bytes);
    }

    // Assemble with a label definition
    let instructions = nyxstone.assemble_to_instructions_with(
        "mov rax, rbx; cmp rax, rdx; jne .label",
        0x100,
        &HashMap::from([(".label", 0x1200)]),
    )?;

    println!("Assembled: ");
    for instr in instructions {
        println!("0x{:04x}: {:15} - {:02x?}", instr.address, instr.assembly, instr.bytes);
    }

    let disassembly = nyxstone.disassemble(
        &[0x31, 0xd8],
        /* address= */ 0x0,
        /* #instructions= (0 = all)*/ 0,
    )?;

    assert_eq!(disassembly, "xor eax, ebx\n".to_owned());

    let config = NyxstoneConfig {
        immediate_style: IntegerBase::HexPrefix,
        ..Default::default()
    };
    let nyxstone = Nyxstone::new("x86_64", config)?;

    assert_eq!(
        nyxstone.disassemble(&[0x83, 0xc0, 0x01], 0, 0)?,
        "add eax, 0x1\n".to_owned()
    );

    Ok(())
}

技术概述

nyxstone-rs 绑定是通过 cxx crate 生成的。由于 Nyxstone 专门是一个 C++ 库,所以我们目前不计划通过 bindgen 支持 C 绑定。

致谢

rust 绑定的构建脚本大量借鉴了 llvm-sys 的构建脚本。

依赖项

~0.6–2.2MB
~32K SLoC