
Generiere Proxy-DLLs in Rust
cargo install rustdllproxy
Dieses Crate unterstützt derzeit nur das Standard-DLL-PE-Format.
Rustdllproxy stellt zwei Unterbefehle bereit:
| Command | Purpose |
|---|---|
rustdllproxy new | Ein neues Proxy-cdylib-Crate aus einer oder mehreren vorhandenen DLLs erzeugen. |
rustdllproxy build | Die .def-Datei mit src/lib.rs abgleichen und das Crate bauen. |
rustdllproxy --help # top-level help
rustdllproxy new --help # generation flags
rustdllproxy build --help # build flags
Bevor Sie Ihr Crate erzeugen, entscheiden Sie, wie Ihr Proxy funktionieren soll. Ein typisches Muster ist Search-Order-Hijacking, bei dem Sie zuerst Ihre Ziel-DLL in etwas wie target_.dll umbenennen und dann den kompilierten Proxy als target.dll verwenden. Dies erzeugt einen Ablauf ähnlich wie binary -> target.dll -> target_.dll
Es gibt mehrere Möglichkeiten, je nach Anwendungsfall. Falls Sie jedoch die zugrunde liegende, per Proxy ersetzte DLL umbenennen müssen, passen Sie die erzeugte .def-Datei entsprechend an.
rustdllproxy new -p path/to/target_.dll -n my_proxy
Tipp: rustdllproxy ist eine CLI, die mit clap erstellt wurde. Führen Sie rustdllproxy --help aus, um alle Optionen und Flags zu sehen.
Die Makrobibliothek unterstützt 3 Haupttypen von Hooks: prehook, posthook und fullhook.
Ersetzen Sie die #[no_mangle]-Direktive durch das Hook-Makro (lassen Sie den abschließenden Kommentar //<dllname>.dll an Ort und Stelle).
#[prehook("dllbeingproxied.dll", "function_name")] //dllbeingproxied.dll
Füllen Sie die Funktionssignatur aus (deklarieren Sie Eingaben als mut, um sie zu verändern).
Bauen Sie mit rustdllproxy build.
prehookFührt Code vor der ursprünglichen Funktion aus. Ermöglicht es Ihnen, Funktionalität hinzuzufügen oder Eingabevariablen zu verändern.
#[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
}
posthookFührt Code nach der ursprünglichen Funktion aus. Sehen Sie sich den Rückgabewert an und bearbeiten Sie ihn mit der magischen Variablen 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
}
Hinweis: Die Variable
retwird automatisch als veränderbar (mutable) definiert. Sie müssen sie nicht referenzieren, wenn sie nicht benötigt wird.
fullhookBietet vollständige Kontrolle über die Funktionsausführung. Verwalten Sie Rückgabewert und Funktionsaufruf manuell.
#[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
}
Führen Sie den Befehl aus dem Verzeichnis des Proxy-Crates aus (oder übergeben Sie es als erstes Argument):
rustdllproxy build [PATH] [--profile <name>] [--no-build] [-- <extra cargo args>]
| Flag | Default | Effect |
|---|---|---|
PATH | . | Pfad zum Stammverzeichnis des Proxy-Crates. |
--profile <name> | release | Cargo-Build-Profil (release, dev, benutzerdefiniert). |
--no-build | off | Die .def-Datei neu erzeugen, aber cargo build überspringen. |
-- <args> | — | Wird unverändert an cargo build weitergegeben. |
.def-Datei wird bei jedem Build vollständig neu erzeugt, manuelle Änderungen werden überschrieben. Wenn Sie manuelle Änderungen vornehmen müssen, die der Vorgehensweise von rustdllproxy beim Bauen widersprechen, kann Cargo dafür verwendet werden.Angenommen, Sie möchten die in einer Bürosoftware verwendete office.dll per DLL-Suchreihenfolgen-Hijacking modifizieren:
# 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
Build-Dateien befinden sich unter
/target
Es ist möglich, mehrere Ziel-DLLs mit einem einzigen Crate zu proxen. Diese Funktion wird selten genutzt und bringt einige wichtige Hinweise mit sich.
Beim Bündeln mehrerer DLLs:
Versionshinweise finden Sie in CHANGELOG.md.
Wir freuen uns über Beiträge! Erstellen Sie gerne Issues und Pull-Requests.