
Genera DLL proxy in Rust
cargo install rustdllproxy
Questa crate attualmente supporta solo il formato standard PE delle DLL.
Rustdllproxy include due sottocomandi:
| Comando | Scopo |
|---|---|
rustdllproxy new | Genera una nuova proxy crate cdylib da una o più DLL esistenti. |
rustdllproxy build | Sincronizza il file .def con src/lib.rs e compila la crate. |
rustdllproxy --help # top-level help
rustdllproxy new --help # generation flags
rustdllproxy build --help # build flags
Prima di generare la tua crate, decidi come vuoi che funzioni il tuo proxy. Un pattern tipico è l'hijacking dell'ordine di ricerca (search order hijacking), in cui si rinomina prima la DLL target in qualcosa come target_.dll, e poi si usa il proxy compilato come target.dll. Questo crea un flusso del tipo binary -> target.dll -> target_.dll.
Ci sono più strade possibili a seconda del tuo caso d'uso. Se però devi rinominare la DLL sottostante di cui stai facendo da proxy, aggiorna di conseguenza il file .def generato.
rustdllproxy new -p path/to/target_.dll -n my_proxy
Suggerimento: rustdllproxy è costruito come CLI con clap. Esegui rustdllproxy --help per vedere tutte le opzioni e le flag.
La libreria di macro supporta 3 tipi principali di hook: prehook, posthook e fullhook.
Sostituisci la direttiva #[no_mangle] con la macro dell'hook (lascia al suo posto il commento finale //<dllname>.dll)
#[prehook("dllbeingproxied.dll", "function_name")] //dllbeingproxied.dll
Compila la firma della funzione (dichiara gli input come mut per modificarli)
Compila con rustdllproxy build.
prehookEsegue codice prima della funzione originale. Permette di aggiungere funzionalità o modificare le variabili di input.
#[prehook("target.dll", "my_function")] //target.dll
fn my_function(mut param1: i32, mut param2: &str) {
// Your code here - executes before original function
param1 *= 2; // Modify parameters if needed
}
posthookEsegue codice dopo la funzione originale. Visualizza e modifica il valore di ritorno usando la variabile magica ret.
#[posthook("target.dll", "calculate")] //target.dll
fn calculate(input: i32) -> i32 {
// Original function executes first
// Then your code runs with access to 'ret'
ret = ret * 2; // Modify return value
}
Nota: La variabile
retè definita automaticamente come mutabile. Non è necessario referenziarla se non serve.
fullhookFornisce controllo completo sull'esecuzione della funzione. Gestisci manualmente il valore di ritorno e la chiamata della funzione.
#[fullhook("target.dll", "do_multi_add")] //target.dll
fn do_multi_add(mut a: i32, mut b: i32, mut c: i32) -> i32 {
// Pre-processing
a += 10;
b += 20;
// Call original function with magic func()
let mut return_value: i32 = func(a, b, c);
// Post-processing
return_value *= 2;
// Must explicitly return the value
return_value
}
Esegui dalla directory della proxy crate (o passala come primo argomento):
rustdllproxy build [PATH] [--profile <name>] [--no-build] [-- <extra cargo args>]
| Flag | Default | Effetto |
|---|---|---|
PATH | . | Percorso della directory radice della proxy crate. |
--profile <name> | release | Profilo di build di Cargo (release, dev, custom). |
--no-build | off | Rigenera il file .def ma salta cargo build. |
-- <args> | — | Inoltrato così com'è a cargo build. |
.def viene rigenerato completamente a ogni build; le modifiche manuali verranno sovrascritte. Se hai bisogno di apportare modifiche manuali al modo in cui rustdllproxy compila, puoi usare cargo per farlo.Supponiamo che tu voglia modificare office.dll usata in un software office tramite dirottamento dell'ordine di ricerca delle DLL:
# Rename the original DLL
mv office.dll office_.dll
rustdllproxy new -p office_.dll -n office_proxy
#[prehook("office_.dll", "open_window")] //office_.dll
fn open_window() {
// Your custom code here...
println!("Window is about to open!");
}
cd office_proxy
rustdllproxy build
I file di build si trovano sotto
/target
È possibile fare da proxy a più DLL target con una singola crate. Questa funzionalità è usata raramente e comporta alcune importanti avvertenze.
Quando si includono più DLL:
Le note di rilascio sono in CHANGELOG.md.
I contributi sono benvenuti! Non esitare a inviare issue e pull request.