6 个版本
0.2.0 | 2023 年 11 月 3 日 |
---|---|
0.1.4 | 2023 年 11 月 3 日 |
0.1.1 | 2021 年 6 月 1 日 |
0.1.0 | 2021 年 2 月 22 日 |
#1777 在 Rust 模式
15KB
301 行
getfn
通过指针引用函数的实用工具。
使用 getfn!
宏,你可以生成一对函数:第一个函数充当“获取器”函数,前缀为 getfn_
。第二个函数简单地调用函数
use getfn::getfn;
getfn! {
(|| { println!("hi!"); })
fn my_func();
}
my_func(); // hi!
let f = getfn_my_func();
f(); // hi!
你可能想知道为什么不用 let f = my_func;
而是使用单独的获取器。原因是 f
中的结果函数指针不会与 getfn!
传入的地址完全相同。这在游戏修改等情况下是必要的,在这种情况下,为了 挂钩 函数,你必须有它的确切地址。为了帮助这些用例,getfn
还提供了一个 get_addr!
宏,它是一个用于获取函数地址的 DSL
// gets the base address of the `MyGame.exe` module using the backend
// specified via features (currently supported are `winapi` and `libc`).
let f = getfn::get_addr!("MyGame.exe" + 0x20bf00);
这些可以使用 symbol_fn!
宏组合在一起
use getfn::symbol_fn;
use std::ffi::c_void;
symbol_fn! {
("MyGame.exe" + 0x20bf00)
extern "C" fn my_game_func(a: i32) -> bool;
}
println!("{}", my_game_func(5));
let func = getfn_my_game_func();
extern "C" fn detour(a: i32) -> bool { a == 5 }
// .. hook `func` ..
let mut orig = std::ptr::null_mut();
MH_CreateHook(func as *mut c_void, detour, &mut orig as *mut _ as _);
许可
许可如下
- Apache 许可证第 2 版 (LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。