溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

利用vmprotect的憑證管理保護(hù)你的軟件

發(fā)布時(shí)間:2020-07-09 14:00:01 來(lái)源:網(wǎng)絡(luò) 閱讀:4416 作者:watertoeast 欄目:開(kāi)發(fā)技術(shù)

一、原理分析

通過(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ú)限制作用

E-Mail

用戶的郵箱地址

提示信息,無(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è)碼

利用vmprotect的憑證管理保護(hù)你的軟件

點(diǎn)擊 授權(quán)管理→生成

利用vmprotect的憑證管理保護(hù)你的軟件

根據(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ù)期效果。


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI