6 releases

0.1.5 Nov 24, 2023
0.1.4 Nov 24, 2023

#794 in Embedded development

MIT license

76KB
2.5K SLoC

rydis

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.

Example

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)?;

Dependencies

~17MB
~156K SLoC