Skip to content

QVM 与 CloudGate ​

QVM 用于对二进制中的关键代码段进行虚拟化、变形或云端负载保护。CloudGate 可以把标记代码保护后抽离到云端,运行时在验证通过后下发。

保护顺序

如果使用 QVM 标记或 CloudGate 标记,都需要使用 QVM 对编译后的二进制执行一次保护。常见顺序为:原始二进制 -> QVM -> VMP。

常规 QVM 标记 ​

QVM 标记的使用方式类似 VMProtect 标记:在需要保护的代码段前插入起始标记,在代码段后插入结束标记。

cpp
// 代码段起始标记
QVM_BeginVirtualization
QVM_BeginMutation
QVM_BeginUltra

// 需要保护的代码

// 代码段结束标记
QVM_End

QVM 标记示例

CloudGate 标记 ​

CloudGate 标记用于将关键代码段抽离为云端负载。运行时需要客户端处于可验证、可拉取负载的状态。

cpp
// 代码段起始标记
QVM_CloudVirtualization
QVM_CloudUltra

// 需要云端保护的代码

// 代码段结束标记
QVM_End

不要标记登录前路径

CloudGate 代码段不能放在登录前或登录过程中必须执行的位置。负载需要在验证体系可用后下发,否则程序可能无法进入可用状态。

配置 Build ID ​

使用 CloudGate 时,软件编译阶段必须填写 Build ID。SDK Demo 中提供了示例。

配置 Build ID

Build ID 必须和管理后台中创建的 QVM Build 保持一致,否则运行时无法匹配正确负载。

使用 QVM 保护二进制 ​

程序编译完成后,使用 QVM 对二进制进行保护。

使用 QVM 保护二进制

保护完成后,会生成新的受保护二进制。

QVM 保护结果

如果使用 CloudGate,还会得到 文件名.qvm.cloud 目录。

CloudGate 负载目录

创建 QVM Build ​

在管理后台进入 QVM 页面,新建 QVM Build,并填写与程序中一致的 Build ID。

创建 QVM Build

上传 CloudGate 负载 ​

将 .qvm.cloud 目录中的负载文件上传到管理后台的负载区域。

上传 CloudGate 负载入口

CloudGate 负载上传完成

二次加壳

QVM 保护完成后,可以继续使用 VMP 等商业壳进行二次保护。建议先确认 QVM 产物能正常拉取负载,再进行下一步保护。

运行结果预期 ​

未上传 CloudGate 负载时:

text
原始文件 -> 正常工作,因为代码段尚未被抽离
QVM 保护后文件 -> 崩溃或逻辑无效
再用 VMP 保护后文件 -> 崩溃或逻辑无效

上传 CloudGate 负载后:

text
原始文件 -> 正常工作,因为代码段尚未被抽离
QVM 保护后文件 -> 正常工作
再用 VMP 保护后文件 -> 正常工作
离线后运行 -> 超过允许离线阈值后,崩溃或逻辑无效

检查清单 ​

  • 代码中已正确插入 QVM_End。
  • CloudGate 标记没有放在登录前或登录中必须执行的路径。
  • 程序中的 Build ID 与管理后台 QVM Build 完全一致。
  • .qvm.cloud 目录中的负载文件已上传。
  • 先验证 QVM 产物,再进行 VMP 等二次保护。