Dokumentacja
/
Obfuskacja VM
/

Zachowanie bezpośredniego eval

Bezpośrednie wywołanie eval() wyłącza obfuskację VM

Jeśli funkcja zawiera gdziekolwiek w swoim ciele bezpośrednie wywołanie eval(code) (również w funkcjach zagnieżdżonych), cała ta funkcja wraz ze wszystkimi funkcjami zagnieżdżonymi zostaje pominięta przez obfuskację VM. Wynika to z faktu, że bezpośrednie wywołanie eval ma dostęp do zmiennych lokalnych funkcji otaczającej, a te nie są dostępne po skompilowaniu funkcji do kodu bajtowego 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 ...

Wykrywane są bezpośrednie wywołania eval (eval(code) oraz eval?.(code)). Formy pośrednie, takie jak (0, eval)(code) czy window.eval(code), działają w zasięgu globalnym i nie blokują obfuskacji VM.

Furtka awaryjna (v6.14.0+): ustawienie vmForceCompileDynamicCode: true (albo przełącznika Force Compile Dynamic Code w grupie Nadpisania sekcji VM) powoduje mimo wszystko skompilowanie otaczającej funkcji do kodu bajtowego i wyciszenie VMDynamicCodeSkipped. Jest to bezpieczne wyłącznie wtedy, gdy budowane w czasie wykonania ciało funkcji nie może odwoływać się do identyfikatora, którego nazwę zmienia obfuskator; w przeciwnym razie kod zgłosi ReferenceError w czasie wykonania. Pełne omówienie kompromisu znajduje się na stronie z przepisem.