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
每月下载量537次
205KB
4K SLoC
dll-syringe
用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许可证下授权(LICENSE 或 http://opensource.org/licenses/MIT)
来源
灵感来源于来自Sewer(Sewer)的Reloaded.Injector(Reloaded.Injector)。
依赖项
约4–16MB
约214K SLoC