软件授权中,允许用户使用到某一天,和允许用户使用某一天之前发布的版本,是两种不同安排。VMProtect分别用到期日与最大构建日期表达这两类限制。日期填错后,可能出现旧版本还能使用、新版本无法接受同一序列号的情况,也可能让原本只限制更新范围的授权变成限期使用。设置前,应把授权条款与程序构建日期的关系弄清楚。
一、VMProtect授权的最大构建日期怎么设
最大构建日期写入序列号,程序端还要有与之比较的构建日期。以下以已经接入VMProtect授权系统、使用.NET序列号生成器的项目为例。
1、在生成序列号时填写日期
最大构建日期限制的是序列号能够接受的程序版本。这个日期应来自已确定的授权规则,不能在每次重新生成序列号时随意顺延。
①打开对应【VMProtect工程】,通过密钥对导出功能取得【Parameters for KeyGen.Net】参数。
②在发号程序中,用该产品参数创建【Generator】对象,填写本次授权所需的信息。
③设置【MaxBuildDate】,例如使用【g.MaxBuildDate=new DateTime(2027,6,30);】。
④调用【g.Generate()】生成序列号,将生成结果与客户、产品和日期记录对应保存。
⑤检查发号代码中的【ExpirationDate】,确认是否还需要单独设置使用到期日。
2、使用其他生成器时核对字段
①采用Windows序列号生成器接口时,在【VMProtectSerialNumberInfo】中填写【dwMaxBuildDate】。
②在【flags】中加入【HAS_MAX_BUILD_DATE】,保留本次授权需要的其他标志。
③按接口规定的【0xYYYYMMDD】格式编码日期,核对年、月、日所在的位置。
④调用【VMProtectGenerateSerialNumber】后检查返回结果,再保存生成的序列号。
.NET生成器使用日期对象,Windows接口使用打包后的日期数值,两者的填写方式不同。只赋值却没有启用对应标志,也可能使限制未被写入。修改发号程序中的日期后,还需要生成并交付新的序列号,用户手中的旧序列号不会自动改变。
3、把程序构建日期纳入发布配置
VMProtect在保护程序时记录构建日期,默认采用当日日期。控制台可以通过构建日期参数明确指定,发布流程应保留这项记录。
①检查保护命令中的【-pf】参数,确认读取的是对应产品的【.vmp工程文件】。
②需要明确指定日期时,使用【-bd yyyy-mm-dd】,例如填写【-bd 2026-11-10】。
③将本次【构建日期】、程序版本和输出文件写入发布记录。
④使用生成的【受保护程序】验证序列号,记录实际返回的授权状态。
二、VMProtect最大构建日期与到期日有何区别
两项限制比较的对象不同。最大构建日期关注程序版本,到期日关注授权使用时间;同一个序列号可以同时包含两项限制。
1、最大构建日期决定能接受哪些版本
①准备同一产品的两份【受保护程序】,分别记录写入程序的【构建日期】。
②选取一个带有【MaxBuildDate】限制的序列号,在两份程序中调用【VMProtectSetSerialNumber()】。
③将程序构建日期与序列号中的【dtMaxBuild】对照,记录验证结果。
④对超过允许日期的程序,检查是否返回【SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED】。
例如,序列号允许的构建日期截至2027年6月30日,构建日期为当年6月的版本处于允许范围,7月的版本则超出范围。用户后来运行6月的旧版本,不会仅因为日历已经进入7月,就触发构建日期超限。但其他授权条件仍须满足。
2、到期日限制的是使用期限
到期日与程序新旧分别判断。一个构建日期较早的版本,也可能因为序列号已经过期而无法通过授权检查。
①在发号程序中核对【ExpirationDate】,记录它与【MaxBuildDate】各自的用途。
②调用【VMProtectGetSerialNumberData()】,分别读取【dtExpire】与【dtMaxBuild】。
③检查【SERIAL_STATE_FLAG_DATE_EXPIRED】,将其与构建日期超限状态分别处理。
④若两项限制同时启用,在【授权说明】中分别写清使用期限与版本范围。
⑤在需要持续检查授权的程序中,调用【VMProtectGetSerialNumberState()】,处理运行期间发生的状态变化。
三、VMProtect日期授权设置后怎么验证
日期验证应使用实际交付的受保护文件。开发阶段的SDK测试模式与保护后的程序存在区别,只在开发环境跑通,还不足以确认发布配置正确。
1、围绕日期边界准备测试
①在测试项目中生成【最大构建日期】相同的序列号,暂不加入无关限制。
②准备构建日期分别早于、等于、晚于该日期的【测试程序】,保存各自的保护命令。
③在每份程序中记录【VMProtectSetSerialNumber()】返回值,以及读出的【dtMaxBuild】。
④另行准备包含【到期日】的测试授权,检查两类日期状态是否被正确区分。
⑤将测试结果与对应【程序文件】【序列号记录】一起归档。
SDK测试配置中可以使用MaxBuildDate模拟这一限制,但测试模式把当日视为程序构建日期。它适合检查接口分支,不能代替发布包验证。日期相同的边界情况也应保留,避免业务代码又额外加入一套不一致的判断。
2、报错提示应跟随具体状态
授权状态是位标志组合,程序可能同时遇到日期、硬件或其他问题。处理时按位检查,比只比较一个固定返回值更清楚。
①对返回状态分别使用【SERIAL_STATE_FLAG_DATE_EXPIRED】和【SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED】进行按位判断。
②读取【dtExpire】【dtMaxBuild】前,检查【VMProtectGetSerialNumberData()】是否成功。
③在【错误提示】中区分使用期限结束与当前版本超出授权范围。
④旧包有效、新包无效时,对照两次【保护构建记录】,检查构建日期和产品授权参数。
同一源码重新执行保护,也可能因默认日期改变而形成新的构建日期。排查时不能只看文件名、版本号或源码提交时间。若问题来自发布配置,应按发布规则修正构建过程,避免直接修改客户授权掩盖原因。
总结
最大构建日期与到期日分别对应版本范围和使用期限,授权条款应当与这两项设置保持一致。发布记录里留下构建日期,程序中区分日期状态,后续处理升级和续期问题就有明确依据。对于只限制更新范围的安排,尤其应检查是否误加了到期日。希望这些说明能帮助大家理清日期授权,减少发号和发布环节的误配。
