| 導購 | 订阅 | 在线投稿
分享
 
 
 

VC++中利用磁盤序列號識別正版軟件

來源:互聯網網民  2008-06-01 01:57:15  評論

摘要:本文講述了獲取磁盤序列號的方法,並利用所讀取的磁盤序列號來作爲甄別正版軟件的一種手段。

要害字:磁盤序列號、正版軟件、識別

一、 引言

作爲程序員,不希望看到自己辛辛勞苦編制的軟件被盜版,雖然國家爲了打擊盜版和保護知識産權出台了一系列的相關法律法規,但仍有衆多的地下盜版商在利益的驅使下置國法于不顧,對衆多的軟件進行非法複制、傳播,所以身爲程序員有必要加強自我保護意識、利用自身在編程方面的優勢對自己編寫的軟件進行保護,防止或盡量減少被盜版的可能性。本文就針對這個問題提出了一種簡便易行的對正版軟件進行甄別的方法。

二、 設計思路與實現原理

雖然可以用純軟件的方式通過對輸入的産品序列號進行判定的方式來驗證該軟件是否爲正版,但由于序列號要由用戶手工輸入,位數較少的話達不到保護軟件的目的,太長又不便用戶輸入,而且盜版商可以用Soft-ICE等調試跟蹤軟件查找到需要輸入序列號的對話框被調用的地址,通過對該地址的修改,可以很輕松的跳過對産品序列號的驗證過程,使之發揮不了作用。相比之下,利用硬件或采用軟件兼有硬件的加密方式可以達到較好的保護效果,因爲硬件究竟不象軟件那樣輕易被複制、分析、更改。而且采用這種方式一般不需要用戶做什麽工作,判別工作都是由軟件在後台自動完成的,使用起來比較方便。在此領域做的較好的北京江民公司的KV300系列殺毒軟件就是通過對正版殺毒盤人爲對載體軟盤的某扇區的數據進行更改,使之具有非凡的標記,由于該扇區被人爲設置爲"壞扇區"所以不會隨數據拷貝到其他軟盤,而沒有該非凡扇區的磁盤是無法正常運行程序的,這種結合硬件來保護軟件的方法還是比較可靠的。

雖然利用磁盤扇區對正版軟件進行標注的可靠性較高,但實現起來較煩瑣。本文采用一種通過對磁盤的序列號進行判別的方式簡單而又可靠地保護軟件不被非法傳播。在微軟的操作系統中,對每一個磁盤都在其格式化時設置有一個隨機的8字節長的序列號,雖然理論上有重複的可能,但實際上要找到兩個相同的磁盤序列號是很困難的,根據概率論的知識可以算出碰到兩個相同磁盤序列號的概率爲0.00000000023283,即大約5億多張磁盤中才會碰到相同的序列號,對我們來說這已經足夠了 。而且磁盤序列號也不會隨著磁盤上的軟件內容的拷貝而拷貝,所以我們在此把磁盤序列號作爲唯一識別碼應用于我們的軟件中,可以用API函數GetVolumeInformation來很方便的獲取磁盤的序列號,其原型聲明如下:

BOOL GetVolumeInformation( LPCTSTR lPRootPathName,

LPTSTR lpVolumeNameBuffer,

DWord nVolumeNameSize,

LPDWORD lpVolumeSerialNumber,

LPDWORD lpMaximumComponentLength,

LPDWORD lpFileSystemFlags,

LPTSTR lpFileSystemNameBuffer,

DWORD nFileSystemNameSize );

在這裏只需通過lpRootPathName來設置我們需要檢測的磁盤驅動器號,執行後結果保存在lpVolumeSerialNumber中,其他參數我們不關心,均設爲空(NULL)。

VC++中利用磁盤序列號識別正版軟件

