Crates.io | walter |
lib.rs | walter |
version | 0.1.13 |
source | src |
created_at | 2021-07-23 23:22:47.760728 |
updated_at | 2021-07-29 15:54:51.676434 |
description | A simple Rust library for 32 and 64 bit hooking. |
homepage | |
repository | https://github.com/Justfr33z/walter |
max_upload_size | |
id | 426524 |
size | 16,915 |
Walter is a simple hooking library.
Walter supports both 32 and 64 bit.
View the examples on how to hook.
mod bindings {
windows::include_bindings!();
}
use std::ffi::c_void;
use walter::{
TrampolineHook64,
};
use bindings::Windows::Win32::{
System::{
SystemServices::DLL_PROCESS_ATTACH,
LibraryLoader::{
GetProcAddress,
GetModuleHandleA,
},
},
Foundation::{
BOOL,
HANDLE,
HINSTANCE,
},
};
use once_cell::sync::Lazy;
use std::sync::Mutex;
static HOOK: Lazy<Mutex<Option<TrampolineHook64>>> = Lazy::new(|| {
Mutex::new(None)
});
pub extern "stdcall" fn wgl_swap_buffers(hdc: HANDLE) -> BOOL {
let gateway = HOOK
.lock()
.unwrap()
.as_ref()
.unwrap()
.gateway();
let gateway_call: extern "stdcall" fn (hdc: HANDLE) -> BOOL;
gateway_call = unsafe { std::mem::transmute(gateway) };
gateway_call(hdc);
BOOL::from(true)
}
#[no_mangle]
pub extern "stdcall" fn DllMain(_module: HINSTANCE, reason: u32, _reserved: *mut c_void) -> BOOL {
match reason {
DLL_PROCESS_ATTACH => {
let module = unsafe { GetModuleHandleA("opengl32.dll") };
let src_wgl_swap_buffers = unsafe {
GetProcAddress(module, "wglSwapBuffers")
}.unwrap();
let hook = TrampolineHook64::hook(
src_wgl_swap_buffers as *mut c_void,
wgl_swap_buffers as *mut c_void,
20
).unwrap();
*HOOK.lock().unwrap() = Some(hook);
}
_ => {}
}
BOOL::from(true)
}