Trait Cpu

Source
pub trait Cpu {
    type Reg: Register;

Show 28 methods // Required methods fn emu(&self) -> &Unicorn; fn mut_emu(&mut self) -> &mut Unicorn; // Provided methods fn reg_read(&self, reg: Self::Reg) -> Result<u64, Error> { ... } fn reg_read_i32(&self, reg: Self::Reg) -> Result<i32, Error> { ... } unsafe fn reg_write_generic<T: Sized>( &self, reg: Self::Reg, value: T, ) -> Result<(), Error> { ... } fn reg_write(&self, reg: Self::Reg, value: u64) -> Result<(), Error> { ... } fn reg_write_i32(&self, reg: Self::Reg, value: i32) -> Result<(), Error> { ... } fn mem_map( &self, address: u64, size: size_t, perms: Protection, ) -> Result<(), Error> { ... } unsafe fn mem_map_ptr<T>( &self, address: u64, size: size_t, perms: Protection, ptr: *mut T, ) -> Result<(), Error> { ... } fn mem_unmap(&self, address: u64, size: size_t) -> Result<(), Error> { ... } fn mem_write(&self, address: u64, bytes: &[u8]) -> Result<(), Error> { ... } fn mem_read(&self, address: u64, bytes: &mut [u8]) -> Result<(), Error> { ... } fn mem_read_as_vec( &self, address: u64, size: usize, ) -> Result<Vec<u8>, Error> { ... } fn mem_protect( &self, address: u64, size: usize, perms: Protection, ) -> Result<(), Error> { ... } fn mem_regions(&self) -> Result<Vec<MemRegion>, Error> { ... } fn emu_start( &self, begin: u64, until: u64, timeout: u64, count: usize, ) -> Result<(), Error> { ... } fn emu_stop(&self) -> Result<(), Error> { ... } fn add_code_hook<F>( &mut self, hook_type: CodeHookType, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error> where F: Fn(&Unicorn, u64, u32) + 'static { ... } fn add_intr_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error> where F: Fn(&Unicorn, u32) + 'static { ... } fn add_mem_hook<F>( &mut self, hook_type: MemHookType, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error> where F: Fn(&Unicorn, MemType, u64, usize, i64) -> bool + 'static { ... } fn add_insn_in_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error> where F: Fn(&Unicorn, u32, usize) -> u32 + 'static { ... } fn add_insn_out_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error> where F: Fn(&Unicorn, u32, usize, u32) + 'static { ... } fn add_insn_sys_hook<F>( &mut self, insn_type: InsnSysX86, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error> where F: Fn(&Unicorn) + 'static { ... } fn remove_hook(&mut self, hook: uc_hook) -> Result<(), Error> { ... } fn errno(&self) -> Error { ... } fn query(&self, query: Query) -> Result<usize, Error> { ... } fn context_save(&self) -> Result<Context, Error> { ... } fn context_restore(&self, context: &Context) -> Result<(), Error> { ... }
}

Required Associated Types§

Required Methods§

Source

fn emu(&self) -> &Unicorn

Source

fn mut_emu(&mut self) -> &mut Unicorn

Provided Methods§

Source

fn reg_read(&self, reg: Self::Reg) -> Result<u64, Error>

Read an unsigned value from a register.

Source

fn reg_read_i32(&self, reg: Self::Reg) -> Result<i32, Error>

Read a signed 32-bit value from a register.

Source

unsafe fn reg_write_generic<T: Sized>( &self, reg: Self::Reg, value: T, ) -> Result<(), Error>

Write a generic type to a register.

Source

fn reg_write(&self, reg: Self::Reg, value: u64) -> Result<(), Error>

Write an unsigned value register.

Source

fn reg_write_i32(&self, reg: Self::Reg, value: i32) -> Result<(), Error>

Write a signed 32-bit value to a register.

Source

fn mem_map( &self, address: u64, size: size_t, perms: Protection, ) -> Result<(), Error>

Map a memory region in the emulator at the specified address.

address must be aligned to 4kb or this will return Error::ARG. size must be a multiple of 4kb or this will return Error::ARG.

