序列号格式
VMProtect 是新一代软件盗版保护解决方案。VMProtect 是目前强大的反盗版解决方案之一,许多领先的软件发行商都在使用它。VMProtect允许保护可执行文件(EXE,SCR),动态链接库(DLL,OCX,BPL)和驱动程序(SYS)。
加密解密技术交流群(766135708)
序列号结构
序列号由块组成。每个区块从一个标识符字节开始,表示该区块的内容和可能的长度。最后一个区块有255个标识符,包含除最后一个区块外的序列号的校验。
根据块的类型,它可以有恒定的或可变的长度。在后一种情况下,长度在块标识符之后的字节中指定。每个区块的确切格式在下面描述。
区块格式
ID | Name | Size (byte) | Description | Example |
---|---|---|---|---|
0×01 | Version | 1 | 该块包含一个版本的序列号,1字节大小。该版本应是1。 | 01 01 |
0×02 | User name | 1 + N | 该块包含一个UTF-8编码的用户名。在用户名之前,有1个字节保存着用户名的长度。因此,一个用户名的总长度不能超过255字节。不需要尾部的0。 | 02 04 4A 5F 48 4E |
0×03 | 1 + N | 该块包含一个UTF-8编码的用户的电子邮件。在电子邮件之前,有1个字节用来表示长度。因此,一封电子邮件的总长度不能超过255字节。不需要尾部的0。 | 03 07 61 40 62 2E 63 6F 6D | |
0×04 | Hardware identifier | 1 + N | 该块包含由VMProtectGetCurrentHWID()函数返回的硬件标识符。该函数返回一个base-64的字符串。该字符串的解码版本被放到序列号中。数据块的长度应是4的倍数,数据块前有一个长度字节。最大的数据块长度是32字节。 | 04 08 E1 E2 E3 E4 A1 A2 A3 A4 |
0×05 | License expiration date | 4 | 该区块包含序列号过期日期 日期格式描述如下。 | 05 01 0A 07 DA |
0×06 | Maximum operation time | 1 | 该块包含1个字节,保存程序可以运行的时间(分钟)。因此,最大的时间可以是255分钟。 | 06 05 |
0×07 | Product code | 8 | 该块包含一个产品代码--由VMProtect创建的8个字节,与产品参数一起导出。这些数据是以base-64编码导出的,在放到序列号之前必须解码为一个字节数组。该数组的大小应正好是8个字节。 若缺失,受保护的程序将不能正常工作。 | 07 01 02 03 04 05 06 07 08 |
0×08 | User data | 1 + N | 该块最多包含255字节的自定义用户数据。许可证系统不分析这些数据,当调用VMProtectGetSerialNumberData()函数时,会返回这些数据。在数据块之前,有一个字节保存着用户数据的大小。 | 08 05 01 02 03 04 05 |
0×09 | Maximum build date | 4 | 该块包含应用程序的最大构建日期。其格式描述如下。 | 09 01 0A 07 DA |
0xFF | Checksum | 4 | 该区块包含序列号校验和。该区块位于最后一个区块之前,校验和是针对之前所有区块计算的。下面描述了校验和的计算机制。 | FF 01 02 03 04 |
日期存储格式
日期以双字的形式存储在序列号中 - 0xYYYYMMDD。高阶字包含年,低阶字包含日和月。字节遵循小尾数表示法--从低到高。如果有一个指向记录的第一个字节的指针,可以用下面的代码读取或写入日期:
byte *pDate = 0xNNNNNN; // date address
*(DWORD *)pDate = (2010 << 16) | (10 << 8) | 1; // October 1, 2010
DWORD dwExp = *(DWORD *)pDate;
校验和计算
序列号的校验和是使用SHA-1散列算法计算的。其结果是五个32位的字组成。第一个字既被用作序列号的校验和又是小端数(从低到高)。SHA-1散列的字符串表示法使用的是Big Endian - 数字从高字节到低字节,所以如果SHA-1散列是由字符串函数生成的(比如在PHP中),散列的前四个字节应颠倒过来。
其他信息
许可证系统会忽略那些编号不在上面的区块。在较新的版本中可能会增加新的区块。我们不建议使用非占用的标识符创建新的区块! 首先,这可能使密钥在较新版本的授权系统中失去功能。其次,受保护的程序无论如何也无法读取这些区块的值。要在密钥中存储额外的信息,请通过用户数据字段来代替。
序列号没有SALT,这是一种随机信息,旨在提供相同输入数据的密钥。这个任务是强加给加密算法的。例如,在向一个组织出售一系列密钥时,你可以在用户名字段中添加单独的索引("公司 "LLC,10个密钥中的1个),或者以任何适当的格式将这些信息插入到用户数据字段中。