التوثيق
/
تشويش VM
/

سلوك eval المباشر

الاستدعاء المباشر لـ eval() يعطّل تشويش VM

إذا احتوت دالة على استدعاء مباشر لـ eval(code) في أي موضع من جسمها (بما في ذلك داخل الدوال المتداخلة)، فإن الدالة بأكملها وجميع دوالها المتداخلة تُتخطى من تشويش VM. والسبب أن الاستدعاء المباشر لـ eval يصل إلى المتغيرات المحلية للدالة الحاوية، وهي غير متاحة عند ترجمة الدالة إلى بايت كود الآلة الافتراضية.

// ❌ 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 ...

يلتقط الكشف الاستدعاء المباشر لـ eval (eval(code) وeval?.(code)). أما الصيغ غير المباشرة مثل (0, eval)(code) وwindow.eval(code) فتعمل في النطاق العام ولا تمنع تشويش VM.

مخرج اضطراري (v6.14.0+): اضبط vmForceCompileDynamicCode: true (أو فعّل مفتاح Force Compile Dynamic Code ضمن مجموعة التجاوزات في قسم VM) لترجمة الدالة المحيطة إلى بايت كود رغم ذلك ولكتم VMDynamicCodeSkipped. وهذا آمن فقط عندما يستحيل على الجسم المبني أثناء التشغيل أن يشير إلى معرِّف يعيد المشوِّش تسميته، وإلا فسيطلق الكود ReferenceError أثناء التشغيل. انظر صفحة الوصفة العملية للاطلاع على المفاضلة الكاملة.