步骤 1.3:检索序列号状态标志
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。
打印标志的便捷功能
首先,我们需要一个方便的函数来将标志的数值转换为序列号的可理解状态。下面是这个函数的代码:
#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"; // we set the serial number directly in the code, for simplicity int res = VMProtectSetSerialNumber(serial); print_state(res);
现在,如果我们运行这个程序,下面的消息将被打印到控制台:
state = SERIAL_STATE_FLAG_INVALID please register!
现在,我们通过删除“1”放回旧密钥并再次运行程序:
state = 0 We are registered.
现在,我们可以看到序列号的状态标志,让我们开始从序列号中检索标志和数据。
检索序列号状态
您可以通过三种方式获取序列号的状态:通过调用VMProtectSetSerialNumber()、通过调用VMProtectGetSerialNumberState()或通过调用VMProtectGetSerialNumberData() – 状态标志被放入结构的字段之一。每种方法都旨在在特定时间使用。第一次检查序列号是在安装期间执行的。此时应拒绝错误号码、过期号码、黑名单号码等。一些限制,例如,程序的最长运行时间或序列号到期日期也应在运行时检查。和VMProtectGetSerialNumberState()方法是这里最快和最方便的方法。如果您需要接收有关序列号的完整信息,您可以使用更强大的VMProtectGetSerialNumberData()函数。