
Generate Proxy DLLs in Rust
cargo install rustdllproxy
تدعم هذه الحزمة (crate) حالياً تنسيق PE القياسي لملفات DLL فقط.
تأتي أداة Rustdllproxy مع أمرين فرعيين:
| الأمر | الغرض |
|---|---|
rustdllproxy new | إنشاء crate من نوع cdylib وكيل جديد من ملف DLL واحد أو أكثر. |
rustdllproxy build | مزامنة ملف .def مع src/lib.rs وبناء crate. |
rustdllproxy --help # top-level help
rustdllproxy new --help # generation flags
rustdllproxy build --help # build flags
قبل إنشاء crate الخاص بك، قرر كيف تريد أن يعمل الوكيل (proxy). النمط الشائع هو اختطاف ترتيب البحث (search order hijacking)، حيث تقوم أولاً بإعادة تسمية DLL الهدف إلى اسم مثل target_.dll، ثم تستخدم الوكيل المُجمَّع كـ target.dll. وينتج عن ذلك تدفق يشبه binary -> target.dll -> target_.dll.
هناك مسارات متعددة أمامك حسب حالة الاستخدام. ومع ذلك، إذا كنت بحاجة إلى إعادة تسمية DLL الأساسي الذي يتم التوكيل عنه، فحدّث ملف .def المُنشأ وفقاً لذلك.
rustdllproxy new -p path/to/target_.dll -n my_proxy
نصيحة: تم بناء rustdllproxy كواجهة سطر أوامر (CLI) باستخدام clap. قم بتشغيل
rustdllproxy --helpلرؤية جميع الخيارات والأعلام.
تدعم مكتبة الماكرو 3 أنواع رئيسية من الخطافات: prehook وposthook وfullhook.
استبدل التوجيه #[no_mangle] بماكرو الخطاف (اترك التعليق اللاحق //<dllname>.dll في مكانه).
#[prehook("dllbeingproxied.dll", "function_name")] //dllbeingproxied.dll
املأ توقيع الدالة (قم بتعريف المدخلات كـ mut لتعديلها).
قم بالبناء باستخدام rustdllproxy build.
prehookينفّذ الكود قبل الدالة الأصلية. يتيح لك إضافة وظائف أو تعديل متغيرات الإدخال.
#[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
}
posthookينفّذ الكود بعد الدالة الأصلية. يمكنك عرض وتعديل القيمة المُرجعة باستخدام المتغير السحري 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
}
ملاحظة: يتم تعريف المتغير
retتلقائياً كمتغير قابل للتغيير. لست بحاجة إلى الإشارة إليه إذا لم يكن ضرورياً.
fullhookيوفر تحكماً كاملاً في تنفيذ الدالة. يمكنك إدارة القيمة المُرجعة واستدعاء الدالة يدوياً.
#[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
}
قم بالتشغيل من دليل crate الوكيل (أو مرّره كوسيطة أولى):
rustdllproxy build [PATH] [--profile <name>] [--no-build] [-- <extra cargo args>]
.def بالكامل في كل بناء، وسيتم استبدال أي تغييرات يدوية. إذا كنت بحاجة إلى إجراء تغييرات يدوية تخالف طريقة بناء rustdllproxy، يمكن استخدام cargo لتحقيق ذلك..def، وأسماء الخطافات لاسترجاع اسم DLL الأساسي قبل البناء. إذا لم تكن هناك معلومات كافية، فسيتم طرح خطأ يشرح كيفية معالجة ذلك.لنفترض أنك تريد تعديل office.dll المستخدم في برامج Office عبر اختطاف ترتيب البحث في 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
توجد ملفات البناء داخل
/target
من الممكن عمل وكيل لعدة ملفات DLL هدفية باستخدام crate واحد. نادراً ما تُستخدم هذه الميزة وتأتي مع بعض المحاذير المهمة.
عند تجميع عدة ملفات DLL:
ملاحظات الإصدار موجودة في CHANGELOG.md.
المساهمات مرحب بها! لا تتردد في تقديم المشكلات (issues) وطلبات السحب (pull requests).
| الخيار | الافتراضي | التأثير |
|---|
PATH | . | المسار إلى جذر crate الوكيل. |
--profile <name> | release | ملف تعريف بناء Cargo (release، dev، مخصص). |
--no-build | معطّل | إعادة توليد ملف .def مع تخطي cargo build. |
-- <args> | — | تُمرَّر حرفياً إلى cargo build. |