我們必須在程序開始執行時馬上進行檢測工作,驗證爲正版的才可以繼續執行,否則就終止程序的運行使盜版無法使用,從而達到保護正版軟件的目的。我們答應將同一份正版軟件安裝到有限的多台計算機中,將識別用的唯一標識符用軟盤的磁盤序列號來表示,這張軟盤就作爲該套軟件的鑰匙盤,首先檢測在硬盤中是否有認證文件,假如沒有就把鑰匙盤插入到軟驅,在驗證序列號正確的前提下把C盤的序列號保存到認證文件中,下次運行程序就會檢測到認證文件,通過對認證文件內容和C盤序列號的動態比較來識別是否是正版,假如不能匹配,需要再插入鑰匙盤再做一個認證文件。所以整個驗證系統只需該套軟件在某台計算機上首次運行程序時需要使用一次鑰匙盤,或是在認證文件發生損壞後需要使用鑰匙盤對其進行恢複,其余時間均由認證文件對正版進行保證。下面的流程圖展示了程序對正版的唯一標識符進行驗證的全部過程:

VC++中利用磁盤序列號識別正版軟件
更多內容請看常用軟件加密寶典 軟件插件 殺毒軟件專欄專題,或

三、 程序的具體實現

在程序正式編寫之前,需要預先獲取到作爲鑰匙盤的軟盤的磁盤序列號,使之作爲我們判定軟件是否爲正版的依據。可用前面提到的API函數GetVolumeInformation()來實現:

DWORD dwSerialNum;

GetVolumeInformation("A:\\",NULL,NULL,&dwSerialNum,NULL,NULL,NULL,NULL);

雙字型變量dwSerialNum內保存有鑰匙盤的序列號。並把該值在正式程序中用#define宏定義爲一個常量,作爲正版的標識。由于需要在程序正式運行前對程序的正版與否進行識別所以需要在程序的入口函數,應用程序類的InitInstance()函數中對其進行編程,並且應該在識別完畢之前用m_pMainWnd->ShowWindow(SW_HIDE);函數隱藏程序主界面,直至判定爲正版之後方可改變其參數爲"SW_SHOW"將主界面正常顯示。下面是對認證文件進行判別的主要代碼:

……

if(file.Open("Logo.ini",CFile::modeReadWrite)==FALSE)

{

AfxMessageBox("請將正版鑰匙盤插入到軟驅!");

MakeKey();

}

else

{

file.Read(logo,20);

file.Close();

DWORD LogoNum=atol(logo);

GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL);

if(LogoNum!=dwIDESerial)

{

AfxMessageBox("請將正版鑰匙盤插入到軟驅!");

MakeKey();

}

else

m_bCanRun=true;

}

……

if(m_bCanRun==true)

{

m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);

m_pMainWnd->UpdateWindow();

}

else

PostQuitMessage(0);

跟據設計的流程圖,當沒有發現認證文件(首次運行程序)時或是認證文件內容與C盤的序列號不匹配(認證文件出錯)時就要利用鑰匙盤創建/恢複認證文件,下面是實現該功能的MakeKey函數的部分要害代碼: ……

GetVolumeInformation("A:\\",NULL,NULL,&dwSerialNum,NULL,NULL,NULL,NULL);

if(dwSerialNum==SerialNum)//SerialNum就是我們預先獲取的作爲正版標識的序列號

{

GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL);

ltoa(dwIDESerial,logo,10);

while(logo[i]!=』\0』)

i++;

……

file.Open("Logo.ini",CFile::modeCreate CFile::modeReadWrite);

file.Write(logo,i);

file.Close();

AfxMessageBox("已通過認證,下次使用時不必再插入鑰匙軟盤!");

m_bCanRun=true;

}

else

{

AfxMessageBox("請插入正版鑰匙軟盤再執行本程序!");

m_bCanRun=false;

}

四、 小結

本文介紹的只是此類軟件中的一種實現方法,在理解本文編程思想的基礎下也可以采用其他類似的方法對軟件進行保護,比如也可以用網卡的標識號作爲認證的標識等等。而且也可以用類似的方式發布共享軟件,以用戶反饋回的硬件參數作爲輸入來産生注冊碼等等。總之,具體如何應用仍要根據實際的需求而靈活的作出決定。本程序在windows 2000 Professional下,由Microsoft Visual C++ 6.0編譯調試通過。

