Прямой eval() отключает VM-обфускацию
Если функция содержит прямой вызов eval(code) где-либо в своём теле (в том числе во вложенных функциях), вся функция и все её вложенные функции пропускаются при VM-обфускации. Это потому, что прямой eval имеет доступ к локальным переменным охватывающей функции, которые недоступны, когда функция скомпилирована в байт-код 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 ...
Обнаружение ловит прямой eval (eval(code) и eval?.(code)). Косвенные формы вроде (0, eval)(code) и window.eval(code) выполняются в глобальной области видимости и не блокируют VM-обфускацию.
Аварийный выход (v6.14.0+): задайте vmForceCompileDynamicCode: true (или переключите тумблер Force Compile Dynamic Code в группе Overrides раздела VM), чтобы всё равно байткодировать окружающую функцию и подавить VMDynamicCodeSkipped. Безопасно только когда построенное во время выполнения тело не может обращаться к идентификатору, который обфускатор переименовывает; иначе код бросает ReferenceError во время выполнения. Полный разбор компромисса см. на странице рецепта.
