#dll #rpc #injector #dll-injection #remote-procedure #windows

nightly dll-syringe

用Rust编写的Windows DLL注入库

30个版本

0.15.2 2023年6月5日
0.15.0 2023年1月18日
0.14.0 2022年11月19日
0.13.1 2022年6月22日
0.1.0 2021年7月30日

Windows API中排名第77

Download history 135/week @ 2024-03-13 169/week @ 2024-03-20 157/week @ 2024-03-27 186/week @ 2024-04-03 206/week @ 2024-04-10 113/week @ 2024-04-17 142/week @ 2024-04-24 113/week @ 2024-05-01 109/week @ 2024-05-08 98/week @ 2024-05-15 106/week @ 2024-05-22 104/week @ 2024-05-29 81/week @ 2024-06-05 125/week @ 2024-06-12 110/week @ 2024-06-19 208/week @ 2024-06-26

每月下载量537

MIT许可证

205KB
4K SLoC

dll-syringe

CI crates.io Documentation dependency status MIT

用Rust编写的Windows DLL注入库。

支持场景

注入进程 目标进程 支持?
32位 32位
32位 64位
64位 32位 是(需要特性 into-x86-from-x64
64位 64位

用法

注入 & 弹出

这个crate允许您将DLL注入到目标进程,并弹出。以下示例将“ExampleProcess”进程注入并弹出injection_payload.dll

use dll_syringe::{Syringe, process::OwnedProcess};

// find target process by name
let target_process = OwnedProcess::find_first_by_name("ExampleProcess").unwrap();

// create a new syringe for the target process
let syringe = Syringe::for_process(target_process);

// inject the payload into the target process
let injected_payload = syringe.inject("injection_payload.dll").unwrap();

// do something else

// eject the payload from the target (optional)
syringe.eject(injected_payload).unwrap();

远程过程调用 (RPC)

这个crate支持两种RPC机制。这两种机制都只能单向调用目标进程中的导出函数,且仅适用于一次性初始化使用。对于扩展通信,应使用专门的RPC库。

RemotePayloadProcedure RemoteRawProcedure
特性 rpc-payload rpc-raw
参数和返回要求 序列化+反序列化 Copy,参数大小必须小于目标进程中的usize
函数定义 使用宏 payload_procedure! 任何 extern "system"extern "C",需要#[no_mangle]

RemotePayloadProcedure

一个基于 bincode 的RPC机制。目标过程必须使用宏 payload_procedure! 定义(需要特性 payload-utils)。

一个导出 add 函数的定义可能如下所示

dll_syringe::payload_procedure! {
    fn add(a: f64, b: f64) -> f64 {
        a + b
    }
}

注入/调用者的代码可能如下所示

use dll_syringe::{Syringe, process::OwnedProcess};

// find target process by name
let target_process = OwnedProcess::find_first_by_name("ExampleProcess").unwrap();

// create a new syringe for the target process
let syringe = Syringe::for_process(target_process);

// inject the payload into the target process
let injected_payload = syringe.inject("injection_payload.dll").unwrap();

let remote_add = unsafe { syringe.get_payload_procedure::<fn(f64, f64) -> f64>(injected_payload, "add") }.unwrap().unwrap();
let result = remote_add.call(&2.0, &4.0).unwrap();
println!("{}", result); // prints 6

// eject the payload from the target (optional)
syringe.eject(injected_payload).unwrap();

RemoteRawProcedure

该机制基于动态生成的汇编代码。目标过程可以是任何使用系统或C调用约定的导出函数。这意味着甚至可以直接调用Win32函数。

一个导出 add 函数的定义可能如下所示

#[no_mangle]
extern "system" fn add(a: f64, b: f64) -> f64 {
    a + b
}

注入/调用者的代码可能如下所示

use dll_syringe::{Syringe, process::OwnedProcess};

// find target process by name
let target_process = OwnedProcess::find_first_by_name("ExampleProcess").unwrap();

// create a new syringe for the target process
let syringe = Syringe::for_process(target_process);

// inject the payload into the target process
let injected_payload = syringe.inject("injection_payload.dll").unwrap();

let remote_add = unsafe { syringe.get_raw_procedure::<extern "system" fn(f64, f64) -> f64>(injected_payload, "add") }.unwrap().unwrap();
let result = remote_add.call(2.0, 4.0).unwrap();
println!("{}", result); // prints 6

// eject the payload from the target (optional)
syringe.eject(injected_payload).unwrap();

许可证

MIT许可证下授权(LICENSEhttp://opensource.org/licenses/MIT

来源

灵感来源于来自Sewer(Sewer)的Reloaded.Injector(Reloaded.Injector)。

依赖项

约4–16MB
约214K SLoC