
文章插圖
現(xiàn)有軟件加密基本都是采用各種硬件系列號(hào)作為加密依據(jù),實(shí)現(xiàn)的是一機(jī)一碼制,在采用硬件系列號(hào)作為加密依據(jù)之前,先要了解下各種硬件系列號(hào)的情況 。這樣有利于選擇軟件加密依據(jù),防止注冊(cè)碼可以在多臺(tái)計(jì)算機(jī)上使用 。
獲取硬盤(pán)系列號(hào)
硬盤(pán)系列號(hào)是生產(chǎn)廠家在硬盤(pán)出廠之前就寫(xiě)入到硬盤(pán)中不可以修改的系列號(hào),也就是所謂的出廠系列號(hào)或是物理系列號(hào),該系列號(hào)一旦寫(xiě)入就不可以進(jìn)行修改,并且是唯一的,但有些硬盤(pán)廠家生產(chǎn)的硬盤(pán)沒(méi)有這個(gè)系列號(hào),也就是說(shuō)系列號(hào)為空 。硬盤(pán)出廠系列號(hào)與硬盤(pán)分區(qū)卷的系列號(hào)的區(qū)別在于:卷的系列號(hào)可以修改,并且只要一重新格式化,該系列號(hào)就會(huì)改變;而硬盤(pán)出廠系列號(hào)是不可修改的,格式化以后系列號(hào)不會(huì)被改變 。
如果采用分區(qū)卷的系列號(hào)作為加密依據(jù),其一,只要購(gòu)買(mǎi)一個(gè)注冊(cè)碼,其他的計(jì)算機(jī)只要修改卷的系列號(hào)就可以成為軟件的正式用戶;其二,如果用戶重新格式化過(guò)分區(qū),那么就要重新給用戶發(fā)送新的系列號(hào),因?yàn)闆](méi)有確切的證據(jù),也不知道用戶是否真的格式化過(guò)分區(qū)還是使用另外的計(jì)算機(jī)的分區(qū)系列號(hào)來(lái)獲取注冊(cè)碼 。所以為了避免出現(xiàn)一碼多機(jī)可用和引起不必要的麻煩,建議在實(shí)際加密過(guò)程中不要使用硬盤(pán)卷的分區(qū)系列號(hào)作為加密依據(jù),而應(yīng)該采用硬盤(pán)出廠系列號(hào)作為軟件的加密依據(jù) 。
雖然不使用卷的系列號(hào)作為加密依據(jù),但這里也來(lái)看看怎么獲取磁盤(pán)分區(qū)卷的系列號(hào)?其實(shí)很簡(jiǎn)單,只要調(diào)用 API函數(shù) GetVolumeInformation 就可以得到磁盤(pán)分區(qū)卷的系列號(hào) 。API 函數(shù) GetVolumelnformation 在 MSDN 中的函數(shù)原型如下:
BOOL GetVolumelnformation( LPCTSTR lpRootPathName, //指向文件系統(tǒng)根的路徑字符串 LPTSTR IpVolumeNameBuffer, //接收返回的卷名的緩沖區(qū) DWORD nVolumeNameSize, //上述緩沖區(qū)的長(zhǎng)度 LPDWORD pVolumeSerialNumber, //接收卷序列號(hào)的整數(shù)變量的地址 LPDWORD pMaimumComponenilength, //接收卷上最大文件路徑長(zhǎng)度的整數(shù)變量的地址 LPDWORD IpFileSystemFlagx, 1/接收卷文件系統(tǒng)標(biāo)志的整數(shù)變量的地址LPTSTR ipFilSystemNameBufer, //接收返回的卷的文件系統(tǒng)名的緩沖區(qū)0 DWORD nFileSystemNameSsize //上述緩沖區(qū)的長(zhǎng)度 ) 示例代碼如下://獲取指定磁盤(pán)分區(qū)的卷系列號(hào) function GetDiskvo1 (Driver:String): DWORD;var volumeSerialNumber : DWORD;MaximumComponentLength : DWORD;FileSystemFlags :DWORD; beqin if Driver length(Driver)] =':' thenDriver :=Driver + ‘\’GetVolumeInformation(PChar (Driver), nil,0,@VolumeSerialNumber, MaximumComponentlength, FileSystemFlags,nil,0); Resul t:= (VolumeSeria1Number); end; procedure TForm1.Button1click(sender; Tobject);begin Label1.caption:-IntToHex(GetDiskVo1('c:V9),8);end;獲取硬盤(pán)的出廠系列號(hào)還要考慮到硬盤(pán)的接口類(lèi)型,在這里只介紹 IDE 接口的和 SCSI 接口的 。首先看看要獲取硬盤(pán)系列號(hào)所需要的幾個(gè) API 函數(shù):
BOOL DeviceloControl(HANDLE hDevice,//設(shè)備句柄DWORD dwloControlCode, //控制代碼LPVOID IpInBufer, //指向包含操作所需的數(shù)據(jù)的緩沖區(qū)指針DWORD nInBufferSize, //lpInBuffer 參數(shù)指向的緩沖區(qū)的大小LPVOID IpOutBufer, //指向用來(lái)接收輸出數(shù)據(jù)的緩沖區(qū)DWORD nOuBuferSize, //指向用來(lái)接收輸出數(shù)據(jù)的緩沖區(qū) LPDWORD ipBytesRethurned //指向變量用于返回緩沖區(qū)數(shù)據(jù)的數(shù)量 LPOVERLAPPED IpOverlaped //指向 OVERLAPPED 結(jié)構(gòu));HANDLE CreateFile( LPCTSTR IpFileName, //指向文件名 DWORD dwDesiredAccess, //訪問(wèn)模式(讀或?qū)? DWORD dwShareMode, //共享模式 LPSECURITY_ATTRIBUTES ipSecurityAttributes,//指向安全屬性 DWORD dwCreationDisposition, //如何創(chuàng)建文件 DWORD dwFlagsAndAtributes, //文件屬性 HANDLE hTemplateFile //文件模板句柄獲取硬盤(pán)出廠系列號(hào)的完整示例代碼如下: unit DiskserialUnit; interface uses Windows; SysUtils; function GetHddserial: string; implementation function GetIdeDiskserialNumber: String;type TSrbIoControl = packed recordHeaderLength :ULONG; SignatureArray[0..7] of Char; TimeoutULONG;Controlcode:ULONG;ReturnCodeULONG; Length :ULONG; end; SRB_IO_CONTROL = TSrbIoControl;PSrbIoControl =^TSrbIoControl; TIDERegs = packed record bFeaturesReg :Byte; bsectorCountReg :Byte; bsectorNumberReg : Byte;bcylLowReg :Byte; bcylHighReg :Byte; bDriveHeadReg :Byte;bcommandReg: Byte; bReserved:Byte; end;IDEREGS=TIDERegs;PIDEREGS=^TIDERegs; TsendcndInParams = packed record CBuffersize : DWORD; irDriveRegs:TIDERegs;bdriveNumber : Byte;bReserved:Arraylo..2] of byte;dwReserved:Array10..31 of DWORD;bBuffer : Array[0..0] of Byte end; SENDCMDINPARAMS= TSendCmdInParams; PSendCmdInParams=TSendCmdInParams; TIdSector = packed record wGenConfig :Word; wNumCyls : Word; wReserved :Word; wNumHeads :Word; wBytesPerTrack: Word; wBytesPerSector :Word; wSectorsPerTrack : Word; wVendorUnique :Array10..2] of word; sSerialNumber : Arraylo..19] of Char; WBufferType:Word;wBuffersize :Word; wEccsize:Word;sFirmwareRev :Array[0..7] of char;sMode1Number : Array[0..39] of Char;WMoreVendorUnique :Word;wDoublewordIo:Word; wcapabilities :Word; wReserved1 : Word;wPIOTiming:word;WDMATiming:word; wBS: Word1; WNumcurrentcyla:Word; wNumcurrentHeads:Word;wNumcurrentSectorsPerTrack:Word; ulCurrentSectorCapacity: ULONG;ulTotalAddressableSectors:ULONG:wSingleWordDMA:Word;sMultiWordDMA:Word;bReserved:Array[0..127] of byte;end;PIdsector = ^TIdSector;const IDEID_FUNCTION -=SECI IDENTIFY BUFFER SIZE =512; DFP RECEIVE DRIVE DATA=$0007c088: IOCTL SCSI MINIPORT =$0004d008; IOCTL SCSI MINIPORT_IDENTIFY =$001b0501; Datasito =sizeof(TSendomdInParams)-1+IDENTIFY BUFFER_SIZE; ButfferSize=Sizeof(SRB_IO_CONTROL)+DataSize;W9xbuffersize=IOENTIFYBUFER_SIZE+16; var hDevice : THandler cbbytenReturned : DWORD; pInData: PSendCmdInParams; poutData : Pointer; // PSendCndInParama;Bufter : Array[0..Buffersize-1] of Byte;srbcontrol : Tsrblocontrol absolute buffers; procedure Changonyteorder( var patat size t Integer ) varptr : PChar; i :Integer; c : Char; begin//判斷操作系統(tǒng)//獲取SCSI接口句柄 end;function ScsiHddSerialNumber:String;{$ALIGN ON}Typeend;beginend;function GetHddSerial:stringvarNumTry:Byte;FinalStr:String;beginNumTry := 1;RepeatCase NumTry of1:FinalStr:= ScsiHddSerialNumber;2:FinalStr:= GetIdeDiskSerialNumber;3:FinalStr:=’Error’;End;Inc(NumTry);Until(FinalStr <> ‘’) or (NumTry > 4);Result := FinalStr;end;end. 在實(shí)際加密過(guò)程中,不建議使用CPU序列號(hào)和網(wǎng)卡的MAC地址作為加密依據(jù),因?yàn)橄嗤吞?hào)的CPU的序列號(hào)相同,并且,MAC地址可以更改,以硬盤(pán)出廠序列號(hào)作為加密依據(jù)是比較好的選擇 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!
「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 2022年農(nóng)歷六月初十提車(chē)日子好嗎 提車(chē)的吉時(shí)查詢
- 青驕第二課堂:10萬(wàn)股東躺槍 又有上市公司被調(diào)查股票會(huì)跌停嗎?
- 固態(tài)硬盤(pán)品牌推薦及選購(gòu)攻略 哪個(gè)牌子的固態(tài)硬盤(pán)好用
- 無(wú)法讀取電腦硬盤(pán)原因和解決法 電腦硬盤(pán)檢測(cè)不到是怎么回事
- 健身教練培訓(xùn)機(jī)構(gòu)調(diào)查綜述
- 健身期間易犯的錯(cuò)誤
- 微信查看新冠肺炎疫情的方法 支付寶查看新冠肺炎疫情的方法
- 驗(yàn)光流程,配鏡驗(yàn)光都需要查什么?
- 2022年農(nóng)歷六月二十提車(chē)日子好嗎 提車(chē)的吉時(shí)查詢
- 查看虛擬機(jī)mac地址的方法 虛擬機(jī)mac地址怎么查
