許可系統(tǒng) API 功能
VMProtect 是新一代軟件盜版保護(hù)解決方案。VMProtect 是目前強(qiáng)大的反盜版解決方案之一,許多領(lǐng)先的軟件發(fā)行商都在使用它。VMProtect允許保護(hù)可執(zhí)行文件(EXE,SCR),動(dòng)態(tài)鏈接庫(kù)(DLL,OCX,BPL)和驅(qū)動(dòng)程序(SYS)。
加密解密技術(shù)交流群(766135708)
許可系統(tǒng) API 功能
許可系統(tǒng) API 是 VMProtect API 及其 SDK 的一個(gè)組成部分。API 允許你指定一個(gè)序列號(hào),并搜索關(guān)于它的所有信息:是否適合該程序,序列號(hào)是否過期,該產(chǎn)品注冊(cè)的名稱等等。此外,該API還提供了程序運(yùn)行的計(jì)算機(jī)的硬件標(biāo)識(shí)符。
VMProtectSetSerialNumber
該函數(shù)向許可系統(tǒng)加載一個(gè)序列號(hào)。調(diào)用語法:
int VMProtectSetSerialNumber(const char *SerialNumber);
輸入的SerialNumber參數(shù)必須包含一個(gè)指針,指向一個(gè)包含base-64編碼的序列號(hào)的空尾字符串('\0′)。該函數(shù)返回一個(gè)序列號(hào)狀態(tài)標(biāo)志的位掩碼,與VMProtectGetSerialNumberState()返回的相同。你可以在下面閱讀更多關(guān)于標(biāo)志的信息。如果該函數(shù)返回0,則序列號(hào)為 "good"。
VMProtectGetSerialNumberState
該函數(shù)為調(diào)用VMProtectSetSerialNumber()指定的序列號(hào)返回狀態(tài)標(biāo)志。
int VMProtectGetSerialNumberState();
如果至少有一個(gè)標(biāo)志被設(shè)置,說明序列號(hào)有問題,程序就不應(yīng)該工作。標(biāo)志和它們的值的詳細(xì)描述列在下表中:
Flag | Value | Description |
---|---|---|
SERIAL_STATE_FLAG_CORRUPTED | 0×00000001 | 許可系統(tǒng)被破壞??赡艿脑蚴牵罕Wo(hù)項(xiàng)目的設(shè)置不正確,試圖破解。 |
SERIAL_STATE_FLAG_INVALID | 0×00000002 | 序列號(hào)不正確。如果許可系統(tǒng)不能解密序列號(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)已經(jīng)過期。你可以通過調(diào)用VMProtectGetSerialNumberData()獲得關(guān)于過期日期的詳細(xì)信息 |
SERIAL_STATE_FLAG_RUNNING_TIME_OVER | 0×00000010 | 程序的操作時(shí)間已耗盡。你可以通過調(diào)用VMProtectGetSerialNumberData()獲得有關(guān)程序運(yùn)行時(shí)間的詳細(xì)信息。 |
SERIAL_STATE_FLAG_BAD_HWID | 0×00000020 | 硬件標(biāo)識(shí)符與密鑰中規(guī)定的硬件標(biāo)識(shí)符不一致。 |
SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED | 0×00000040 | 序列號(hào)與被保護(hù)程序的當(dāng)前版本不匹配。你可以通過調(diào)用 VMProtectGetSerialNumberData()獲得與該序列號(hào)匹配的程序的最大構(gòu)建日期。 |
VMProtectGetSerialNumberData
該函數(shù)獲取調(diào)用VMProtectSetSerialNumber()獲得的序列號(hào)的內(nèi)容信息。調(diào)用語法;
bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size);
第一個(gè)參數(shù)是一個(gè)指向VMProtectSerialNumberData結(jié)構(gòu)的指針,所有必要的信息都將被寫入該結(jié)構(gòu)。第二個(gè)參數(shù)是第一個(gè)參數(shù)中傳遞的結(jié)構(gòu)的大小。它被要求用來控制結(jié)構(gòu)的格式。如果許可系統(tǒng)被破壞(見SERIAL_STATE_FLAG_CORRUPTED標(biāo)志),如果提供的結(jié)構(gòu)地址為零,或者傳遞的結(jié)構(gòu)大小不正確,該函數(shù)返回FALSE。在所有其他情況下,該函數(shù)返回TRUE,并將所有關(guān)于序列號(hào)的信息記錄到提供的地址。下面是該結(jié)構(gòu)的成分:
Element | Type | Description |
---|---|---|
nState | int | 表示一個(gè)鍵的狀態(tài)的位標(biāo)志掩碼。類似于VMProtectGetSerialNumberState() |
wUserName | wchar_t[256] | 以UNICODE為單位的客戶名稱,以空結(jié)尾 |
wEMail | wchar_t[256] | 密鑰過期日期。VMProtectDate結(jié)構(gòu)的格式描述如下。 |
dtExpire | VMProtectDate | 密鑰過期日期。VMProtectDate結(jié)構(gòu)的格式描述如下。 |
dtMaxBuild | VMProtectDate | 給定的密鑰可以使用的最大產(chǎn)品構(gòu)建日期。VMProtectDate結(jié)構(gòu)的格式描述如下。 |
bRunningTime | int | 程序?qū)⒐ぷ鞯姆昼姅?shù)(一個(gè)療程的最長(zhǎng)時(shí)間)。以分鐘為單位的數(shù)值從程序開始時(shí)算起。. |
nUserDataLength | unsigned char | bUserData字段中用戶數(shù)據(jù)的長(zhǎng)度。 |
bUserData | unsigned char[255] | 放入密鑰的用戶數(shù)據(jù)。實(shí)際的字節(jié)數(shù)在nUserDataLength中指定。 |
VMProtectDate結(jié)構(gòu)通過一個(gè)緊湊的日期表示。它的字段在下表中列出:
Element | Type | Description |
---|---|---|
wYear | unsigned short | 年 |
bMonth | unsigned char | 月,從一開始 |
bDay | unsigned char | 日,從一開始 |
VMProtectGetCurrentHWID
該函數(shù)獲取程序所工作的PC的硬件標(biāo)識(shí)符。調(diào)用句法:
int VMProtectGetCurrentHWID(char * HWID, int Size);
第一個(gè)參數(shù)是一個(gè)指針,指向標(biāo)識(shí)符被寫入的內(nèi)存區(qū)域。第二個(gè)參數(shù)是這個(gè)區(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