步骤1.9:硬件锁
接收硬件标识符
在锁定硬件之前,我们必须收到硬件标识符。标识符被放入序列号中,当序列号传递给授权系统时,它会检查标识符是否匹配。所以,首先我们需要接收我们硬件的标识符。让我们将 main() 函数简化:
int main(int argc, char **argv) { int nSize = VMProtectGetCurrentHWID(NULL, 0); char *buf = new char[nSize]; VMProtectGetCurrentHWID(buf, nSize); printf("HWID: %s\n", buf); delete [] buf; return 0; }
通过运行程序,我们将收到一个默认测试硬件标识符:
HWID: myhwid
要更改标识符,请将以下行添加到 ini 文件:
MyHWID=test
如果我们之后运行程序,我们可以看到系统认为 “test” 是我们 PC 的硬件标识符:
HWID: test
重要提示! 只有经过 VMProtect 处理后,程序才会显示真正的硬件标识符。
要将我们的测试序列号锁定到硬件,我们应该在 ini 文件中再添加一行。这次我们定义 “放入” 序列号的标识符:
int main(int argc, char **argv) { int nSize = VMProtectGetCurrentHWID(NULL, 0); char *buf = new char[nSize]; VMProtectGetCurrentHWID(buf, nSize); printf("HWID: %s\n", buf); delete [] buf; char *serial = "Xserialnumber"; int res = VMProtectSetSerialNumber(serial); print_state(res); return 0; }
运行代码后,我们将看到以下结果:
HWID: test state = 0
授权系统已将当前硬件标识符与序列号中写入的标识符进行比较。标识符相等,因此 VMProtectSetSerialNumber() 函数返回 0 - 序列号匹配。
现在让我们尝试在另一个硬件上 “运行” 我们的程序。我们只需将 ini 文件中 MyHWID 参数的值从 “test” 更改为 “new test” 。再次运行程序:
HWID: new test state = SERIAL_STATE_FLAG_BAD_HWID
这次授权系统返回了 SERIAL_STATE_FLAG_BAD_HWID 标志,这意味着真实的硬件标识符和存储在序列号中的标识符不匹配。我们在屏幕上看到的当前标识符是 “new test” ,而序列号是 “test” 。如果我们将 ini 文件中的 KeyHWID 参数更改为 “新测试” ,我们也可以让我们的序列号在这个 “硬件” 上工作。