Direct eval() VM ऑब्फ़स्केशन को बंद कर देता है
अगर किसी फ़ंक्शन की बॉडी में कहीं भी (नेस्टेड फ़ंक्शन्स सहित) direct eval(code) कॉल मौजूद है, तो पूरा फ़ंक्शन और उसके सभी नेस्टेड फ़ंक्शन VM ऑब्फ़स्केशन से छोड़ दिए जाते हैं। ऐसा इसलिए होता है क्योंकि direct eval के पास आसपास वाले फ़ंक्शन के लोकल वैरिएबल्स तक पहुँच होती है, जो फ़ंक्शन के VM बाइटकोड में कंपाइल हो जाने पर उपलब्ध नहीं रहते।
// ❌ Entire IIFE is NOT VM-obfuscated because of direct eval inside
(function () {
function loadConfig() {
eval(decodedLoader); // direct eval - blocks VM for the whole IIFE
}
// ... all your code ...
})();
// ✅ Use indirect eval - runs in global scope, does not block VM
(function () {
function loadConfig() {
(0, eval)(decodedLoader); // indirect eval - VM obfuscates the IIFE
}
// ... all your code ...
})();
// ✅ Or unwrap the IIFE - each top-level function is checked independently
function loadConfig() {
eval(decodedLoader); // only this function is skipped
}
// ... other top-level functions are still VM-obfuscated ...
डिटेक्शन direct eval (eval(code) और eval?.(code)) को पकड़ता है। (0, eval)(code) और window.eval(code) जैसे अप्रत्यक्ष रूप ग्लोबल स्कोप में चलते हैं और VM ऑब्फ़स्केशन को नहीं रोकते।
एस्केप हैच (v6.14.0+): आसपास वाले फ़ंक्शन को फिर भी बाइटकोड में बदलने और VMDynamicCodeSkipped को दबाने के लिए vmForceCompileDynamicCode: true सेट करें (या VM सेक्शन के Overrides समूह में मौजूद Force Compile Dynamic Code स्विच चालू करें)। यह केवल तभी सुरक्षित है जब रनटाइम पर बनी body किसी ऐसे आइडेंटिफ़ायर का संदर्भ न दे सके जिसका नाम ऑब्फ़स्केटर बदलता है; अन्यथा कोड रनटाइम पर ReferenceError फेंकेगा। पूरा ट्रेड-ऑफ़ समझने के लिए रेसिपी पेज देखें।
