问题描述
我正在使用 Rust 编写一个将被注入到其他进程的 DLL,我想从该进程的可执行文件中调用位于已知地址的函数。我使用 transmute
将硬编码地址强制转换为函数指针,但我可能有很多函数,我想要一种更简单的管理方法。
理想情况下,我只有 extern "C"
声明,例如与 DLL 链接时,而不是为每个函数使用复制粘贴强制转换的实现。
lib.rs
fn add_one(i: u32) -> u32 {
let add_one_from_exe_location = 0xd51000;
let add_one_from_exe: unsafe extern "C" fn(u32) -> u32 =
unsafe { std::mem::transmute(add_one_from_exe_location as *const ()) };
unsafe { add_one_from_exe(i) }
}
fn hello() {
println!("hello from dll");
println!("1 + 1 = {}",add_one(1));
}
#[no_mangle]
pub extern "stdcall" fn DllMain(
_: winapi::shared::minwindef::HINSTANCE,fdw_reason: winapi::shared::minwindef::DWORD,_lpv_reserved: winapi::shared::minwindef::LPVOID,) -> i32 {
match fdw_reason {
winapi::um::winnt::DLL_PROCESS_ATTACH => {
hello();
}
_ => (),}
true as i32
}
main.rs
#[no_mangle]
extern "C" fn add_one(x: u32) -> u32 {
x + 1
}
fn main() {
use std::{thread,time};
let mut x = 0;
loop {
x = add_one(x);
thread::sleep(time::Duration::from_millis(1000));
println!("{}",x);
}
}
当我注入 DLL 时它会输出
41
hello from dll
1 + 1 = 2
42
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)