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

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

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

vmTargetFunctionsMode: 'root' (डिफ़ॉल्ट) के साथ, VM ऑब्फ़स्केशन हर रूट-स्तरीय फ़ंक्शन की बॉडी को बाइटकोड में बदल देता है (यह vmObfuscationThreshold पर निर्भर करता है), लेकिन फ़ंक्शन का नाम वैसा ही रहने देता है।

// Input
function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

// Output - function NAME is preserved, BODY is VM-transformed
function fibonacci(b) {  // name kept as-is
    return vm.call(...); // body converted to bytecode
}

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

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

अगर किसी फ़ंक्शन का नाम यह बता देता है कि कोड क्या करता है (जैसे validateLicense, decryptData), तो इनमें से कोई एक तरीका अपनाएँ:

  • विकल्प 1: IIFE में रैप करें (अनुशंसित)

    संवेदनशील फ़ंक्शन्स को किसी IIFE या किसी अन्य फ़ंक्शन की बॉडी के अंदर रखें। दूसरे फ़ंक्शन्स के अंदर मौजूद फ़ंक्शन रूट-स्तरीय नहीं होते, इसलिए वे अपने नामों सहित पूरी तरह VM-ट्रांसफ़ॉर्म हो जाते हैं।

    // Wrap sensitive code in IIFE
    (function() {
        function fibonacci(n) {
            if (n <= 1) return n;
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
        // Use fibonacci here...
    })();
    // "fibonacci" name is completely hidden in output
  • विकल्प 2: ग्लोबल्स का नाम बदलें + एन्कोडिंग (सावधानी से उपयोग करें)

    renameGlobals: true, vmBytecodeEncoding: true और vmBytecodeArrayEncoding: true चालू करें। इससे रूट-स्तरीय आइडेंटिफ़ायर्स के नाम बदल जाते हैं और वे बाइटकोड में एन्क्रिप्ट हो जाते हैं।