步骤 1.9:硬件锁
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。
接收硬件标识符
在我们锁定硬件之前,我们必须收到一个硬件标识符。标识符被放入序列号中,当序列号传递给许可系统时,它会检查标识符是否匹配。因此,首先我们需要接收硬件的标识符。让我们将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 文件中再添加一行。这次我们定义“放入”序列号的标识符:
KeyHWID=test
然后我们将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; 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 参数更改为“new test”,我们也可以让我们的序列号在这个“硬件”上工作。