3 个版本
0.1.3 | 2024年6月21日 |
---|---|
0.1.2 | 2024年6月21日 |
0.1.1 | 2024年6月20日 |
0.1.0 |
|
#116 in 编程语言
1,492 每月下载量
76KB
1K SLoC
nyxstone-rs
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