诊断 VM 运行时错误
请按顺序完成以下步骤。每一步都会先排除一个常见原因,免得你花时间去缩小出错代码的范围。
1. 测试与CI
首先排除运行时防御(VM Self Defending、VM Debug Protection、VM Domain Lock)的影响:使用应用了测试与CI中覆盖项的测试构建来复现失败。如果测试构建运行正常,说明是防御在对你的工具或环境作出反应,而不是你的代码被破坏了。
2. 运行环境兼容性
检查 target、构建流程以及所有环境声明是否与代码的实际运行位置一致。
VM 保护只作用于符合条件的函数。在 root 模式下,vmWrapTopLevelInitializers 还可以把符合条件的初始化语句包裹起来进行虚拟化;当前的 VM 预设会启用它。请检查 VMNoFunctionsToVirtualize 等覆盖范围警告,并使用 comment 模式显式选择敏感函数。
把失败用例缩减到仍能复现问题的最小函数和调用点。使用 comment 模式缩小被虚拟化的函数范围。
如果将 vmBytecodeArrayEncoding 与 vmBytecodeArrayEncodingKeyGetter 一起使用,getter 必须返回与构建时完全相同的密钥,并且在混淆代码运行时该密钥必须已经设置好;否则字节码无法解码。
运行环境兼容性 · Bytecode Array Encoding 密钥
3. 提交错误报告
发送邮件至 support@obfuscator.io。以下信息提供得越多,我们修复得就越快:
- 完整的错误堆栈,与控制台中显示的完全一致,不要转述。
- JSON 格式的混淆器选项。 复制你使用的完整选项对象(或预设名称加上所有覆盖项)。选项之间的微妙相互作用很常见,所以我们需要确切的选项集合。
- 构建警告(如有):每条警告的
type、message和functionName。 - 混淆器版本,显示在编辑器下方控制台的版本选择器中。对于 API 和 npm 包构建,它是 API 的
result或chunk_end消息中的version字段。 - 运行环境:浏览器及版本、Node.js 版本、操作系统,以及运行时的任何特殊之处(扩展、polyfill、自定义内置对象)。
- 最小复现:最好是第 2 节中得到的那个单一函数,再加上触发错误所需的调用点。
- 原始(混淆前)源码,如有可能请提供。混淆后的输出对我们来说同样难以理解;没有输入,我们就只能逆向自己的字节码。
如果源码是专有的,请在邮件中说明,我们可以在你分享之前签署 NDA。如果看不到产生错误字节码的输入模式,我们就无法可靠地诊断 VM 缺陷,所以这一来一回是值得的。
