步驟 1.9:硬件鎖
VMProtect 是保護(hù)應(yīng)用程序代碼免遭分析和破解的可靠工具,但只有在正確構(gòu)建應(yīng)用程序內(nèi)保護(hù)機(jī)制并且沒有可能破壞整個(gè)保護(hù)的典型錯(cuò)誤的情況下才能最有效地使用。
VMProtect 是保護(hù)應(yīng)用程序代碼免遭分析和破解的可靠工具,但只有在正確構(gòu)建應(yīng)用程序內(nèi)保護(hù)機(jī)制并且沒有可能破壞整個(gè)保護(hù)的典型錯(cuò)誤的情況下才能最有效地使用。
接收硬件標(biāo)識(shí)符
在我們鎖定硬件之前,我們必須收到一個(gè)硬件標(biāo)識(shí)符。標(biāo)識(shí)符被放入序列號(hào)中,當(dāng)序列號(hào)傳遞給許可系統(tǒng)時(shí),它會(huì)檢查標(biāo)識(shí)符是否匹配。因此,首先我們需要接收硬件的標(biāo)識(shí)符。讓我們將main()函數(shù)減少到最低限度:
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; }
通過(guò)運(yùn)行該程序,我們會(huì)收到一個(gè)默認(rèn)的測(cè)試硬件標(biāo)識(shí)符:
HWID:myhwid
要更改標(biāo)識(shí)符,請(qǐng)將以下行添加到 ini 文件中:
MyHWID=test
如果我們之后運(yùn)行程序,我們可以看到系統(tǒng)認(rèn)為“test”是我們 PC 的硬件標(biāo)識(shí)符:
HWID: test
重要的!只有經(jīng)過(guò) VMProtect 處理后,程序才會(huì)顯示真實(shí)的硬件標(biāo)識(shí)符。
硬件鎖定序列號(hào)
要將我們的測(cè)試序列號(hào)鎖定到硬件,我們應(yīng)該在 ini 文件中再添加一行。這次我們定義“放入”序列號(hào)的標(biāo)識(shí)符:
KeyHWID=test
然后我們將main()復(fù)雜化一點(diǎn)?,F(xiàn)在它將傳遞一個(gè)序列號(hào)并分析它得到的結(jié)果:
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; }
運(yùn)行代碼后我們會(huì)看到如下結(jié)果:
HWID: test state = 0
許可系統(tǒng)已將當(dāng)前硬件標(biāo)識(shí)符與序列號(hào)中寫入的標(biāo)識(shí)符進(jìn)行比較。標(biāo)識(shí)符相等,因此VMProtectSetSerialNumber()函數(shù)返回 0——序列號(hào)匹配。
現(xiàn)在讓我們嘗試在另一個(gè)硬件上“運(yùn)行”我們的程序。我們只需將 ini 文件中 MyHWID 參數(shù)的值從“test”更改為“new test”。再次運(yùn)行程序:
HWID: new test state = SERIAL_STATE_FLAG_BAD_HWID
這次許可系統(tǒng)返回了 SERIAL_STATE_FLAG_BAD_HWID 標(biāo)志,這意味著真實(shí)的硬件標(biāo)識(shí)符與存儲(chǔ)在序列號(hào)中的不匹配。我們?cè)谄聊簧峡吹降漠?dāng)前標(biāo)識(shí)符是“new test”,而序列號(hào)是“test”。如果我們將 ini 文件中的 KeyHWID 參數(shù)更改為“new test”,我們也可以讓我們的序列號(hào)在這個(gè)“硬件”上工作。