有没有更简单的方法在静态地址调用函数?

问题描述

我正在使用 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
}

这是一个可执行文件的示例

ma​​in.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 (将#修改为@)