eval() diretto disattiva l'offuscamento VM
Se una funzione contiene una chiamata diretta a eval(code) in un punto qualsiasi del proprio corpo (comprese le funzioni annidate), l'intera funzione e tutte le funzioni in essa annidate vengono escluse dall'offuscamento VM. Ciò accade perché eval diretto ha accesso alle variabili locali della funzione che lo racchiude, variabili che non sono disponibili quando la funzione viene compilata in 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 ...
Il rilevamento intercetta eval diretto (eval(code) ed eval?.(code)). Le forme indirette come (0, eval)(code) e window.eval(code) vengono eseguite nello scope globale e non bloccano l'offuscamento VM.
Via di uscita (v6.14.0+): impostare vmForceCompileDynamicCode: true (oppure attivare l'interruttore Force Compile Dynamic Code nel gruppo Overrides della sezione VM) per convertire comunque in bytecode la funzione circostante e sopprimere VMDynamicCodeSkipped. Questa scelta è sicura soltanto se il corpo costruito a runtime non può fare riferimento a un identificatore rinominato dall'offuscatore; in caso contrario il codice genera un ReferenceError in fase di esecuzione. Per il quadro completo dei compromessi si veda la pagina della ricetta.
