unicorn/bindings/rust
lockbox c850db1125 Inherit architecture support from cfg features
While the bindings conditionally compile code based on the cfg
flags, we still include the architecture support in emitted rust
code. This patch removes the ability to refer to architectures
that cannot possibly be supported.
2024-03-27 17:30:53 -04:00
..
src Inherit architecture support from cfg features 2024-03-27 17:30:53 -04:00
build.rs Fix dynamic linkage on msvc 2023-03-02 03:34:33 +08:00
COPYING bindings: add Rust 2021-10-04 01:01:43 +08:00
README.md Add TriCore constants to Rust bindings 2022-05-11 17:29:03 +08:00

Unicorn-engine

Rust bindings for the Unicorn emulator with utility functions.

Checkout Unicorn2 source code at dev branch.

use unicorn_engine::{Unicorn, RegisterARM};
use unicorn_engine::unicorn_const::{Arch, Mode, Permission, SECOND_SCALE};

fn main() {
    let arm_code32: Vec<u8> = vec![0x17, 0x00, 0x40, 0xe2]; // sub r0, #23

    let mut unicorn = Unicorn::new(Arch::ARM, Mode::LITTLE_ENDIAN).expect("failed to initialize Unicorn instance");
    let emu = &mut unicorn;
    emu.mem_map(0x1000, 0x4000, Permission::ALL).expect("failed to map code page");
    emu.mem_write(0x1000, &arm_code32).expect("failed to write instructions");

    emu.reg_write(RegisterARM::R0, 123).expect("failed write R0");
    emu.reg_write(RegisterARM::R5, 1337).expect("failed write R5");

    let _ = emu.emu_start(0x1000, (0x1000 + arm_code32.len()) as u64, 10 * SECOND_SCALE, 1000);
    assert_eq!(emu.reg_read(RegisterARM::R0), Ok(100));
    assert_eq!(emu.reg_read(RegisterARM::R5), Ok(1337));
}

Further sample code can be found in tests.

Usage

Add this to your Cargo.toml:

[dependencies]
unicorn-engine = "2.0.0"

Acknowledgements

These bindings are based on Sébastien Duquette's (@ekse) unicorn-rs. We picked up the project, as it is no longer maintained. Thanks to all contributors.