dobby_hook_core/engine/
mod.rs1use core::ffi::{CStr, c_char, c_void};
2
3mod backend;
4mod imports;
5mod instrument;
6mod manager;
7
8use crate::error::{Error, Result};
9
10pub unsafe fn code_patch(address: *mut c_void, buffer: *const u8, buffer_size: u32) -> Result<()> {
11 if address.is_null() || buffer.is_null() {
12 return Err(Error::NullPointer);
13 }
14 backend::get().code_patch(address, buffer, buffer_size as usize)
15}
16
17pub unsafe fn hook(address: *mut c_void, fake_func: *mut c_void) -> Result<*mut c_void> {
18 if address.is_null() || fake_func.is_null() {
19 return Err(Error::NullPointer);
20 }
21 manager::hook(address, fake_func)
22}
23
24pub unsafe fn destroy(address: *mut c_void) -> Result<()> {
25 if address.is_null() {
26 return Err(Error::NullPointer);
27 }
28 manager::destroy(address)
29}
30
31pub unsafe fn symbol_resolver(
32 image_name: *const c_char,
33 symbol_name: *const c_char,
34) -> *mut c_void {
35 backend::get().symbol_resolver(image_name, symbol_name)
36}
37
38pub fn resolve_symbol(image_name: Option<&CStr>, symbol_name: &CStr) -> *mut c_void {
39 unsafe {
40 symbol_resolver(
41 image_name.map_or(core::ptr::null(), CStr::as_ptr),
42 symbol_name.as_ptr(),
43 )
44 }
45}
46
47pub fn import_table_replace(
48 image_name: Option<&CStr>,
49 symbol_name: &CStr,
50 fake_func: *mut c_void,
51) -> Result<*mut c_void> {
52 if fake_func.is_null() {
53 return Err(Error::NullPointer);
54 }
55 imports::import_table_replace(image_name, symbol_name, fake_func)
56}
57
58pub fn instrument(
59 address: *mut c_void,
60 pre_handler: unsafe fn(address: *mut c_void, context: *mut c_void),
61) -> Result<()> {
62 instrument::instrument(address, pre_handler)
63}