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.
