
रस्ट में प्रॉक्सी DLL जनरेट करें
cargo install rustdllproxy
यह क्रेट वर्तमान में केवल मानक DLL PE प्रारूप का समर्थन करता है।
Rustdllproxy दो उपकमांड प्रदान करता है:
| कमांड | उद्देश्य |
|---|---|
rustdllproxy new | एक या अधिक मौजूदा DLL से नया प्रॉक्सी cdylib क्रेट उत्पन्न करें। |
rustdllproxy build | .def फ़ाइल को src/lib.rs के साथ सिंक करें और क्रेट बनाएँ। |
rustdllproxy --help # top-level help
rustdllproxy new --help # generation flags
rustdllproxy build --help # build flags
अपना क्रेट उत्पन्न करने से पहले, तय करें कि आप अपना प्रॉक्सी कैसे काम करना चाहते हैं। एक सामान्य पैटर्न सर्च ऑर्डर हाइजैकिंग है, जहाँ आप पहले अपने लक्षित DLL का नाम बदलकर target_.dll जैसा कुछ रखते हैं, और फिर संकलित प्रॉक्सी को target.dll के रूप में उपयोग करते हैं। यह binary -> target.dll -> target_.dll जैसा प्रवाह बनाता है।
आपके उपयोग के मामले के आधार पर आगे बढ़ने के कई रास्ते हैं। हालाँकि, यदि आपको प्रॉक्सी किए जा रहे अंतर्निहित DLL का नाम बदलने की आवश्यकता है, तो उत्पन्न .def फ़ाइल को तदनुसार अपडेट करें।
rustdllproxy new -p path/to/target_.dll -n my_proxy
टिप: rustdllproxy clap के साथ एक CLI के रूप में बनाया गया है। सभी विकल्पों और फ़्लैग्स को देखने के लिए 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वेरिएबल स्वचालित रूप से mutable के रूप में परिभाषित होता है। यदि आवश्यक न हो तो इसे संदर्भित करने की आवश्यकता नहीं है।
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
}
प्रॉक्सी क्रेट निर्देशिका से चलाएँ (या इसे पहले तर्क के रूप में पास करें):
rustdllproxy build [PATH] [--profile <name>] [--no-build] [-- <extra cargo args>]
| फ़्लैग | डिफ़ॉल्ट | प्रभाव |
|---|---|---|
PATH | . | प्रॉक्सी क्रेट रूट का पथ। |
--profile <name> | release | कार्गो बिल्ड प्रोफ़ाइल (release, dev, custom)। |
--no-build | off | .def फ़ाइल को पुनः उत्पन्न करें लेकिन cargo build छोड़ें। |
-- <args> | — | cargo build को शब्दशः अग्रेषित किया गया। |
.def फ़ाइल हर बिल्ड पर पूरी तरह पुनः उत्पन्न होती है, मैन्युअल परिवर्तन अधिलेखित हो जाएंगे। यदि आपको rustdllproxy के निर्माण के तरीके के विरुद्ध मैन्युअल परिवर्तन करने की आवश्यकता है, तो cargo का उपयोग करके इसे पूरा किया जा सकता है।मान लीजिए आप DLL सर्च ऑर्डर हाइजैकिंग के माध्यम से office सॉफ़्टवेयर में उपयोग होने वाले 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 को प्रॉक्सी करना संभव है। यह सुविधा शायद ही कभी उपयोग की जाती है और इसके साथ कुछ महत्वपूर्ण चेतावनियाँ जुड़ी हैं।
कई DLL बंडल करते समय:
रिलीज़ नोट्स CHANGELOG.md में उपलब्ध हैं।
योगदान का स्वागत है! कृपया बेझिझक issues और pull requests सबमिट करें।