步驟 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”,我們也可以讓我們的序列號在這個“硬件”上工作。