Skip to main content

dobby_hook_core/engine/
mod.rs

1use 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}