
ROP और हार्डवेयर ब्रेकपॉइंट का उपयोग करके मेमोरी आर्टिफैक्ट्स को छिपाएं।
यह उपकरण एक सरल PoC है कि कैसे ROP चेन और हार्डवेयर ब्रेकपॉइंट्स के संयोजन का उपयोग करके मेमोरी आर्टिफैक्ट्स को छिपाया जा सकता है। ROP चेन स्लीपिंग के दौरान (यानी जब Sleep फ़ंक्शन कॉल किया जाता है) मुख्य मॉड्यूल के मेमोरी पेज के प्रोटेक्शन को N/A में बदल देगी। इस मेमोरी स्कैनिंग एवेज़न तकनीक के बारे में अधिक विस्तृत जानकारी के लिए मूल प्रोजेक्ट Gargoyle देखें। केवल x64।
विचार kernel32!Sleep में एक हार्डवेयर ब्रेकपॉइंट और एक्सेप्शन को हैंडल करने के लिए एक नया टॉप-लेवल फ़िल्टर सेट करना है। जब Sleep कॉल की जाती है, तो पहले से सेट किया गया एक्सेप्शन फ़िल्टर फ़ंक्शन ट्रिगर होता है, जो हमें क्लासिक फ़ंक्शन हुक का उपयोग किए बिना ROP चेन को कॉल करने की अनुमति देता है। इस तरह, हम प्रक्रिया में सामान्य DLLs से संबंधित अजीब और असामान्य निजी मेमोरी क्षेत्रों को छोड़ने से बचते हैं।
ROP चेन बस VirtualProtect() को कॉल करके वर्तमान मेमोरी पेज को N/A पर सेट करती है, फिर SleepEx को कॉल करती है और अंत में RX मेमोरी प्रोटेक्शन को पुनर्स्थापित करती है।
प्रक्रिया का अवलोकन इस प्रकार है:
यह प्रक्रिया अनिश्चित काल तक दोहराई जाती है।
जैसा कि छवि में देखा जा सकता है, स्लीपिंग के दौरान मुख्य मॉड्यूल की मेमोरी प्रोटेक्शन को N/A में बदल दिया जाता है, जो निष्पादन अनुमति वाले पृष्ठों की खोज करने वाले मेमोरी स्कैन से बचाता है।

चूँकि हम स्ट्रिंग लिटरल्स को अस्पष्ट करने के लिए LITCRYPT प्लगइन का उपयोग कर रहे हैं, इसलिए कोड को संकलित करने से पहले LITCRYPT_ENCRYPT_KEY एनवायरनमेंट वेरिएबल सेट करना आवश्यक है:
C:\Users\User\Desktop\RustChain> set LITCRYPT_ENCRYPT_KEY="yoursupersecretkey"
इसके बाद, बस कोड संकलित करें और उपकरण चलाएँ:
C:\Users\User\Desktop\RustChain> cargo build
C:\Users\User\Desktop\RustChain\target\debug> rustchain.exe
यह उपकरण केवल एक PoC है और पूरी तरह कार्यात्मक होने के लिए कुछ अतिरिक्त सुविधाओं को लागू किया जाना चाहिए। परियोजना का मुख्य उद्देश्य यह सीखना था कि ROP चेन को कैसे कार्यान्वित किया जाए और इसे Rust के भीतर कैसे एकीकृत किया जाए। इस कारण, यह उपकरण केवल तभी काम करेगा जब आप इसे वैसे ही उपयोग करेंगे जैसा यह है, और यदि आप इसे अन्य तरीकों से उपयोग करने का प्रयास करते हैं (उदाहरण के लिए, इसे dll में संकलित करना और प्रतिबिंबित रूप से लोड और निष्पादित करने का प्रयास करना) तो विफलताओं की उम्मीद है।