国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

VC++中利用磁盤(pán)序列號(hào)識(shí)別正版軟件

2019-11-17 05:11:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
摘要:本文講述了獲取磁盤(pán)序列號(hào)的方法,并利用所讀取的磁盤(pán)序列號(hào)來(lái)作為甄別正版軟件的一種手段。

  要害字:磁盤(pán)序列號(hào)、正版軟件、識(shí)別

  一、 引言

  作為程序員,不希望看到自己辛辛勞苦編制的軟件被盜版,雖然國(guó)家為了打擊盜版和保護(hù)知識(shí)產(chǎn)權(quán)出臺(tái)了一系列的相關(guān)法律法規(guī),但仍有眾多的地下盜版商在利益的驅(qū)使下置國(guó)法于不顧,對(duì)眾多的軟件進(jìn)行非法復(fù)制、傳播,所以身為程序員有必要加強(qiáng)自我保護(hù)意識(shí)、利用自身在編程方面的優(yōu)勢(shì)對(duì)自己編寫(xiě)的軟件進(jìn)行保護(hù),防止或盡量減少被盜版的可能性。本文就針對(duì)這個(gè)問(wèn)題提出了一種簡(jiǎn)便易行的對(duì)正版軟件進(jìn)行甄別的方法。

  二、 設(shè)計(jì)思路與實(shí)現(xiàn)原理

  雖然可以用純軟件的方式通過(guò)對(duì)輸入的產(chǎn)品序列號(hào)進(jìn)行判定的方式來(lái)驗(yàn)證該軟件是否為正版,但由于序列號(hào)要由用戶(hù)手工輸入,位數(shù)較少的話(huà)達(dá)不到保護(hù)軟件的目的,太長(zhǎng)又不便用戶(hù)輸入,而且盜版商可以用Soft-ICE等調(diào)試跟蹤軟件查找到需要輸入序列號(hào)的對(duì)話(huà)框被調(diào)用的地址,通過(guò)對(duì)該地址的修改,可以很輕松的跳過(guò)對(duì)產(chǎn)品序列號(hào)的驗(yàn)證過(guò)程,使之發(fā)揮不了作用。相比之下,利用硬件或采用軟件兼有硬件的加密方式可以達(dá)到較好的保護(hù)效果,因?yàn)橛布烤共幌筌浖菢虞p易被復(fù)制、分析、更改。而且采用這種方式一般不需要用戶(hù)做什么工作,判別工作都是由軟件在后臺(tái)自動(dòng)完成的,使用起來(lái)比較方便。在此領(lǐng)域做的較好的北京江民公司的KV300系列殺毒軟件就是通過(guò)對(duì)正版殺毒盤(pán)人為對(duì)載體軟盤(pán)的某扇區(qū)的數(shù)據(jù)進(jìn)行更改,使之具有非凡的標(biāo)記,由于該扇區(qū)被人為設(shè)置為"壞扇區(qū)"所以不會(huì)隨數(shù)據(jù)拷貝到其他軟盤(pán),而沒(méi)有該非凡扇區(qū)的磁盤(pán)是無(wú)法正常運(yùn)行程序的,這種結(jié)合硬件來(lái)保護(hù)軟件的方法還是比較可靠的。

  雖然利用磁盤(pán)扇區(qū)對(duì)正版軟件進(jìn)行標(biāo)注的可靠性較高,但實(shí)現(xiàn)起來(lái)較煩瑣。本文采用一種通過(guò)對(duì)磁盤(pán)的序列號(hào)進(jìn)行判別的方式簡(jiǎn)單而又可靠地保護(hù)軟件不被非法傳播。在微軟的操作系統(tǒng)中,對(duì)每一個(gè)磁盤(pán)都在其格式化時(shí)設(shè)置有一個(gè)隨機(jī)的8字節(jié)長(zhǎng)的序列號(hào),雖然理論上有重復(fù)的可能,但實(shí)際上要找到兩個(gè)相同的磁盤(pán)序列號(hào)是很困難的,根據(jù)概率論的知識(shí)可以算出碰到兩個(gè)相同磁盤(pán)序列號(hào)的概率為0.00000000023283,即大約5億多張磁盤(pán)中才會(huì)碰到相同的序列號(hào),對(duì)我們來(lái)說(shuō)這已經(jīng)足夠了 。而且磁盤(pán)序列號(hào)也不會(huì)隨著磁盤(pán)上的軟件內(nèi)容的拷貝而拷貝,所以我們?cè)诖税汛疟P(pán)序列號(hào)作為唯一識(shí)別碼應(yīng)用于我們的軟件中,可以用API函數(shù)GetVolumeInformation來(lái)很方便的獲取磁盤(pán)的序列號(hào),其原型聲明如下:

