mod hook_test {
use
super
::
*
;
use std::println;
use winapi::um::winuser::
*
;
use winapi::um::libloaderapi::
*
;
const MAGIC_VALUE: u64
=
1001234
;
fn inline_hook() {
let tp
=
this_process();
tp.sym_init(
None
, true).ok();
type
FnRtlQueryPerformanceCounter
=
extern
"system"
fn(&mut u64)
-
> usize;
let m
=
unsafe { GetProcAddress(GetModuleHandleA(b
"ntdll\0"
.as_ptr() as
*
const i8), b
"RtlQueryPerformanceCounter\0"
.as_ptr() as
*
const i8) };
assert
!(!m.is_null());
HookManager::instance().inline_hook(m as usize, |args: &mut HookArgs| unsafe {
let RtlQueryPerformanceCounter
=
transmute::<_, FnRtlQueryPerformanceCounter>(args.trampoline());
let regs
=
&mut args.regs;
let arg1
=
regs.arg(
1
);
*
regs.ax()
=
RtlQueryPerformanceCounter(transmute(arg1));
*
(arg1 as
*
mut u64)
=
MAGIC_VALUE;
args.reject
=
Some(
if
size_of::<usize>()
=
=
8
{
0
}
else
{
1
});
}, true).expect(
"RtlQueryPerformanceCounter"
);
let mut counter: u64
=
0
;
unsafe {
let RtlQueryPerformanceCounter: FnRtlQueryPerformanceCounter
=
transmute(m);
RtlQueryPerformanceCounter(transmute(&mut counter));
assert_eq!(MAGIC_VALUE, counter);
}
let m
=
unsafe { GetProcAddress(LoadLibraryA(b
"user32\0"
.as_ptr() as
*
const i8), b
"MessageBoxA\0"
.as_ptr() as
*
const i8) };
assert
!(!m.is_null());
static mut CHECK_MSG: u64
=
0
;
unsafe extern
"C"
fn callback(args: &mut HookArgs) {
/
/
let msg: extern
"system"
fn(usize,
*
const u8,
*
const u8, u32)
=
transmute(args.ret);
/
/
msg(
0
, b
"Hooked\0"
.as_ptr(),
"\0"
.as_ptr(),
0
);
CHECK_MSG
=
MAGIC_VALUE;
args.reject
=
Some(
if
cfg!(target_arch
=
"x86_64"
) {
0
}
else
{
4
});
}
HookManager::instance().inline_hook(m as usize, callback as HookCallbackFn, true).expect(
"MessageBoxA"
);
unsafe {
MessageBoxA(std::ptr::null_mut(), b
"error\0"
.as_ptr() as
*
const i8, b
"\0"
.as_ptr() as
*
const i8,
0
);
assert_eq!(MAGIC_VALUE, CHECK_MSG);
}
}
fn table_hook() {
static mut CHECK_HOOK: u64
=
0
;
unsafe {
let m
=
GetProcAddress(LoadLibraryA(b
"kernel32\0"
.as_ptr() as
*
const i8), b
"OutputDebugStringW\0"
.as_ptr() as
*
const i8);
let output_debug_string: extern
"win64"
fn(LPCWSTR)
=
transmute(m);
let address: usize
=
transmute(&output_debug_string);
HookManager::instance().table_hook(address, |_arg: &mut HookArgs| {
println!(
"TableHook success"
);
CHECK_HOOK
=
MAGIC_VALUE;
}, true).expect(
"table hook"
);
let s
=
"OutputDebugString"
.to_wide();
output_debug_string(s.as_ptr());
assert_eq!(MAGIC_VALUE, CHECK_HOOK);
}
}
}