VC++中利用磁盤序列號識別正版軟件
更多內容請看常用軟件加密寶典 軟件插件 殺毒軟件專欄專題,或

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
摘要:本文講述了獲取磁盤序列號的方法,並利用所讀取的磁盤序列號來作爲甄別正版軟件的一種手段。   要害字:磁盤序列號、正版軟件、識別   一、 引言   作爲程序員,不希望看到自己辛辛勞苦編制的軟件被盜版,雖然國家爲了打擊盜版和保護知識産權出台了一系列的相關法律法規,但仍有衆多的地下盜版商在利益的驅使下置國法于不顧,對衆多的軟件進行非法複制、傳播,所以身爲程序員有必要加強自我保護意識、利用自身在編程方面的優勢對自己編寫的軟件進行保護,防止或盡量減少被盜版的可能性。本文就針對這個問題提出了一種簡便易行的對正版軟件進行甄別的方法。   二、 設計思路與實現原理   雖然可以用純軟件的方式通過對輸入的産品序列號進行判定的方式來驗證該軟件是否爲正版,但由于序列號要由用戶手工輸入,位數較少的話達不到保護軟件的目的,太長又不便用戶輸入,而且盜版商可以用Soft-ICE等調試跟蹤軟件查找到需要輸入序列號的對話框被調用的地址,通過對該地址的修改,可以很輕松的跳過對産品序列號的驗證過程,使之發揮不了作用。相比之下,利用硬件或采用軟件兼有硬件的加密方式可以達到較好的保護效果,因爲硬件究竟不象軟件那樣輕易被複制、分析、更改。而且采用這種方式一般不需要用戶做什麽工作,判別工作都是由軟件在後台自動完成的,使用起來比較方便。在此領域做的較好的北京江民公司的KV300系列殺毒軟件就是通過對正版殺毒盤人爲對載體軟盤的某扇區的數據進行更改,使之具有非凡的標記,由于該扇區被人爲設置爲"壞扇區"所以不會隨數據拷貝到其他軟盤,而沒有該非凡扇區的磁盤是無法正常運行程序的,這種結合硬件來保護軟件的方法還是比較可靠的。   雖然利用磁盤扇區對正版軟件進行標注的可靠性較高,但實現起來較煩瑣。本文采用一種通過對磁盤的序列號進行判別的方式簡單而又可靠地保護軟件不被非法傳播。在微軟的操作系統中,對每一個磁盤都在其格式化時設置有一個隨機的8字節長的序列號,雖然理論上有重複的可能,但實際上要找到兩個相同的磁盤序列號是很困難的,根據概率論的知識可以算出碰到兩個相同磁盤序列號的概率爲0.00000000023283,即大約5億多張磁盤中才會碰到相同的序列號,對我們來說這已經足夠了 。而且磁盤序列號也不會隨著磁盤上的軟件內容的拷貝而拷貝,所以我們在此把磁盤序列號作爲唯一識別碼應用于我們的軟件中,可以用API函數GetVolumeInformation來很方便的獲取磁盤的序列號,其原型聲明如下: BOOL GetVolumeInformation( LPCTSTR lPRootPathName, LPTSTR lpVolumeNameBuffer, DWord nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize );   在這裏只需通過lpRootPathName來設置我們需要檢測的磁盤驅動器號,執行後結果保存在lpVolumeSerialNumber中,其他參數我們不關心,均設爲空(NULL)。 [url=/bbs/detail_1785072.html][img]http://image.wangchao.net.cn/it/1323424823722.gif[/img][/url]   我們必須在程序開始執行時馬上進行檢測工作,驗證爲正版的才可以繼續執行,否則就終止程序的運行使盜版無法使用,從而達到保護正版軟件的目的。我們答應將同一份正版軟件安裝到有限的多台計算機中,將識別用的唯一標識符用軟盤的磁盤序列號來表示,這張軟盤就作爲該套軟件的鑰匙盤,首先檢測在硬盤中是否有認證文件,假如沒有就把鑰匙盤插入到軟驅,在驗證序列號正確的前提下把C盤的序列號保存到認證文件中,下次運行程序就會檢測到認證文件,通過對認證文件內容和C盤序列號的動態比較來識別是否是正版,假如不能匹配,需要再插入鑰匙盤再做一個認證文件。所以整個驗證系統只需該套軟件在某台計算機上首次運行程序時需要使用一次鑰匙盤,或是在認證文件發生損壞後需要使用鑰匙盤對其進行恢複,其余時間均由認證文件對正版進行保證。下面的流程圖展示了程序對正版的唯一標識符進行驗證的全部過程: [url=/bbs/detail_1785072.html][img]http://image.wangchao.net.cn/it/1323424823817.gif[/img][/url] 更多內容請看常用軟件加密寶典 軟件插件 殺毒軟件專欄專題,或   三、 程序的具體實現   在程序正式編寫之前,需要預先獲取到作爲鑰匙盤的軟盤的磁盤序列號,使之作爲我們判定軟件是否爲正版的依據。可用前面提到的API函數GetVolumeInformation()來實現: DWORD dwSerialNum; GetVolumeInformation("A:\\",NULL,NULL,&dwSerialNum,NULL,NULL,NULL,NULL);   雙字型變量dwSerialNum內保存有鑰匙盤的序列號。並把該值在正式程序中用#define宏定義爲一個常量,作爲正版的標識。由于需要在程序正式運行前對程序的正版與否進行識別所以需要在程序的入口函數,應用程序類的InitInstance()函數中對其進行編程,並且應該在識別完畢之前用m_pMainWnd->ShowWindow(SW_HIDE);函數隱藏程序主界面,直至判定爲正版之後方可改變其參數爲"SW_SHOW"將主界面正常顯示。下面是對認證文件進行判別的主要代碼: …… if(file.Open("Logo.ini",CFile::modeReadWrite)==FALSE) {   AfxMessageBox("請將正版鑰匙盤插入到軟驅!");   MakeKey(); } else {   file.Read(logo,20);   file.Close();   DWORD LogoNum=atol(logo);   GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL);   if(LogoNum!=dwIDESerial)   {    AfxMessageBox("請將正版鑰匙盤插入到軟驅!");    MakeKey();   }   else    m_bCanRun=true; } …… if(m_bCanRun==true) {   m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);   m_pMainWnd->UpdateWindow(); } else PostQuitMessage(0);   跟據設計的流程圖,當沒有發現認證文件(首次運行程序)時或是認證文件內容與C盤的序列號不匹配(認證文件出錯)時就要利用鑰匙盤創建/恢複認證文件,下面是實現該功能的MakeKey函數的部分要害代碼: …… GetVolumeInformation("A:\\",NULL,NULL,&dwSerialNum,NULL,NULL,NULL,NULL); if(dwSerialNum==SerialNum)//SerialNum就是我們預先獲取的作爲正版標識的序列號 {   GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL);   ltoa(dwIDESerial,logo,10);   while(logo[i]!=』\0』)    i++;   ……   file.Open("Logo.ini",CFile::modeCreate CFile::modeReadWrite);   file.Write(logo,i);   file.Close();   AfxMessageBox("已通過認證,下次使用時不必再插入鑰匙軟盤!");   m_bCanRun=true; } else {   AfxMessageBox("請插入正版鑰匙軟盤再執行本程序!");   m_bCanRun=false; }   四、 小結   本文介紹的只是此類軟件中的一種實現方法,在理解本文編程思想的基礎下也可以采用其他類似的方法對軟件進行保護,比如也可以用網卡的標識號作爲認證的標識等等。而且也可以用類似的方式發布共享軟件,以用戶反饋回的硬件參數作爲輸入來産生注冊碼等等。總之,具體如何應用仍要根據實際的需求而靈活的作出決定。本程序在windows 2000 Professional下,由Microsoft Visual C++ 6.0編譯調試通過。 [url=/bbs/detail_1785072.html][img]http://image.wangchao.net.cn/it/1323424823843.gif[/img][/url] 更多內容請看常用軟件加密寶典 軟件插件 殺毒軟件專欄專題,或
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有