रजिस्टर-आधारित VM
तेज़ रनटाइम और डिफ़ॉल्ट से भिन्न VM स्वरूप के लिए VM को रजिस्टर-आधारित निष्पादन मॉडल पर स्विच करें।
vmRegisterBased विकल्प VM को उसके डिफ़ॉल्ट स्टैक-आधारित बाइटकोड से रजिस्टर-आधारित निष्पादन मॉडल पर स्विच करता है। कुछ मामलों में यह VM के रनटाइम प्रदर्शन को लगभग 15-20 % सुधारता है, थोड़े बड़े ऑब्फ़स्केटेड बंडल की कीमत पर।
स्टैक-आधारित बनाम रजिस्टर-आधारित
स्टैक-आधारित VM ऑपरैंड्स को एक अंतर्निहित स्टैक पर रखती है: हर मान पुश किया जाता है, अगली इंस्ट्रक्शन द्वारा उपयोग किया जाता है, और परिणाम वापस पुश कर दिया जाता है। रजिस्टर-आधारित VM इसके बजाय अपने ऑपरैंड्स को सीधे संबोधित करती है, इसलिए वही काम कम इंस्ट्रक्शन में और उनके बीच बिना किसी push/pop ट्रैफ़िक के व्यक्त होता है। रनटाइम लाभ यहीं से आता है — और यही कारण है कि बाइटकोड थोड़ा बढ़ता है, क्योंकि अब हर इंस्ट्रक्शन को यह बताना पड़ता है कि वह कौन-से रजिस्टर पढ़ती और लिखती है, बजाय उन्हें स्टैक पर अंतर्निहित छोड़ने के।
कोई भी मॉडल यह नहीं बदलता कि आपका कोड क्या करता है या VM क्या सुरक्षित करती है। ये एक ही वर्चुअलाइज़्ड लॉजिक के दो एन्कोडिंग हैं; रजिस्टर-आधारित बस थोड़े आकार के बदले थोड़ी गति का सौदा करता है।
इसे कब उपयोग करें
जब VM की रनटाइम लागत मायने रखती हो तब इसे अपनाएँ। वर्चुअलाइज़्ड कोड डिज़ाइन के अनुसार सादे JavaScript से धीमा होता है, इसलिए किसी हॉट पाथ पर — एक एनिमेशन लूप, प्रति-फ़्रेम हैंडलर, एक कसी हुई पार्सिंग रूटीन — रजिस्टर-आधारित एग्ज़ीक्यूटर जो ~15-20 % बचा सकता है वह बड़े बंडल के लायक है। जो कोड कभी-कभार चलता है, उसमें आकार की लागत आमतौर पर सार्थक नहीं होती।
यह VM के स्वरूप को भी विविध बनाता है। चूँकि यह संरचनात्मक रूप से भिन्न बाइटकोड और एग्ज़ीक्यूटर उत्पन्न करता है, आउटपुट डिफ़ॉल्ट स्टैक-आधारित VM की तुलना में अधिक विशिष्ट फ़िंगरप्रिंट रखता है। यदि आप चाहते हैं कि भेजी गई VM आम स्टैक-आधारित जैसी कम दिखे — ताकि वह सामान्य, पैटर्न-आधारित विश्लेषण के लिए कम पहचानने योग्य हो — तो इसे बदलने का यह एक तरीका है।
यह अंदरूनी तौर पर कैसे काम करता है
यह कोई नेटिव रजिस्टर-आधारित कंपाइलर नहीं है। सामान्य स्टैक-आधारित कंपाइलर अब भी बाइटकोड ठीक वैसे ही बनाता है जैसे इस विकल्प के बिना; फिर एक अलग ट्रांसफ़ॉर्मेशन चरण उस बाइटकोड को रजिस्टर-आधारित रूप में फिर से लिखता है। व्यावहारिक परिणाम यह है कि VM ऑब्फ़स्केशन का बाकी सब कुछ — टारगेटिंग, बाइटकोड एन्कोडिंग, डिस्पैचर विकल्प — वैसे ही व्यवहार करता है, क्योंकि रजिस्टर-आधारित मोड इन सबके नीचे (डाउनस्ट्रीम) बैठता है।
आवश्यकताएँ
vmObfuscationआवश्यक है — यह विकल्प केवल उस VM को पुनः आकार देता है जिसेvmObfuscationउत्पन्न करता है।- ऑब्फ़स्केटर संस्करण 7.12.0 या उसके बाद का।
उदाहरण
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmRegisterBased: true
});
