EntropyReducer: अपने पेलोड की एंट्रॉपी कम करें और इसे सीरियलाइज़्ड लिंक्ड लिस्ट के साथ ऑब्फस्केट करें
यह कैसे काम करता है
EntropyReducer एल्गोरिद्म BUFF_SIZE और NULL_BYTES मानों द्वारा निर्धारित होता है। निम्नलिखित दर्शाता है कि यदि BUFF_SIZE को 4 और NULL_BYTES को 2 पर सेट किया जाए तो EntropyReducer आपके पेलोड को कैसे व्यवस्थित करेगा।

ऑब्फस्केशन एल्गोरिद्म
- EntropyReducer सबसे पहले जाँचता है कि इनपुट रॉ पेलोड का आकार
BUFF_SIZE का गुणज है या नहीं, यदि नहीं, तो यह उसे पैड करके ऐसा बना देता है।
- फिर यह पेलोड से प्रत्येक
BUFF_SIZE चंक लेता है, और InitializePayloadList फ़ंक्शन का उपयोग करके उसके लिए एक लिंक्ड लिस्ट नोड बनाता है, जिससे पेलोड को लिंक्ड लिस्ट के रूप में इनिशियलाइज़ किया जाता है।
- बनाए गए नोड में
NULL_BYTES आकार का एक खाली बफ़र होगा, जिसका उपयोग एंट्रॉपी कम करने के लिए किया जाएगा
- इस बिंदु पर, हालाँकि EntropyReducer ने पेलोड की एंट्रॉपी कम करके अपना कार्य पूरा कर लिया है, यह यहीं नहीं रुकता। फिर यह लिंक्ड लिस्ट में प्रत्येक नोड के क्रम को रैंडमाइज़ करना जारी रखता है, जिससे रॉ पेलोड का क्रम टूट जाता है। यह चरण एक Merge Sort Algorithm के माध्यम से किया जाता है जिसे MergeSort फ़ंक्शन के माध्यम से लागू किया गया है।
- सॉर्ट की गई लिंक्ड लिस्ट रैंडम क्रम में होती है क्योंकि जिस मान पर लिंक्ड लिस्ट को सॉर्ट किया जाता है वह रॉ पेलोड के पहले तीन बाइट्स का XOR मान होता है, यह मान पुनः-व्यवस्थित लिंक्ड लिस्ट में इसकी स्थिति निर्धारित करता है, यह चरण यहाँ देखा जा सकता है
- चूँकि लिंक्ड लिस्ट को फ़ाइल में सहेजना असंभव है क्योंकि यह पॉइंटर्स द्वारा एक साथ जुड़ी होती है। हमें इसे सीरियलाइज़ करने के लिए बाध्य होना पड़ता है।
- उत्पन्न लिंक्ड लिस्ट का सीरियलाइज़ेशन
Obfuscate फ़ंक्शन के माध्यम से यहाँ किया जाता है।
- उसके बाद, सीरियलाइज़्ड डेटा आउटपुट फ़ाइल में लिखे जाने के लिए तैयार होता है।
डीऑब्फस्केशन एल्गोरिद्म
- चूँकि
Obfuscation Algorithm में अंतिम चरण लिंक्ड लिस्ट को सीरियलाइज़ करना था, यहाँ सबसे पहले ऑब्फस्केटेड पेलोड को डी-सीरियलाइज़ करना होगा, जिससे उससे एक लिंक्ड लिस्ट उत्पन्न हो, यह चरण Deobfuscate फ़ंक्शन में यहाँ किया जाता है।
- अगला चरण नोड के Id का उपयोग करके लिंक्ड लिस्ट को सॉर्ट करना है, जो पहले उपयोग किए गए उसी Merge Sort Algorithm का उपयोग करके किया जाता है।
- अब, लिंक्ड लिस्ट सही क्रम में है ताकि पेलोड के बाइट्स को उनके उचित रूप में पुनः-निर्मित किया जा सके। इसलिए हम प्रत्येक नोड से पेलोड के मूल बाइट्स को हटा देते हैं, जैसा कि यहाँ किया गया है।
- अंतिम चरण आवंटित नोड्स को मुक्त करना है, जो यहाँ किया जाता है।
उपयोग
- EntropyReducer बस कमांड लाइन से रॉ पेलोड फ़ाइल पढ़ता है, और ऑब्फस्केटेड संस्करण को उसी फ़ाइल के नाम पर ".ER" उपसर्ग के साथ लिखता है।
- अंतिम ऑब्फस्केटेड पेलोड का आकार
BUFF_SIZE और NULL_BYTES दोनों के मानों के आधार पर भिन्न होता है। हालाँकि, इसे निम्नलिखित समीकरण का उपयोग करके निर्धारित किया जा सकता है
FinalSize = ((OriginalSize + BUFF_SIZE - OriginalSize % BUFF_SIZE ) / BUFF_SIZE) * (BUFF_SIZE + NULL_BYTES + sizeof(INT))
इस रेपो में PoC प्रोजेक्ट का उपयोग ".ER" फ़ाइल को निष्पादित करने के लिए किया जाता है जो इसे डीसेरियलाइज़ और डीऑब्फस्केट करने के उदाहरण के रूप में जनरेट की गई है।
अपने प्रोजेक्ट्स में शामिल करें
आपको बस अपने प्रोजेक्ट में EntropyReducer.c और EntropyReducer.h फ़ाइलें जोड़नी हैं, और Deobfuscate फ़ंक्शन को कॉल करना है। आप संदर्भ के लिए PoC/main.c देख सकते हैं।
आउटपुट उदाहरण
इस उदाहरण में, BUFF_SIZE को 3 पर सेट किया गया था, और NULL_BYTES को 1 पर।
- रॉ पेलोड, पहला पेलोड चंक (
FC 48 83)

- वही पेलोड चंक, लेकिन एक अलग ऑफ़सेट पर

लाभ
- metasploit द्वारा जनरेट किया गया x64 calc शेलकोड
5.883 एंट्रॉपी का है, जिसे pestudio द्वारा देखा गया है।

- वही फ़ाइल, AES एन्क्रिप्टेड,
7.110 की एंट्रॉपी स्कोर करती है।

- RC4 एल्गोरिदम के साथ भी लगभग वही परिणाम;
7.210

- हालाँकि EntropyReducer का उपयोग करने पर, एंट्रॉपी मूल रॉ पेलोड से भी कम स्कोर करती है;
4.093

Merge Sort एल्गोरिदम c-linked-list से लिया गया है।