文档
/
VM 混淆
/

VM 如何转换代码

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
}

这种设计能与那些从全局作用域调用这些函数、或期望在全局对象上找到它们的代码保持兼容。函数体得到了完整保护,但函数名仍然可见。

隐藏敏感的函数名:

如果某个函数名暴露了代码的用途(例如 validateLicensedecryptData),请采用以下方法之一:

  • 方法 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: truevmBytecodeEncoding: truevmBytecodeArrayEncoding: true。这会重命名根级标识符,并在字节码中对它们加密。