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§
Provided Methods§
Sourcefn reg_read(&self, reg: Self::Reg) -> Result<u64, Error>
fn reg_read(&self, reg: Self::Reg) -> Result<u64, Error>
Read an unsigned value from a register.
Sourcefn reg_read_i32(&self, reg: Self::Reg) -> Result<i32, Error>
fn reg_read_i32(&self, reg: Self::Reg) -> Result<i32, Error>
Read a signed 32-bit value from a register.
Sourceunsafe fn reg_write_generic<T: Sized>(
&self,
reg: Self::Reg,
value: T,
) -> Result<(), Error>
unsafe fn reg_write_generic<T: Sized>( &self, reg: Self::Reg, value: T, ) -> Result<(), Error>
Write a generic type to a register.
Sourcefn reg_write(&self, reg: Self::Reg, value: u64) -> Result<(), Error>
fn reg_write(&self, reg: Self::Reg, value: u64) -> Result<(), Error>
Write an unsigned value register.
Sourcefn reg_write_i32(&self, reg: Self::Reg, value: i32) -> Result<(), Error>
fn reg_write_i32(&self, reg: Self::Reg, value: i32) -> Result<(), Error>
Write a signed 32-bit value to a register.
Sourcefn mem_map(
&self,
address: u64,
size: size_t,
perms: Protection,
) -> Result<(), Error>
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?
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 ®ions {
38 println!("{:?}", region);
39 }
40}Sourceunsafe fn mem_map_ptr<T>(
&self,
address: u64,
size: size_t,
perms: Protection,
ptr: *mut T,
) -> Result<(), Error>
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.
Sourcefn mem_unmap(&self, address: u64, size: size_t) -> Result<(), Error>
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.
Sourcefn mem_write(&self, address: u64, bytes: &[u8]) -> Result<(), Error>
fn mem_write(&self, address: u64, bytes: &[u8]) -> Result<(), Error>
Write a range of bytes to memory at the specified address.
Sourcefn mem_read(&self, address: u64, bytes: &mut [u8]) -> Result<(), Error>
fn mem_read(&self, address: u64, bytes: &mut [u8]) -> Result<(), Error>
Read a range of bytes from memory at the specified address.
Sourcefn mem_read_as_vec(&self, address: u64, size: usize) -> Result<Vec<u8>, Error>
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.
Sourcefn mem_protect(
&self,
address: u64,
size: usize,
perms: Protection,
) -> Result<(), Error>
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.
Sourcefn mem_regions(&self) -> Result<Vec<MemRegion>, Error>
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?
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 ®ions {
38 println!("{:?}", region);
39 }
40}Sourcefn emu_start(
&self,
begin: u64,
until: u64,
timeout: u64,
count: usize,
) -> Result<(), Error>
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).
Sourcefn emu_stop(&self) -> Result<(), Error>
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.
Sourcefn add_code_hook<F>(
&mut self,
hook_type: CodeHookType,
begin: u64,
end: u64,
callback: F,
) -> Result<uc_hook, Error>
fn add_code_hook<F>( &mut self, hook_type: CodeHookType, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error>
Add a code hook.
Sourcefn add_intr_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
fn add_intr_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
Add an interrupt hook.
Sourcefn add_mem_hook<F>(
&mut self,
hook_type: MemHookType,
begin: u64,
end: u64,
callback: F,
) -> Result<uc_hook, Error>
fn add_mem_hook<F>( &mut self, hook_type: MemHookType, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error>
Add a memory hook.
Sourcefn add_insn_in_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
fn add_insn_in_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
Add an “in” instruction hook.
Sourcefn add_insn_out_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
fn add_insn_out_hook<F>(&mut self, callback: F) -> Result<uc_hook, Error>
Add an “out” instruction hook.
Sourcefn add_insn_sys_hook<F>(
&mut self,
insn_type: InsnSysX86,
begin: u64,
end: u64,
callback: F,
) -> Result<uc_hook, Error>
fn add_insn_sys_hook<F>( &mut self, insn_type: InsnSysX86, begin: u64, end: u64, callback: F, ) -> Result<uc_hook, Error>
Add a “syscall” or “sysenter” instruction hook.
Sourcefn remove_hook(&mut self, hook: uc_hook) -> Result<(), Error>
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.
Sourcefn errno(&self) -> Error
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.
Sourcefn query(&self, query: Query) -> Result<usize, Error>
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?
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 ®ions {
38 println!("{:?}", region);
39 }
40}Sourcefn context_save(&self) -> Result<Context, Error>
fn context_save(&self) -> Result<Context, Error>
Save the CPU context into an opaque struct.
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.