दस्तावेज़ीकरण
/
VM ऑब्फ़स्केशन
/

VM कोड को कैसे बदलता है

VM कोड को कैसे बदलता है

देखें

Obfuscator.io: Targeting Functions in VM Obfuscation (IIFE and Comment Mode)

YouTube पर देखें

vmTargetFunctionsMode: 'root' (डिफ़ॉल्ट) के साथ, VM ऑब्फ़स्केशन हर रूट-लेवल के फ़ंक्शन (या, vmAsyncExecutor के साथ, हर सबसे बाहरी async फ़ंक्शन) की बॉडी को बाइटकोड में बदल देता है। रूट-लेवल के फ़ंक्शन्स अपने नाम बनाए रखते हैं; नेस्टेड फ़ंक्शन्स के नाम सामान्य रूप से बदले जाते हैं। इसके बजाय किसी भी नेस्टिंग स्तर पर अलग-अलग फ़ंक्शन्स चुनने के लिए comment मोड का उपयोग करें।

JavaScript

यह डिज़ाइन उस कोड के साथ संगतता बनाए रखता है जो इन फ़ंक्शन्स को ग्लोबल स्कोप से कॉल करता है या उन्हें ग्लोबल ऑब्जेक्ट पर मौजूद मानता है। फ़ंक्शन बॉडी पूरी तरह सुरक्षित रहती है, लेकिन नाम दिखाई देता रहता है, और ऑब्फ़स्केटर ऐसे नामों की सूची के साथ VMGlobalFunctionNamesNotRenamed चेतावनी देता है।

VM ऑब्फ़स्केशन फ़ंक्शन बॉडी की सुरक्षा करता है, और vmWrapTopLevelInitializers चालू होने पर टॉप-लेवल वेरिएबल इनिशियलाइज़र्स की भी (नीचे देखें)। अगर इनपुट में न कोई फ़ंक्शन है और न ऐसा कोई इनिशियलाइज़र - केवल टॉप-लेवल कोड, जैसे alert(1); - तो कुछ भी वर्चुअलाइज़ नहीं होता: बाकी ऑब्फ़स्केशन फिर भी चलता है, लेकिन कोई VM सुरक्षा लागू नहीं होती, और ऑब्फ़स्केटर VMNoFunctionsToVirtualize चेतावनी देता है (v7.14.1+; स्वयं 7.14.0 अक्षम है)। यह तब भी आती है जब फ़ंक्शन मौजूद हों लेकिन हर एक छोड़ दिया गया हो (उदाहरण के लिए, डायरेक्ट eval या डायनामिक new Function, vmTargetFunctions/vmExcludeFunctions के कारण कुछ भी न चुना जाना, या vmAsyncExecutor को कोई async फ़ंक्शन न मिलना)। जिस कोड को सुरक्षित करना है, उसे किसी फ़ंक्शन में रैप करें, उदाहरण के लिए एक IIFE में।

टॉप-लेवल इनिशियलाइज़र्स

root मोड में, vmWrapTopLevelInitializers योग्य टॉप-लेवल वेरिएबल इनिशियलाइज़र्स, जैसे const MY_STRING = 'my-string';, को IIFE में रैप करता है, ताकि उनके मान सादे JavaScript के रूप में दिखने के बजाय बाइटकोड में चले जाएँ। मौजूदा VM प्रीसेट इसे चालू रखते हैं। यह केवल वेरिएबल इनिशियलाइज़र्स पर लागू होता है, अन्य टॉप-लेवल स्टेटमेंट्स पर नहीं, और comment मोड में इसका कोई प्रभाव नहीं होता। जो इनिशियलाइज़र्स सादे JavaScript में रह जाते हैं, वे VMTopLevelInitializerNotVirtualized चेतावनी में सूचीबद्ध होते हैं।

संवेदनशील फ़ंक्शन नाम छिपाना

चूँकि root मोड नाम बनाए रखता है, इसलिए validateLicense या decryptData जैसा कुछ बता देने वाला नाम, बॉडी के बाइटकोड बन जाने के बाद भी पढ़ने योग्य रहता है। इसका समाधान फ़ंक्शन को टॉप लेवल से हटाना है - उसे किसी IIFE में रैप करें, जहाँ वह रूट-लेवल का नहीं रहता और नाम सहित पूरी तरह VM में बदल दिया जाता है - या renameGlobals से रूट-लेवल के आइडेंटिफ़ायर्स का नाम बदलना है। दोनों तकनीकों और उनके समझौतों के लिए LLM विश्लेषण से फ़ंक्शन नाम छिपाना देखें।