將VMProtect集成到應(yīng)用程序教程:許可API函數(shù)
VMProtect是一種很可靠的工具,可以保護(hù)應(yīng)用程序代碼免受分析和破解,但只有在應(yīng)用程序內(nèi)保護(hù)機(jī)制正確構(gòu)建且沒(méi)有可能破壞整個(gè)保護(hù)的嚴(yán)重錯(cuò)誤的情況下,才能實(shí)現(xiàn)最好的效果。
本文介紹許可API函數(shù)的相關(guān)內(nèi)容。
免費(fèi)下載VMProtect體驗(yàn)版 優(yōu)惠購(gòu)買VMProtect正式版
許可系統(tǒng)API是VMProtect API及其SDK的組成部分。使用API可以指定序列號(hào)并檢索有關(guān)它的所有信息,包括是否適合該程序、序列號(hào)是否已過(guò)期、該產(chǎn)品注冊(cè)到的名稱等等。同樣,API提供了程序在其上運(yùn)行的計(jì)算機(jī)的硬件標(biāo)識(shí)符。
VMProtectSetSerialNumber
此函數(shù)將序列號(hào)加載到許可系統(tǒng)。調(diào)用語(yǔ)法:
int VMProtectSetSerialNumber(const char * SerialNumber);輸入的SerialNumber參數(shù)必須包含一個(gè)指向以null結(jié)尾的字符串('\ 0')的指針,該字符串包含以64為基數(shù)的序列號(hào)。該函數(shù)返回序列號(hào)狀態(tài)標(biāo)志的位掩碼,與VMProtectGetSerialNumberState()返回的掩碼相同。您可以在下面閱讀有關(guān)標(biāo)志的更多信息。如果函數(shù)返回0,則序列號(hào)為“good”。
VMProtectGetSerialNumberState
此函數(shù)返回通過(guò)調(diào)用VMProtectSetSerialNumber()指定的序列號(hào)的狀態(tài)標(biāo)志。
int VMProtectGetSerialNumberState();如果至少設(shè)置了一個(gè)標(biāo)志,則序列號(hào)有問(wèn)題。如果設(shè)置了至少一位,該程序?qū)o(wú)法運(yùn)行。下表列出了標(biāo)志及其值的詳細(xì)說(shuō)明:
Flag |
值 | 描述 |
SERIAL_STATE_FLAG_CORRUPTED |
0×00000001 |
許可系統(tǒng)已損壞。原因可能是:保護(hù)項(xiàng)目的設(shè)置錯(cuò)誤,嘗試破解。 |
SERIAL_STATE_FLAG_INVALID |
0×00000002 |
序列號(hào)不正確。如果許可系統(tǒng)無(wú)法解密序列號(hào),則設(shè)置該標(biāo)志。 |
SERIAL_STATE_FLAG_BLACKLISTED |
0×00000004 |
序列號(hào)與產(chǎn)品匹配,但在VMProtect中列為黑色。 |
SERIAL_STATE_FLAG_DATE_EXPIRED |
0×00000008 |
序列號(hào)已過(guò)期。可通過(guò)調(diào)用VMProtectGetSerialNumberData()獲得有關(guān)到期日期的詳細(xì)信息。 |
SERIAL_STATE_FLAG_RUNNING_TIME_OVER |
0×00000010 |
該程序的運(yùn)行時(shí)間已用完。您可以通過(guò)調(diào)用VMProtectGetSerialNumberData()獲得有關(guān)程序運(yùn)行時(shí)間的詳細(xì)信息。 |
SERIAL_STATE_FLAG_BAD_HWID |
0×00000020 |
硬件標(biāo)識(shí)符與密鑰中指定的硬件標(biāo)識(shí)符不匹配。 |
SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED |
0×00000040 |
序列號(hào)與受保護(hù)程序的當(dāng)前版本不匹配。可通過(guò)調(diào)用VMProtectGetSerialNumberData()獲得此序列號(hào)匹配的程序的最大構(gòu)建日期。 |
此函數(shù)獲取有關(guān)通過(guò)調(diào)用VMProtectSetSerialNumber()獲得的序列號(hào)內(nèi)容的信息。調(diào)用語(yǔ)法:
bool VMProtectGetSerialNumberData(VMProtectSerialNumberData * Data,int Size);第一個(gè)參數(shù)是指向VMProtectSerialNumberData結(jié)構(gòu)的指針,將在其中寫入所有必要的信息。第二個(gè)參數(shù)是第一個(gè)參數(shù)中傳遞的結(jié)構(gòu)的大小。需要控制結(jié)構(gòu)的格式。如果許可系統(tǒng)已損壞(請(qǐng)參見(jiàn)SERIAL_STATE_FLAG_CORRUPTED標(biāo)志)、提供的結(jié)構(gòu)地址為零或傳遞的結(jié)構(gòu)大小不正確,則該函數(shù)返回FALSE。在其他情況下,該函數(shù)返回TRUE,并將有關(guān)序列號(hào)的所有信息記錄到提供的地址中。以下是該結(jié)構(gòu)的要素:
元素 | 類型 | 描述 |
nState |
int |
指示密鑰狀態(tài)的位標(biāo)志掩碼。與VMProtectGetSerialNumberState()返回的類似。 |
wUserName |
wchar_t[256] |
UNICODE中的客戶名稱,以空值結(jié)尾。 |
wEMail |
wchar_t[256] |
客戶使用UNICODE的電子郵件,以零結(jié)尾。 |
dtExpire |
VMProtectDate |
密鑰到期日期。VMProtectDate結(jié)構(gòu)的格式如下所述。 |
dtMaxBuild |
VMProtectDate |
給定密鑰可以使用的最大產(chǎn)品生產(chǎn)日期。VMProtectDate結(jié)構(gòu)的格式如下所述。 |
bRunningTime |
int |
該程序?qū)⑦\(yùn)行的分鐘數(shù)(一個(gè)會(huì)話的最長(zhǎng)持續(xù)時(shí)間)。以分鐘為單位的值,從程序啟動(dòng)時(shí)算起。 |
nUserDataLength |
unsigned char |
bUserData字段中用戶數(shù)據(jù)的長(zhǎng)度。 |
bUserData |
unsigned char[255] |
用戶數(shù)據(jù)放入密鑰中。實(shí)際的字節(jié)數(shù)在nUserDataLength中指定。 |
元素 | 類型 | 描述 |
wYear |
無(wú)符號(hào)短 |
年 |
bMonth |
無(wú)符號(hào)字符 |
月份,從1開(kāi)始 |
bDay |
無(wú)符號(hào)字符 |
天,從1開(kāi)始 |
該功能獲取程序正在運(yùn)行的PC的硬件標(biāo)識(shí)符。調(diào)用語(yǔ)法:
int VMProtectGetCurrentHWID(char * HWID,int大小);第一個(gè)參數(shù)是指向?qū)懭霕?biāo)識(shí)符的存儲(chǔ)區(qū)的指針。第二個(gè)參數(shù)是該區(qū)域的大小。該函數(shù)返回寫入的字節(jié)數(shù),包括尾隨的零字節(jié)('\ 0')。如果第一個(gè)參數(shù)中提供了NULL,則該函數(shù)返回存儲(chǔ)硬件標(biāo)識(shí)符所需的字節(jié)數(shù)。下面是使用該函數(shù)的正確方法:
int nSize = VMProtectGetCurrentHWID(NULL, 0); // get the required buffer size char *pBuf = new char[nSize]; // allocate memory for the buffer VMProtectGetCurrentHWID(pBuf, nSize); // obtain the identifier // use the identifier delete [] pBuf; // release memory
有關(guān) VMProtect 更多資源,請(qǐng)聯(lián)系了解
雙“旦”狂歡鉅惠,領(lǐng)優(yōu)惠券購(gòu)VMProtect享折上折>>>