软件许可证授权通常与运行它的机器绑定。若当前机器未获授权,程序可以采取相应措施,以防止盗版和非法传播。

大多数软件通过激活码或注册码来完成授权激活,这类方式通常属于离线激活。在线激活则借助服务器通信来实时确认当前机器是否已获授权,验证通过后程序才能正常运行。

本文介绍一种在线动态授权方案,目标是实现对授权机器的严格管控,并具备较高的实时性。

授权流程

整体流程如下:进程获取机器信息 → 信息发送到服务器 → 服务器确认授权 → 进程收到授权结果并作相应处理。

  1. Step 1:采集机器特征信息
    机器信息可由主板编号、CPUID、内存大小等硬件特征组合而成。此外,还可以加入机器的公网 IP——服务器可对其进行校验,使客户端难以伪装身份。同时也可以将 UTC 时间一并加入,增强唯一性。
  2. Step 2:安全传输机器信息
    通过网络将机器信息上传到服务器。由于网络环境不安全,明文传输容易被伪造,因此应采用非对称加密进行传输。客户端使用公钥对待上传的信息进行加密,每个 app 或产品配备一对独立的公钥/私钥。
  3. Step 3:服务端校验并返回授权结果
    服务端根据机器特征判断该机器是否已获授权,然后使用非对称加密将正确的授权信息返回给客户端。

上述方案实现了授权的逻辑闭环,并具备一定的网络安全保障。

客户端安全加固

由于程序本身在客户端运行,相对容易被攻破,因此还需要通过加密保护技术来防止程序功能被篡改或绕过。

常见的技术手段包括:进程加壳、内存与代码混淆、虚拟化。

虚拟化的目的是让程序的运行机制不易被识别和攻破。简单方案是内嵌 Lua 或 Python 虚拟机,并对 OP code 进行改造,将核心逻辑用 Lua 或 Python 编写,从而加大破解难度。更复杂的方案则是自行实现一套专用虚拟机。