
Generate Proxy DLLs in Rust
cargo install rustdllproxy
Cette crate ne prend actuellement en charge que le format PE DLL standard.
Rustdllproxy est fourni avec deux sous-commandes :
| Commande | Fonction |
|---|---|
rustdllproxy new | Génère une nouvelle crate proxy cdylib à partir d'une ou plusieurs DLL existantes. |
rustdllproxy build | Synchronise le fichier .def avec src/lib.rs et compile la crate. |
rustdllproxy --help # aide générale
rustdllproxy new --help # options de génération
rustdllproxy build --help # options de compilation
Avant de générer votre crate, décidez comment vous souhaitez que votre proxy fonctionne. Un motif typique est le détournement de l'ordre de recherche (search order hijacking), où vous commencez par renommer votre DLL cible en quelque chose comme target_.dll, puis utilisez le proxy compilé en tant que target.dll. Cela crée un flux ressemblant à binary -> target.dll -> target_.dll
Plusieurs approches sont possibles selon votre cas d'utilisation. Toutefois, si vous devez renommer la DLL sous-jacente proxyfiée, mettez à jour le fichier .def généré en conséquence.
rustdllproxy new -p path/to/target_.dll -n my_proxy
Astuce : rustdllproxy est construit comme une CLI avec clap. Exécutez rustdllproxy --help pour voir toutes les options et drapeaux.
La bibliothèque de macros prend en charge 3 principaux types de hook : prehook, posthook et fullhook.
Remplacez la directive #[no_mangle] par la macro de hook (laissez le commentaire final //<dllname>.dll en place)
#[prehook("dllbeingproxied.dll", "function_name")] //dllbeingproxied.dll
Renseignez la signature de la fonction (déclarez les entrées comme mut pour les modifier)
Compilez avec rustdllproxy build.
prehookExécute du code avant la fonction d'origine. Permet d'ajouter des fonctionnalités ou de modifier les variables d'entrée.
#[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
}
posthookExécute du code après la fonction d'origine. Visualisez et modifiez la valeur de retour à l'aide de la variable magique 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
}
Remarque : La variable
retest automatiquement définie comme mutable. Vous n'avez pas besoin d'y faire référence si ce n'est pas nécessaire.
fullhookFournit un contrôle complet sur l'exécution de la fonction. Gérez manuellement la valeur de retour et l'appel de la fonction.
#[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
}
Exécutez à partir du répertoire de la crate proxy (ou passez-le comme premier argument) :
rustdllproxy build [PATH] [--profile <name>] [--no-build] [-- <extra cargo args>]
.def est entièrement régénéré à chaque compilation ; les modifications manuelles seront écrasées. Si vous devez apporter des modifications manuelles par rapport à la façon dont rustdllproxy compile, cargo peut être utilisé pour y parvenir..def et les noms de hooks pour récupérer le nom de la DLL sous-jacente avant la compilation. S'il n'y a pas assez d'informations, une erreur sera levée pour expliquer comment cela peut être résolu.Supposons que vous souhaitiez modifier office.dll utilisée dans un logiciel bureautique via le détournement de l'ordre de recherche de 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
Les fichiers de compilation se trouvent dans
/target
Il est possible de proxifier plusieurs DLL cibles avec une seule crate. Cette fonctionnalité est rarement utilisée et comporte quelques mises en garde importantes.
Lors du regroupement de plusieurs DLL :
Les notes de version se trouvent dans CHANGELOG.md.
Les contributions sont les bienvenues ! N'hésitez pas à soumettre des issues et des pull requests.
| Option | Défaut | Effet |
|---|
PATH | . | Chemin vers la racine de la crate proxy. |
--profile <name> | release | Profil de compilation Cargo (release, dev, custom). |
--no-build | off | Régénère le fichier .def mais ignore cargo build. |
-- <args> | — | Transmis tel quel à cargo build. |