Documentation
/
Obfuscation VM
/

Comportement de eval direct

Un eval() direct désactive l'obfuscation VM

Si une fonction contient un appel direct à eval(code) n'importe où dans son corps (y compris dans des fonctions imbriquées), la fonction entière et toutes ses fonctions imbriquées sont exclues de l'obfuscation VM. En effet, un eval direct accède aux variables locales de la fonction englobante, lesquelles ne sont plus disponibles une fois la fonction compilée en bytecode 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 ...

La détection couvre l'eval direct (eval(code) et eval?.(code)). Les formes indirectes comme (0, eval)(code) et window.eval(code) s'exécutent dans la portée globale et ne bloquent pas l'obfuscation VM.

Échappatoire (v6.14.0+) : activez vmForceCompileDynamicCode: true (ou basculez l'interrupteur Force Compile Dynamic Code dans le groupe Surcharges de la section VM) pour convertir malgré tout la fonction englobante en bytecode et supprimer l'avertissement VMDynamicCodeSkipped. Ce n'est sûr que si le corps construit à l'exécution ne peut jamais référencer un identifiant renommé par l'obfuscateur ; sinon, le code lève une ReferenceError à l'exécution. Consultez la page de recette pour le détail des compromis.