您好,登錄后才能下訂單哦!
一、原理分析
通過(guò)分析VMProtect憑證管理的配置過(guò)程、測(cè)試各項(xiàng)配置的實(shí)際效果,可以推斷憑證管理的基本原理如下:
1、利用RSA算法生成一個(gè)公私鑰對(duì);
2、將公鑰寫(xiě)入到加殼后的可執(zhí)行文件,用于解密注冊(cè)碼;
3、根據(jù)用戶的配置,將客戶名稱、E-Mail、硬件碼、截止日期、運(yùn)行時(shí)間限制、最終創(chuàng)建日期、使用者信息、被屏蔽注冊(cè)碼中選中的字段用私鑰加密后寫(xiě)入到加殼后的可執(zhí)行文件;
4、加殼后的可執(zhí)行文件運(yùn)行時(shí),獲取用戶提供的注冊(cè)碼,然后用保存在自身內(nèi)部的公鑰對(duì)其進(jìn)行解密,解密之后對(duì)各類限制條件(各類限制條件的含義如下表)進(jìn)行判斷,如果不符合就拒絕運(yùn)行。
字段 | 含義 | 說(shuō)明 |
客戶名稱 | 用戶名 | 提示信息,無(wú)限制作用 |
用戶的郵箱地址 | 提示信息,無(wú)限制作用 | |
硬件碼 | 根據(jù)MAC、CPU、BIOS等信息計(jì)算得到的計(jì)算機(jī)的唯一標(biāo)示 | 限制軟件只能在指定的機(jī)器上運(yùn)行 |
截止日期 | 軟件可以運(yùn)行的截止日期 | 限制軟件只能在指定日期之前運(yùn)行 |
運(yùn)行時(shí)間限制 | 軟件啟動(dòng)可以運(yùn)行的時(shí)間(單位分鐘) | 限制軟件每次的運(yùn)行時(shí)間 |
最終創(chuàng)建日期 | 允許運(yùn)行的最晚編譯時(shí)間 | 常用于限制更新服務(wù),比如此日期設(shè)置為2016-1-1,那么對(duì)于2016-1-1之后編譯的軟件,注冊(cè)碼將無(wú)效 |
使用者信息 | 自定義的一些信息 | 用法暫不知 |
被屏蔽注冊(cè)碼 | 被屏蔽的注冊(cè)碼將無(wú)效 | 黑名單,但這個(gè)黑名單應(yīng)該沒(méi)有通過(guò)網(wǎng)絡(luò)進(jìn)行遠(yuǎn)程驗(yàn)證。因此對(duì)于此注冊(cè)碼尚未被拉黑的軟件版本是起不到限制作用的 |
二、用法
1、在代碼中使用憑證管理功能
代碼如下,假設(shè)編譯得到程序?yàn)閠est.exe
#include<windows.h>
#include"VMProtectSDK.h"
#pragmacomment(lib, "VMProtectSDK32.lib")
voidprint_state(INT state)
{
if (state& SERIAL_STATE_FLAG_CORRUPTED)
{
MessageBox(NULL,"許可文件損壞", "錯(cuò)誤", 0);
}
else if(state & SERIAL_STATE_FLAG_INVALID)
{
MessageBox(NULL,"許可文件無(wú)效", "錯(cuò)誤", 0);
}
else if(state & SERIAL_STATE_FLAG_BLACKLISTED)
{
MessageBox(NULL,"許可文件被列入黑名單", "錯(cuò)誤", 0);
}
else if(state & SERIAL_STATE_FLAG_DATE_EXPIRED)
{
MessageBox(NULL,"許可文件過(guò)期", "錯(cuò)誤", 0);
}
else if(state & SERIAL_STATE_FLAG_RUNNING_TIME_OVER)
{
MessageBox(NULL,"許可文件時(shí)限到", "錯(cuò)誤", 0);
}
else if(state & SERIAL_STATE_FLAG_BAD_HWID)
{
MessageBox(NULL,"硬件ID不符","錯(cuò)誤", 0);
}
else if(state & SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED)
{
MessageBox(NULL,"版本過(guò)期", "錯(cuò)誤", 0);
}
}
char*read_serial(const char *fname)
{
FILE *f =fopen(fname, "rb");
if (NULL== f) return NULL;
fseek(f,0, SEEK_END);
int s =ftell(f);
fseek(f,0, SEEK_SET);
char *buf= new char[s + 1];
fread(buf,s, 1, f);
buf[s] =0;
fclose(f);
returnbuf;
}
boolValidSerial()
{
char*serial = read_serial("serial.txt");
int res =VMProtectSetSerialNumber(serial);
delete[]serial;
if (res)
{
print_state(res);
returnfalse;
}
returnTRUE;
}
int_tmain(int argc, _TCHAR* argv[])
{
if (argc== 2)
{
int nSize= VMProtectGetCurrentHWID(NULL, 0); // get number of required bytes
char*pBuf = new char[nSize]; // allocate buffer
VMProtectGetCurrentHWID(pBuf,nSize); // obtain hardeare identifier// use it
printf("%s\n",pBuf);
deletepBuf;
}
else
{
if (ValidSerial())
printf("ok\n");
else
printf("err\n");
}
return 0;
}
2、配置憑證管理參數(shù)得到注冊(cè)碼
點(diǎn)擊 授權(quán)管理→生成
根據(jù)需求,選擇相應(yīng)的內(nèi)容,點(diǎn)擊序列號(hào),然后把序列號(hào)保存到serial.txt文件中。如果序列號(hào)內(nèi)容包括硬件碼,運(yùn)行test.exe aaa(任意加一個(gè)參數(shù)即可)即可得到本機(jī)的硬件碼。
3、運(yùn)行測(cè)試
把serial.txt文件與exe文件放到同一目錄下,運(yùn)行exe進(jìn)行測(cè)試,看是否達(dá)到預(yù)期效果。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。