Examples found in repository?
examples/test.rs (line 28)
5fn main() {
6    let (major, minor) = unicorn::unicorn_version();
7    println!("version : {}.{}", major, minor);
8    println!(
9        "Support for:\n\t x86: {}\n\t arm: {}\n\t mips: {}",
10        unicorn::arch_supported(unicorn::Arch::X86),
11        unicorn::arch_supported(unicorn::Arch::ARM),
12        unicorn::arch_supported(unicorn::Arch::MIPS)
13    );
14
15    let emu = CpuARM::new(unicorn::Mode::THUMB).expect("failed to create emulator");
16
17    let page_size = emu
18        .query(unicorn::Query::PAGE_SIZE)
19        .expect("failed to query page size");
20    println!("page size : {}", page_size);
21    let hardware_mode = emu
22        .query(unicorn::Query::MODE)
23        .expect("failed to query hardware mode");
24    println!("hardware mode : {}", hardware_mode);
25
26    println!("Sample error message : {}", unicorn::Error::HOOK.msg());
27
28    emu.mem_map(0x10000, 0x4000, unicorn::Protection::ALL)
29        .expect("failed to map first memory region");
30    emu.mem_map(0x20000, 0x4000, unicorn::Protection::ALL)
31        .expect("failed to map second memory region");
32    let regions = emu
33        .mem_regions()
34        .expect("failed to retrieve memory mappings");
35    println!("Regions : {}", regions.len());
36
37    for region in &regions {
38        println!("{:?}", region);
39    }
40}
Source

unsafe fn mem_map_ptr<T>( &self, address: u64, size: size_t, perms: Protection, ptr: *mut T, ) -> Result<(), Error>

Map an existing memory region in the emulator at the specified address.

This function is marked unsafe because it is the responsibility of the caller to ensure that size matches the size of the passed buffer, an invalid size value will likely cause a crash in unicorn.

address must be aligned to 4kb or this will return Error::ARG.

size must be a multiple of 4kb or this will return Error::ARG.

ptr is a pointer to the provided memory region that will be used by the emulator.

Source

fn mem_unmap(&self, address: u64, size: size_t) -> Result<(), Error>

Unmap a memory region.

address must be aligned to 4kb or this will return Error::ARG. size must be a multiple of 4kb or this will return Error::ARG.

Source

fn mem_write(&self, address: u64, bytes: &[u8]) -> Result<(), Error>

Write a range of bytes to memory at the specified address.

Source

fn mem_read(&self, address: u64, bytes: &mut [u8]) -> Result<(), Error>

Read a range of bytes from memory at the specified address.

Source

fn mem_read_as_vec(&self, address: u64, size: usize) -> Result<Vec<u8>, Error>

Read a range of bytes from memory at the specified address; return the bytes read as a Vec.

Source

fn mem_protect( &self, address: u64, size: usize, perms: Protection, ) -> Result<(), Error>

Set the memory permissions for an existing memory region.

address must be aligned to 4kb or this will return Error::ARG. size must be a multiple of 4kb or this will return Error::ARG.

Source

fn mem_regions(&self) -> Result<Vec<MemRegion>, Error>

Returns a vector with the memory regions that are mapped in the emulator.

Examples found in repository?
examples/test.rs (line 33)
5fn main() {
6    let (major, minor) = unicorn::unicorn_version();
7    println!("version : {}.{}", major, minor);
8    println!(
9        "Support for:\n\t x86: {}\n\t arm: {}\n\t mips: {}",
10        unicorn::arch_supported(unicorn::Arch::X86),
11        unicorn::arch_supported(unicorn::Arch::ARM),
12        unicorn::arch_supported(unicorn::Arch::MIPS)
13    );
14
15    let emu = CpuARM::new(unicorn::Mode::THUMB).expect("failed to create emulator");
16
17    let page_size = emu
18        .query(unicorn::Query::PAGE_SIZE)
19        .expect("failed to query page size");
20    println!("page size : {}", page_size);
21    let hardware_mode = emu
22        .query(unicorn::Query::MODE)
23        .expect("failed to query hardware mode");
24    println!("hardware mode : {}", hardware_mode);
25
26    println!("Sample error message : {}", unicorn::Error::HOOK.msg());
27
28    emu.mem_map(0x10000, 0x4000, unicorn::Protection::ALL)
29        .expect("failed to map first memory region");
30    emu.mem_map(0x20000, 0x4000, unicorn::Protection::ALL)
31        .expect("failed to map second memory region");
32    let regions = emu
33        .mem_regions()
34        .expect("failed to retrieve memory mappings");
35    println!("Regions : {}", regions.len());
36
37    for region in &regions {
38        println!("{:?}", region);
39    }
40}
Source

