步驟1.6:限制程序的運(yùn)行時(shí)間
VMProtect 是保護(hù)應(yīng)用程序代碼免遭分析和破解的可靠工具,但只有在正確構(gòu)建應(yīng)用程序內(nèi)保護(hù)機(jī)制并且沒(méi)有可能破壞整個(gè)保護(hù)的典型錯(cuò)誤的情況下才能最有效地使用。
VMProtect 是保護(hù)應(yīng)用程序代碼免遭分析和破解的可靠工具,但只有在正確構(gòu)建應(yīng)用程序內(nèi)保護(hù)機(jī)制并且沒(méi)有可能破壞整個(gè)保護(hù)的典型錯(cuò)誤的情況下才能最有效地使用。
您可以限制程序從啟動(dòng)的那一刻開(kāi)始運(yùn)行。這對(duì)于演示目的很有用:您向用戶提供了一個(gè)真實(shí)的序列號(hào),但該程序的運(yùn)行時(shí)間不超過(guò) 5 分鐘。許可系統(tǒng)不會(huì)強(qiáng)制關(guān)閉此類程序,而只是設(shè)置狀態(tài)標(biāo)志。因此,讓我們通過(guò)將以下行添加到 ini 文件來(lái)將最長(zhǎng)工作時(shí)間設(shè)置為一分鐘:
TimeLimit=1
并修改程序如下:
int main(int argc, char **argv) { char *serial = "Xserialnumber"; // we set the serial number directly in the code, for simplicity int res = VMProtectSetSerialNumber(serial); print_state(res); if (res) return 0; VMProtectSerialNumberData sd = {0}; VMProtectGetSerialNumberData(&sd, sizeof(sd)); printf("I will run for %d minute(s)\n", sd.bRunningTime); print_state(VMProtectGetSerialNumberState()); Sleep(60 * 1000 * sd.bRunningTime); printf("After %d minute(s):\n", sd.bRunningTime); print_state(VMProtectGetSerialNumberState()); return 0; }
該程序在啟動(dòng)時(shí)打印序列號(hào)的狀態(tài),然后計(jì)算最長(zhǎng)運(yùn)行時(shí)間并等待其到期。然后再次打印序列號(hào)狀態(tài)。將最大操作時(shí)間設(shè)置為一分鐘后,我們應(yīng)該會(huì)收到以下結(jié)果:
state = 0 I will run for 1 minute(s) state = 0 After 1 minute(s): state = SERIAL_STATE_FLAG_RUNNING_TIME_OVER
受保護(hù)程序應(yīng)定期分析序列號(hào)的狀態(tài),并在設(shè)置標(biāo)志時(shí)關(guān)閉。許可系統(tǒng)不會(huì)自動(dòng)執(zhí)行此操作,因?yàn)槌绦蚩赡苄枰尫艃?nèi)存、將數(shù)據(jù)保存到文件等。此外,您可能希望程序在操作時(shí)間到期后不要停止,而是切換到更受限制的模式。許可系統(tǒng)將此留給開(kāi)發(fā)人員。