许可系统 API 功能
VMProtect 是新一代软件盗版保护解决方案。VMProtect 是目前强大的反盗版解决方案之一,许多领先的软件发行商都在使用它。VMProtect允许保护可执行文件(EXE,SCR),动态链接库(DLL,OCX,BPL)和驱动程序(SYS)。
加密解密技术交流群(766135708)
许可系统 API 功能
许可系统 API 是 VMProtect API 及其 SDK 的一个组成部分。API 允许你指定一个序列号,并搜索关于它的所有信息:是否适合该程序,序列号是否过期,该产品注册的名称等等。此外,该API还提供了程序运行的计算机的硬件标识符。
VMProtectSetSerialNumber
该函数向许可系统加载一个序列号。调用语法:
int VMProtectSetSerialNumber(const char *SerialNumber);
输入的SerialNumber参数必须包含一个指针,指向一个包含base-64编码的序列号的空尾字符串('\0′)。该函数返回一个序列号状态标志的位掩码,与VMProtectGetSerialNumberState()返回的相同。你可以在下面阅读更多关于标志的信息。如果该函数返回0,则序列号为 "good"。
VMProtectGetSerialNumberState
该函数为调用VMProtectSetSerialNumber()指定的序列号返回状态标志。
int VMProtectGetSerialNumberState();
如果至少有一个标志被设置,说明序列号有问题,程序就不应该工作。标志和它们的值的详细描述列在下表中:
Flag | Value | Description |
---|---|---|
SERIAL_STATE_FLAG_CORRUPTED | 0×00000001 | 许可系统被破坏。可能的原因是:保护项目的设置不正确,试图破解。 |
SERIAL_STATE_FLAG_INVALID | 0×00000002 | 序列号不正确。如果许可系统不能解密序列号,则设置该标志 |
SERIAL_STATE_FLAG_BLACKLISTED | 0×00000004 | 序列号与产品相符,但在VMProtect中被列为黑名单。 |
SERIAL_STATE_FLAG_DATE_EXPIRED | 0×00000008 | 序列号已经过期。你可以通过调用VMProtectGetSerialNumberData()获得关于过期日期的详细信息 |
SERIAL_STATE_FLAG_RUNNING_TIME_OVER | 0×00000010 | 程序的操作时间已耗尽。你可以通过调用VMProtectGetSerialNumberData()获得有关程序运行时间的详细信息。 |
SERIAL_STATE_FLAG_BAD_HWID | 0×00000020 | 硬件标识符与密钥中规定的硬件标识符不一致。 |
SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED | 0×00000040 | 序列号与被保护程序的当前版本不匹配。你可以通过调用 VMProtectGetSerialNumberData()获得与该序列号匹配的程序的最大构建日期。 |
VMProtectGetSerialNumberData
该函数获取调用VMProtectSetSerialNumber()获得的序列号的内容信息。调用语法;
bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size);
第一个参数是一个指向VMProtectSerialNumberData结构的指针,所有必要的信息都将被写入该结构。第二个参数是第一个参数中传递的结构的大小。它被要求用来控制结构的格式。如果许可系统被破坏(见SERIAL_STATE_FLAG_CORRUPTED标志),如果提供的结构地址为零,或者传递的结构大小不正确,该函数返回FALSE。在所有其他情况下,该函数返回TRUE,并将所有关于序列号的信息记录到提供的地址。下面是该结构的成分:
Element | Type | Description |
---|---|---|
nState | int | 表示一个键的状态的位标志掩码。类似于VMProtectGetSerialNumberState() |
wUserName | wchar_t[256] | 以UNICODE为单位的客户名称,以空结尾 |
wEMail | wchar_t[256] | 密钥过期日期。VMProtectDate结构的格式描述如下。 |
dtExpire | VMProtectDate | 密钥过期日期。VMProtectDate结构的格式描述如下。 |
dtMaxBuild | VMProtectDate | 给定的密钥可以使用的最大产品构建日期。VMProtectDate结构的格式描述如下。 |
bRunningTime | int | 程序将工作的分钟数(一个疗程的最长时间)。以分钟为单位的数值从程序开始时算起。. |
nUserDataLength | unsigned char | bUserData字段中用户数据的长度。 |
bUserData | unsigned char[255] | 放入密钥的用户数据。实际的字节数在nUserDataLength中指定。 |
VMProtectDate结构通过一个紧凑的日期表示。它的字段在下表中列出:
Element | Type | Description |
---|---|---|
wYear | unsigned short | 年 |
bMonth | unsigned char | 月,从一开始 |
bDay | unsigned char | 日,从一开始 |
VMProtectGetCurrentHWID
该函数获取程序所工作的PC的硬件标识符。调用句法:
int VMProtectGetCurrentHWID(char * HWID, int Size);
第一个参数是一个指针,指向标识符被写入的内存区域。第二个参数是这个区域的大小。该函数返回写入的字节数,包括后面的零字节('\0′)。如果在第一个参数中提供了NULL,该函数将返回存储硬件标识符所需的字节数。下面是使用该函数的正确方法:
int nSize = VMProtectGetCurrentHWID(NULL, 0); // get the required buffer size char *pBuf = new char[nSize]; // allocate memory for the buffer VMProtectGetCurrentHWID(pBuf, nSize); // obtain the identifier // use the identifier delete [] pBuf; // release memory