fn emu_start( &self, begin: u64, until: u64, timeout: u64, count: usize, ) -> Result<(), Error>

Emulate machine code for a specified duration.

begin is the address where to start the emulation. The emulation stops if until is hit. timeout specifies a duration in microseconds after which the emulation is stopped (infinite execution if set to 0). count is the maximum number of instructions to emulate (emulate all the available instructions if set to 0).

Source

fn emu_stop(&self) -> Result<(), Error>

Stop the emulation.

This is usually called from callback function in hooks. NOTE: For now, this will stop the execution only after the current block.

Source

fn add_code_hook<F>( &mut self, hook_type: CodeHookType, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error>
where F: Fn(&Unicorn, u64, u32) + 'static,

Add a code hook.

Source

fn add_intr_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
where F: Fn(&Unicorn, u32) + 'static,

Add an interrupt hook.

Source

fn add_mem_hook<F>( &mut self, hook_type: MemHookType, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error>
where F: Fn(&Unicorn, MemType, u64, usize, i64) -> bool + 'static,

Add a memory hook.

Source

fn add_insn_in_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
where F: Fn(&Unicorn, u32, usize) -> u32 + 'static,

Add an “in” instruction hook.

Source

fn add_insn_out_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
where F: Fn(&Unicorn, u32, usize, u32) + 'static,

Add an “out” instruction hook.

Source

fn add_insn_sys_hook<F>( &mut self, insn_type: InsnSysX86, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error>
where F: Fn(&Unicorn) + 'static,

Add a “syscall” or “sysenter” instruction hook.

Source

fn remove_hook(&mut self, hook: uc_hook) -> Result<(), Error>

Remove a hook.

hook is the value returned by either add_code_hook or add_mem_hook.

Source

fn errno(&self) -> Error

Return the last error code when an API function failed.

Like glibc errno(), this function might not retain its old value once accessed.

Source

fn query(&self, query: Query) -> Result<usize, Error>

Query the internal status of the engine.

Supported queries :

  • Query::PAGE_SIZE : the page size used by the emulator.
  • Query::MODE : the current hardware mode.
Examples found in repository?
examples/test.rs (line 18)
5fn main() {
6    let (major, minor) = unicorn::unicorn_version();
7    println!("version : {}.{}", major, minor);
8    println!(
9        "Support for:\n\t x86: {}\n\t arm: {}\n\t mips: {}",
10        unicorn::arch_supported(unicorn::Arch::X86),
11        unicorn::arch_supported(unicorn::Arch::ARM),
12        unicorn::arch_supported(unicorn::Arch::MIPS)
13    );
14
15    let emu = CpuARM::new(unicorn::Mode::THUMB).expect("failed to create emulator");
16
17    let page_size = emu
18        .query(unicorn::Query::PAGE_SIZE)
19        .expect("failed to query page size");
20    println!("page size : {}", page_size);
21    let hardware_mode = emu
22        .query(unicorn::Query::MODE)
23        .expect("failed to query hardware mode");
24    println!("hardware mode : {}", hardware_mode);
25
26    println!("Sample error message : {}", unicorn::Error::HOOK.msg());
27
28    emu.mem_map(0x10000, 0x4000, unicorn::Protection::ALL)
29        .expect("failed to map first memory region");
30    emu.mem_map(0x20000, 0x4000, unicorn::Protection::ALL)
31        .expect("failed to map second memory region");
32    let regions = emu
33        .mem_regions()
34        .expect("failed to retrieve memory mappings");
35    println!("Regions : {}", regions.len());
36
37    for region in &regions {
38        println!("{:?}", region);
39    }
40}
Source

fn context_save(&self) -> Result<Context, Error>

Save the CPU context into an opaque struct.

Source

fn context_restore(&self, context: &Context) -> Result<(), Error>

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§