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 等二次保护。