| Crates.io | capstone-git |
| lib.rs | capstone-git |
| version | 0.13.0-commit4ed86fb |
| created_at | 2025-10-20 00:18:56.186363+00 |
| updated_at | 2025-10-20 00:18:56.186363+00 |
| description | High level bindings to capstone disassembly engine (https://www.capstone-engine.org/) |
| homepage | |
| repository | https://github.com/capstone-rust/capstone-rs |
| max_upload_size | |
| id | 1891233 |
| size | 450,944 |
This is a fork of capstone-rs that is sourced directly from the master branch of the upstream repository, allowing the use of certain unreleased features.
The purpose of re-publishing the crate is to allow libraries that also depend on said unreleased features to be published on crates.io.
Bindings to the capstone library disassembly framework.
The Capstone struct is the main interface to the library.
capstone-rs uses the capstone-sys crate to provide the low-level bindings to the Capstone C library.
See the capstone-sys page for the requirements and supported platforms.
1.81.0extern crate capstone;
use capstone::prelude::*;
const X86_CODE: &'static [u8] = b"\x55\x48\x8b\x05\xb8\x13\x00\x00\xe9\x14\x9e\x08\x00\x45\x31\xe4";
/// Print register names
fn reg_names(cs: &Capstone, regs: &[RegId]) -> String {
let names: Vec<String> = regs.iter().map(|&x| cs.reg_name(x).unwrap()).collect();
names.join(", ")
}
/// Print instruction group names
fn group_names(cs: &Capstone, regs: &[InsnGroupId]) -> String {
let names: Vec<String> = regs.iter().map(|&x| cs.group_name(x).unwrap()).collect();
names.join(", ")
}
fn main() {
let cs = Capstone::new()
.x86()
.mode(arch::x86::ArchMode::Mode64)
.syntax(arch::x86::ArchSyntax::Att)
.detail(true)
.build()
.expect("Failed to create Capstone object");
let insns = cs.disasm_all(X86_CODE, 0x1000)
.expect("Failed to disassemble");
println!("Found {} instructions", insns.len());
for i in insns.as_ref() {
println!();
println!("{}", i);
let detail: InsnDetail = cs.insn_detail(&i).expect("Failed to get insn detail");
let arch_detail: ArchDetail = detail.arch_detail();
let ops = arch_detail.operands();
let output: &[(&str, String)] = &[
("insn id:", format!("{:?}", i.id().0)),
("bytes:", format!("{:?}", i.bytes())),
("read regs:", reg_names(&cs, detail.regs_read())),
("write regs:", reg_names(&cs, detail.regs_write())),
("insn groups:", group_names(&cs, detail.groups())),
];
for &(ref name, ref message) in output.iter() {
println!("{:4}{:12} {}", "", name, message);
}
println!("{:4}operands: {}", "", ops.len());
for op in ops {
println!("{:8}{:?}", "", op);
}
}
}
Produces:
Found 4 instructions
0x1000: pushq %rbp
read regs: rsp
write regs: rsp
insn groups: mode64
0x1001: movq 0x13b8(%rip), %rax
read regs:
write regs:
insn groups:
0x1008: jmp 0x8ae21
read regs:
write regs:
insn groups: jump
0x100d: xorl %r12d, %r12d
read regs:
write regs: rflags
insn groups:
To see more demos, see the examples/ directory.
More complex demos welcome!
full†: do not compile Capstone C library in
diet modestd†: enable std-only features, such as the
Error traituse_bindgen: run bindgen to generate Rust bindings to Capstone C library
instead of using pre-generated bindings (not recommended)arch_$ARCH†: enable arch $ARCH support in capstone,
e.g. arch_arm64 enables arch arm64 supportsupport_all_archs†: enable all archs available
in capstone, imply all arch_$ARCH featurescheck_only: do not compile and link capstone C library,
you can enable it to speed up cargo check by 5x†: enabled by default
Please open a Github issue
You may find a full list of contributors on Github.