步骤1.3:检索序列号状态标志
一个显示标志的便捷函数
首先,我们需要一个方便的函数来将标志的数值转换为序列号的可理解状态。下面是这个函数的代码:
#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) void print_state(INT state) { if (state == 0) { printf("state = 0\n"); return; } printf("state = "); PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); printf("\n"); }
尽管尺寸很大,但函数非常简单 – 一一检查所有位标志并显示状态变量中存在的所有内容。在检查对 print_state 调用的序列号后替换代码中的 printf,并更改我们传递给授权系统的序列号:
char *serial = "Xserialnumber1"; // 为简单起见,我们直接在代码中设置序列号。 int res = VMProtectSetSerialNumber(serial); print_state(res);
现在,如果我们运行这个程序,控制台将显示以下消息:
state = SERIAL_STATE_FLAG_INVALID 请注册!
现在,我们通过删除 “1” 来放回旧密钥并再次运行程序:
state = 0 已注册。
现在,我们可以看到序列号的状态标志,让我们转移到从序列号中检索标志和数据。
检索序列号状态
您可以通过三种方式获取序列号的状态:通过调用 VMProtectSetSerialNumber() 、通过调用 VMProtectGetSerialNumberState() 或通过调用 VMProtectGetSerialNumberData() - 状态标志被放入结构的字段之一。每种方法都旨在在特定时间使用。序列号的第一次检查是在安装期间执行的。此时您应该拒绝错误号码、过期号码、黑名单号码等。一些限制,例如,程序的最长运行时间或序列号到期日期也应在运行时检查。并且 VMProtectGetSerialNumberState() 方法是这里最快和最方便的方法。而如果需要接收完整的序列号信息,可以使用更强大的 VMProtectGetSerialNumberData() 函数。