
Generate Proxy DLLs in Rust
cargo install rustdllproxy
Este crate actualmente solo es compatible con el formato PE estándar de DLL.
Rustdllproxy incluye dos subcomandos:
| Comando | Propósito |
|---|---|
rustdllproxy new | Genera un nuevo crate proxy cdylib a partir de una o más DLL existentes. |
rustdllproxy build | Sincroniza el archivo .def con src/lib.rs y compila el crate. |
rustdllproxy --help # ayuda de nivel superior
rustdllproxy new --help # opciones de generación
rustdllproxy build --help # opciones de compilación
Antes de generar su crate, decida cómo quiere que funcione su proxy. Un patrón típico es el secuestro por orden de búsqueda, donde primero renombraría su DLL objetivo a algo como target_.dll, y luego usaría el proxy compilado como target.dll. Esto crea un flujo similar a binary -> target.dll -> target_.dll
Hay múltiples caminos a seguir dependiendo de su caso de uso. Sin embargo, si necesita renombrar la DLL subyacente que se está utilizando como proxy, actualice el archivo .def generado en consecuencia.
rustdllproxy new -p path/to/target_.dll -n my_proxy
Consejo: rustdllproxy está construido como una CLI con clap. Ejecute rustdllproxy --help para ver todas las opciones y banderas.
La librería de macros admite 3 tipos principales de hooks: prehook, posthook y fullhook.
Reemplace la directiva #[no_mangle] con la macro de hook (deje el comentario final //<dllname>.dll en su lugar)
#[prehook("dllbeingproxied.dll", "function_name")] //dllbeingproxied.dll
Complete la firma de la función (declare las entradas como mut para modificarlas)
Compile con rustdllproxy build.
prehookEjecuta código antes de la función original. Le permite añadir funcionalidad o modificar variables de entrada.
#[prehook("target.dll", "my_function")] //target.dll
fn my_function(mut param1: i32, mut param2: &str) {
// Su código aquí - se ejecuta antes de la función original
param1 *= 2; // Modifique los parámetros si es necesario
}
posthookEjecuta código después de la función original. Vea y edite el valor de retorno usando la variable mágica ret.
#[posthook("target.dll", "calculate")] //target.dll
fn calculate(input: i32) -> i32 {
// La función original se ejecuta primero
// Luego su código se ejecuta con acceso a 'ret'
ret = ret * 2; // Modificar el valor de retorno
}
Nota: La variable
retse define automáticamente como mutable. No necesita referenciarla si no es necesario.
fullhookProporciona control total sobre la ejecución de la función. Gestione manualmente el valor de retorno y la llamada a la función.
#[fullhook("target.dll", "do_multi_add")] //target.dll
fn do_multi_add(mut a: i32, mut b: i32, mut c: i32) -> i32 {
// Pre-procesamiento
a += 10;
b += 20;
// Llame a la función original con la función mágica func()
let mut return_value: i32 = func(a, b, c);
// Post-procesamiento
return_value *= 2;
// Debe devolver el valor explícitamente
return_value
}
Ejecútelo desde el directorio del crate proxy (o pase la ruta como primer argumento):
rustdllproxy build [PATH] [--profile <name>] [--no-build] [-- <extra cargo args>]
| Bandeja | Predeterminado | Efecto |
|---|---|---|
PATH | . | Ruta a la raíz del crate proxy. |
--profile <name> | release | Perfil de compilación de Cargo (release, dev, personalizado). |
--no-build | off | Regenera el archivo .def pero omite cargo build. |
-- <args> | — | Se reenvía tal cual a cargo build. |
.def se regenera por completo en cada compilación; los cambios manuales se sobrescribirán. Si necesita hacer cambios manuales en la forma en que rustdllproxy compila, puede usar cargo para lograrlo..def y los nombres de los hooks para obtener el nombre de la DLL subyacente antes de compilar. Si no hay suficiente información, se lanzará un error que explicará cómo recuperarla.Digamos que quiere modificar office.dll usada en software de oficina mediante el secuestro por orden de búsqueda de DLL:
# Renombrar la DLL original
mv office.dll office_.dll
rustdllproxy new -p office_.dll -n office_proxy
#[prehook("office_.dll", "open_window")] //office_.dll
fn open_window() {
// Su código personalizado aquí...
println!("La ventana está a punto de abrirse!");
}
cd office_proxy
rustdllproxy build
Los archivos de compilación se encuentran en
/target
Es posible usar como proxy varias DLL objetivo con un solo crate. Esta característica rara vez se usa y conlleva algunas advertencias importantes.
Al empaquetar múltiples DLL:
Las notas de la versión están en CHANGELOG.md.
¡Las contribuciones son bienvenidas! No dude en enviar issues y pull requests.