Skip to content

Commit ca81d46

Browse files
authored
Merge pull request #1574 from nviennot/dev
Rust bindings for insn_invalid_hook
2 parents ec808c9 + af8a409 commit ca81d46

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

bindings/rust/src/ffi.rs

+12
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,18 @@ pub extern "C" fn insn_in_hook_proxy<D, F>(
188188
(user_data.callback)(&mut user_data.uc, port, size);
189189
}
190190

191+
pub extern "C" fn insn_invalid_hook_proxy<D, F>(
192+
uc: uc_handle,
193+
user_data: *mut UcHook<D, F>,
194+
) -> bool
195+
where
196+
F: FnMut(&mut crate::Unicorn<D>) -> bool,
197+
{
198+
let user_data = unsafe { &mut *user_data };
199+
debug_assert_eq!(uc, user_data.uc.get_handle());
200+
(user_data.callback)(&mut user_data.uc)
201+
}
202+
191203
pub extern "C" fn insn_out_hook_proxy<D, F>(
192204
uc: uc_handle,
193205
port: u32,

bindings/rust/src/lib.rs

+33
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,39 @@ impl<'a, D> Unicorn<'a, D> {
755755
}
756756
}
757757

758+
/// Add hook for invalid instructions
759+
pub fn add_insn_invalid_hook<F: 'a>(&mut self, callback: F) -> Result<ffi::uc_hook, uc_error>
760+
where
761+
F: FnMut(&mut Unicorn<D>) -> bool,
762+
{
763+
let mut hook_ptr = core::ptr::null_mut();
764+
let mut user_data = Box::new(ffi::UcHook {
765+
callback,
766+
uc: Unicorn {
767+
inner: self.inner.clone(),
768+
},
769+
});
770+
771+
let err = unsafe {
772+
ffi::uc_hook_add(
773+
self.get_handle(),
774+
&mut hook_ptr,
775+
HookType::INSN_INVALID,
776+
ffi::insn_invalid_hook_proxy::<D, F> as _,
777+
user_data.as_mut() as *mut _ as _,
778+
0,
779+
0,
780+
)
781+
};
782+
if err == uc_error::OK {
783+
self.inner_mut().hooks.push((hook_ptr, user_data));
784+
785+
Ok(hook_ptr)
786+
} else {
787+
Err(err)
788+
}
789+
}
790+
758791
/// Add hook for x86 IN instruction.
759792
pub fn add_insn_in_hook<F: 'a>(&mut self, callback: F) -> Result<ffi::uc_hook, uc_error>
760793
where

0 commit comments

Comments
 (0)