直接 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(或切换 VM 部分 Overrides 组下的 Force Compile Dynamic Code 开关),可强制仍然对外层函数进行字节码化并抑制 VMDynamicCodeSkipped。仅当运行时构建的 body 不会引用混淆器重命名的标识符时才是安全的;否则代码会在运行时抛出 ReferenceError。完整的取舍权衡请参阅该方案页面。
