Documentação
/
Ofuscação VM
/

Comportamento do eval direto

O eval() direto desativa a ofuscação VM

Se uma função contiver uma chamada direta a eval(code) em qualquer ponto do corpo dela (inclusive em funções aninhadas), a função inteira e todas as suas funções aninhadas são ignoradas pela ofuscação VM. Isso acontece porque o eval direto tem acesso às variáveis locais da função que o envolve, e essas variáveis não ficam disponíveis quando a função é compilada para bytecode da 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 ...

A detecção pega o eval direto (eval(code) e eval?.(code)). As formas indiretas, como (0, eval)(code) e window.eval(code), rodam no escopo global e não bloqueiam a ofuscação VM.

Válvula de escape (v6.14.0+): defina vmForceCompileDynamicCode: true (ou ative o botão Force Compile Dynamic Code, no grupo Overrides da seção VM) para compilar a função ao redor em bytecode mesmo assim e suprimir o VMDynamicCodeSkipped. Isso só é seguro quando o corpo construído em tempo de execução não puder referenciar um identificador que o ofuscador renomeia; caso contrário, o código lança ReferenceError em tempo de execução. Veja a página da receita para entender toda a contrapartida.