BOOL GetVolumeInformation( LPCTSTR lPRootPathName,
LPTSTR lpVolumeNameBuffer,
DWord nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize );

  在這里只需通過(guò)lpRootPathName來(lái)設(shè)置我們需要檢測(cè)的磁盤(pán)驅(qū)動(dòng)器號(hào),執(zhí)行后結(jié)果保存在lpVolumeSerialNumber中,其他參數(shù)我們不關(guān)心,均設(shè)為空(NULL)。

VC++中利用磁盤(pán)序列號(hào)識(shí)別正版軟件(圖一)
  我們必須在程序開(kāi)始執(zhí)行時(shí)馬上進(jìn)行檢測(cè)工作,驗(yàn)證為正版的才可以繼續(xù)執(zhí)行,否則就終止程序的運(yùn)行使盜版無(wú)法使用,從而達(dá)到保護(hù)正版軟件的目的。我們答應(yīng)將同一份正版軟件安裝到有限的多臺(tái)計(jì)算機(jī)中,將識(shí)別用的唯一標(biāo)識(shí)符用軟盤(pán)的磁盤(pán)序列號(hào)來(lái)表示,這張軟盤(pán)就作為該套軟件的鑰匙盤(pán),首先檢測(cè)在硬盤(pán)中是否有認(rèn)證文件,假如沒(méi)有就把鑰匙盤(pán)插入到軟驅(qū),在驗(yàn)證序列號(hào)正確的前提下把C盤(pán)的序列號(hào)保存到認(rèn)證文件中,下次運(yùn)行程序就會(huì)檢測(cè)到認(rèn)證文件,通過(guò)對(duì)認(rèn)證文件內(nèi)容和C盤(pán)序列號(hào)的動(dòng)態(tài)比較來(lái)識(shí)別是否是正版,假如不能匹配,需要再插入鑰匙盤(pán)再做一個(gè)認(rèn)證文件。所以整個(gè)驗(yàn)證系統(tǒng)只需該套軟件在某臺(tái)計(jì)算機(jī)上首次運(yùn)行程序時(shí)需要使用一次鑰匙盤(pán),或是在認(rèn)證文件發(fā)生損壞后需要使用鑰匙盤(pán)對(duì)其進(jìn)行恢復(fù),其余時(shí)間均由認(rèn)證文件對(duì)正版進(jìn)行保證。下面的流程圖展示了程序?qū)φ娴奈ㄒ粯?biāo)識(shí)符進(jìn)行驗(yàn)證的全部過(guò)程: 更多文章 更多內(nèi)容請(qǐng)看常用軟件加密寶典  軟件插件  殺毒軟件專(zhuān)欄專(zhuān)題,或

  三、 程序的具體實(shí)現(xiàn)

  在程序正式編寫(xiě)之前,需要預(yù)先獲取到作為鑰匙盤(pán)的軟盤(pán)的磁盤(pán)序列號(hào),使之作為我們判定軟件是否為正版的依據(jù)。可用前面提到的API函數(shù)GetVolumeInformation()來(lái)實(shí)現(xiàn):

