VM 如何转换代码
在 vmTargetFunctionsMode: 'root'(默认)下,VM 混淆会把每个根级函数的 函数体 转换为字节码(取决于 vmObfuscationThreshold),但保持函数名不变。
// Input
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// Output - function NAME is preserved, BODY is VM-transformed
function fibonacci(b) { // name kept as-is
return vm.call(...); // body converted to bytecode
}
这种设计能与那些从全局作用域调用这些函数、或期望在全局对象上找到它们的代码保持兼容。函数体得到了完整保护,但函数名仍然可见。
隐藏敏感的函数名:
如果某个函数名暴露了代码的用途(例如 validateLicense、decryptData),请采用以下方法之一:
方法 1:用 IIFE 包裹(推荐)
将敏感函数放入一个 IIFE 或任意其他函数体中。位于其他函数内部的函数不是根级函数,因此会被完整地进行 VM 转换,连同它们的名称一起。
// Wrap sensitive code in IIFE (function() { function fibonacci(n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } // Use fibonacci here... })(); // "fibonacci" name is completely hidden in output方法 2:重命名全局变量 + 编码(谨慎使用)
启用
renameGlobals: true、vmBytecodeEncoding: true和vmBytecodeArrayEncoding: true。这会重命名根级标识符,并在字节码中对它们加密。
