Crates.io | rydis |
lib.rs | rydis |
version | 0.1.5 |
source | src |
created_at | 2023-11-18 01:34:02.288028 |
updated_at | 2023-11-24 02:18:50.50882 |
description | low level rust bindings for the zydis library |
homepage | |
repository | https://github.com/roeeshoshani/rydis |
max_upload_size | |
id | 1040135 |
size | 91,266 |
this is a crate which allows encoding, decoding and working with x86 instructions in a very convenient and user-friendly way.
it uses the Zydis
library under the hood, but provides user-friendly wrappers around Zydis
' interfaces to make it
easier to work with.
let state = rydis::RydisState::new(MachineMode::Long64, StackWidth::Width64)?;
// encode an instruction
let encoded = state.encode(Instruction {
prefixes: Prefixes::empty(),
mnemonic: Mnemonic::XCHG,
operands: [Operand::Reg(Register::RAX), Operand::Reg(Register::RBX)]
.into_iter()
.collect(),
})?;
// decode it
let decoded_instruction = state.decode_one(encoded.as_slice())?;
// modify it
let mut modified_instruction = decoded_instruction.to_instruction();
modified_instruction.operands[1] = Operand::Mem(MemOperand {
base: Some(Register::RBP),
index: None,
displacement: 0x1234,
size: decoded_instruction.operand_width,
segment_register_override: None,
});
// format it
println!(
"modified insn: {}",
modified_instruction.format(&state, FormatStyle::Intel, Some(0x123400))?
);
// re-encode the modified instruction
let re_encoded = state.encode(modified_instruction)?;