DWORD dwSerialNum;
GetVolumeInformation("A://",NULL,NULL,&dwSerialNum,NULL,NULL,NULL,NULL);

  雙字型變量dwSerialNum內(nèi)保存有鑰匙盤(pán)的序列號(hào)。并把該值在正式程序中用#define宏定義為一個(gè)常量,作為正版的標(biāo)識(shí)。由于需要在程序正式運(yùn)行前對(duì)程序的正版與否進(jìn)行識(shí)別所以需要在程序的入口函數(shù),應(yīng)用程序類(lèi)的InitInstance()函數(shù)中對(duì)其進(jìn)行編程,并且應(yīng)該在識(shí)別完畢之前用m_pMainWnd->ShowWindow(SW_HIDE);函數(shù)隱藏程序主界面,直至判定為正版之后方可改變其參數(shù)為"SW_SHOW"將主界面正常顯示。下面是對(duì)認(rèn)證文件進(jìn)行判別的主要代碼:

……
if(file.Open("Logo.ini",CFile::modeReadWrite)==FALSE)
{
  AfxMessageBox("請(qǐng)將正版鑰匙盤(pán)插入到軟驅(qū)!");
  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("請(qǐng)將正版鑰匙盤(pán)插入到軟驅(qū)!");
   MakeKey();
  }
  else
   m_bCanRun=true;
}
……
if(m_bCanRun==true)
{
  m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
  m_pMainWnd->UpdateWindow();
}
else
PostQuitMessage(0);

  跟據(jù)設(shè)計(jì)的流程圖,當(dāng)沒(méi)有發(fā)現(xiàn)認(rèn)證文件(首次運(yùn)行程序)時(shí)或是認(rèn)證文件內(nèi)容與C盤(pán)的序列號(hào)不匹配(認(rèn)證文件出錯(cuò))時(shí)就要利用鑰匙盤(pán)創(chuàng)建/恢復(fù)認(rèn)證文件,下面是實(shí)現(xiàn)該功能的MakeKey函數(shù)的部分要害代碼: ……

GetVolumeInformation("A://",NULL,NULL,&dwSerialNum,NULL,NULL,NULL,NULL);
if(dwSerialNum==SerialNum)//SerialNum就是我們預(yù)先獲取的作為正版標(biāo)識(shí)的序列號(hào)
{
  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("已通過(guò)認(rèn)證,下次使用時(shí)不必再插入鑰匙軟盤(pán)!");
  m_bCanRun=true;
}
else
{
  AfxMessageBox("請(qǐng)插入正版鑰匙軟盤(pán)再執(zhí)行本程序!");
  m_bCanRun=false;
}

  四、 小結(jié)

  本文介紹的只是此類(lèi)軟件中的一種實(shí)現(xiàn)方法,在理解本文編程思想的基礎(chǔ)下也可以采用其他類(lèi)似的方法對(duì)軟件進(jìn)行保護(hù),比如也可以用網(wǎng)卡的標(biāo)識(shí)號(hào)作為認(rèn)證的標(biāo)識(shí)等等。而且也可以用類(lèi)似的方式發(fā)布共享軟件,以用戶(hù)反饋回的硬件參數(shù)作為輸入來(lái)產(chǎn)生注冊(cè)碼等等。總之,具體如何應(yīng)用仍要根據(jù)實(shí)際的需求而靈活的作出決定。本程序在windows 2000 Professional下,由Microsoft Visual C++ 6.0編譯調(diào)試通過(guò)。 更多文章 更多內(nèi)容請(qǐng)看常用軟件加密寶典  軟件插件  殺毒軟件專(zhuān)欄專(zhuān)題,或

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 项城市| 黎平县| 灵山县| 陇川县| 隆德县| 长治市| 天全县| 清涧县| 丹阳市| 老河口市| 宜城市| 宁阳县| 龙川县| 莱芜市| 衡水市| 防城港市| 青岛市| 迭部县| 兴国县| 金川县| 年辖:市辖区| 偃师市| 土默特左旗| 湖州市| 康乐县| 定南县| 剑川县| 泽库县| 汤阴县| 龙门县| 墨脱县| 泾源县| 威信县| 都江堰市| 武安市| 泸水县| 财经| 会同县| 冀州市| 图们市| 大余县|