步驟 1.3:檢索序列號狀態標志
VMProtect 是保護應用程序代碼免遭分析和破解的可靠工具,但只有在正確構建應用程序內保護機制并且沒有可能破壞整個保護的典型錯誤的情況下才能最有效地使用。
VMProtect 是保護應用程序代碼免遭分析和破解的可靠工具,但只有在正確構建應用程序內保護機制并且沒有可能破壞整個保護的典型錯誤的情況下才能最有效地使用。
打印標志的便捷功能
首先,我們需要一個方便的函數來將標志的數值轉換為序列號的可理解狀態。下面是這個函數的代碼:
#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) void print_state(INT state) { if (state == 0) { printf("state = 0\n"); return; } printf("state = "); PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); printf("\n"); }
盡管大小不一,但功能非常簡單——一一檢查所有位標志并打印狀態變量中存在的所有內容。在檢查調用print_state的序列號后替換代碼中的printf,并更改我們傳遞給許可系統的序列號:
char *serial = "Xserialnumber1"; // we set the serial number directly in the code, for simplicity int res = VMProtectSetSerialNumber(serial); print_state(res);
現在,如果我們運行這個程序,下面的消息將被打印到控制臺:
state = SERIAL_STATE_FLAG_INVALID please register!
現在,我們通過刪除“1”放回舊密鑰并再次運行程序:
state = 0 We are registered.
現在,我們可以看到序列號的狀態標志,讓我們開始從序列號中檢索標志和數據。
檢索序列號狀態
您可以通過三種方式獲取序列號的狀態:通過調用VMProtectSetSerialNumber()、通過調用VMProtectGetSerialNumberState()或通過調用VMProtectGetSerialNumberData() – 狀態標志被放入結構的字段之一。每種方法都旨在在特定時間使用。第一次檢查序列號是在安裝期間執行的。此時應拒絕錯誤號碼、過期號碼、黑名單號碼等。一些限制,例如,程序的最長運行時間或序列號到期日期也應在運行時檢查。和VMProtectGetSerialNumberState()方法是這里最快和最方便的方法。如果您需要接收有關序列號的完整信息,您可以使用更強大的VMProtectGetSerialNumberData()函數。