文档
/
VM 混淆
/

Async Executor

Async Executor

Pro
v7.3.0+

以异步方式运行 VM,让字节码解密密钥可以在运行时获取,而不必随包一起分发。

观看

Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization

在 YouTube 观看

vmAsyncExecutor 选项会启用异步 VM 执行器。它最主要的好处是 vmBytecodeArrayEncodingKeyGetter 现在可以返回一个 Promise - 即 异步密钥获取器 - 因此解密密钥可以在加载时来自网络请求、IndexedDB 或任意异步来源,而不必在代码首次运行时同步就绪。

关于从后端获取密钥的完整演练,请参阅外置 Bytecode Array Encoding 密钥。

何时使用

强烈推荐用于完全异步的代码库。 在此模式下只有 async 函数会被虚拟化 - 同步函数若不将其返回值变为 Promise(并因此破坏其调用方)就无法变为异步 - 因此通篇 async 的代码能获得最广的覆盖。当根是同步的(例如同步 IIFE 或 UMD 包装器)时它仍然有效:其中最外层的 async 函数会受到保护,同步部分则不会被虚拟化(其余混淆仍会应用)。

哪些内容会被转换

任意位置(包括嵌套在同步包装器内部)的每个 最外层 async 函数。每条链中最外层的 async 就是受保护的单元 - 它内部的一切,无论同步还是异步,都会被一并编译进去。同步函数和普通生成器不会被虚拟化(其余混淆仍会作用于它们)。

JavaScript

跳过与警告

当异步密钥获取器处于活动状态时,异步生成器也不会被虚拟化 - 异步生成器必须同步返回其迭代器,无法等待密钥。在默认的 vmTargetFunctionsMode: 'root' 下,跳过是静默的(选择是自动进行的),除非没有任何内容被虚拟化,此时会报告 VMNoFunctionsToVirtualize。在 'comment' 模式下,每当您显式标记的某个函数无法被虚拟化时 - 无论是因为它其实是同步的,还是因为它是异步密钥获取器下的异步生成器 - 都会报告一条警告(在控制台中,以及 API 响应的 warnings 数组中)。这些警告(VMSyncFunctionSkippedInAsyncMode、VMAsyncGeneratorSkippedInAsyncMode)可通过 warnings 选项(v7.8.0+)按类型分别静默。

在 root 模式下,即使开启了 vmWrapTopLevelInitializers,vmAsyncExecutor 也会让顶层变量初始化表达式保持为普通 JavaScript,并且(v7.8.0+)会由一条 VMTopLevelInitializerNotVirtualized 警告列出它们。

要求

  • 异步密钥获取器需要 vmBytecodeArrayEncoding,并且 vmBytecodeArrayEncodingKeyGetter 必须与 vmBytecodeArrayEncodingKey 成对使用:混淆器会校验两者同时设置(或同时不设置),并校验 getter 能被解析为一个表达式,否则会拒绝构建。
  • 混淆器版本 7.3.0 或更高。

仅启用该选项 只是把执行器切换到异步模式(只有最外层的 async 函数会被虚拟化)。真正解锁运行时密钥获取的,是让密钥获取器返回一个 Promise,而这还额外需要配合带密钥获取器的 Bytecode Array Encoding。getter 是否返回 Promise 无法在构建时检查,因此在 vmAsyncExecutor 关闭 的情况下使用返回 Promise 的 getter 会在运行时失败:解码器收到的是 Promise,而不是密钥。

示例

JavaScript

在 完全同步 的代码库中几乎没有内容会被虚拟化,因为只有 async 函数才符合条件。如果您的入口点不是 async,请优先使用同步密钥获取器,并关闭 vmAsyncExecutor。