一本到国产在线精品国内,国产大屁股视频免费区无卡,精品国产日韩aV在线免费观看,国产欧美日韩综合精品一区二区

建立先進(jìn)理念和體系,創(chuàng)造更好技術(shù)和工藝,開創(chuàng)不凡業(yè)績(jī)和局面

當(dāng)前位置:首頁>技術(shù)中心>關(guān)于知識(shí)產(chǎn)權(quán)> 瀏覽正文

軟件保護(hù)技術(shù)--CD-check

來源:龍人計(jì)算機(jī)研究所 作者:站長(zhǎng) 時(shí)間:2006-11-04 17:39:55


最簡(jiǎn)單也最常見的光盤保護(hù)就是程序在啟動(dòng)時(shí)判斷光驅(qū)中的光盤上是否存在特定的文件,如果不存在則認(rèn)為用戶沒有正版光盤,拒絕運(yùn)行。在程序運(yùn)行的過程當(dāng)中一般不再檢查光盤的存在與否。Windows下的具體實(shí)現(xiàn)一般是這樣的:先用GetLogicalDriveStrings( )或GetLogicalDrives( )得到系統(tǒng)中安裝的所有驅(qū)動(dòng)器的列表,然后再用GetDriveType( )檢查每一個(gè)驅(qū)動(dòng)器,如果是光驅(qū)則用CreateFileA( )或FindFirstFileA( )等函數(shù)檢查特定的文件存在與否,并可能進(jìn)一步地檢查文件的屬性、大小、內(nèi)容等。 這種光盤檢查是比較容易被破解的,解密者只要利用上述函數(shù)設(shè)斷點(diǎn)找到程序啟動(dòng)時(shí)檢查光驅(qū)的地方,修改判斷指令就可以跳過光盤檢查。 (1)可將游戲(或其它程序)的光盤拿出,運(yùn)行游戲,將出現(xiàn)一些錯(cuò)誤提示,如: Please insert the - CD, or: You need the CD to play the - . 利用這提示可在W32DASM中利用串式數(shù)據(jù)參考功能查找相應(yīng)的代碼進(jìn)行分析。

(2)相關(guān)函數(shù)

1、GetDrivetype(a) 判斷一個(gè)磁盤驅(qū)動(dòng)器的類型

UINT GetDriveType(
LPCTSTR lpRootPathName // String,包含了驅(qū)動(dòng)器根目錄路徑的一個(gè)字串
);

返回值
0 驅(qū)動(dòng)器不能識(shí)別
1 指定的目錄不存在
2 DriveRemoveable
3 A Fixed Disk (HardDrive)
4 Remote Drive(Network)
5 Cd-Rom驅(qū)動(dòng)器
6 RamDisk

如果是普通的程序,你可將EAX由5改成3即可。

注意:有些程序可能檢測(cè)光盤根目錄相關(guān)文件,CD的卷標(biāo)也可能被檢測(cè)。

2、GetLogicalDrives 判斷系統(tǒng)中存在哪些邏輯驅(qū)動(dòng)器字母

這函數(shù)沒有參數(shù)

返回值
這個(gè)結(jié)構(gòu)中的二進(jìn)制位標(biāo)志著存在哪些驅(qū)動(dòng)器。其中,位0設(shè)為1表示驅(qū)動(dòng)器A:存在于系統(tǒng)中;位1設(shè)為1表示存在B:驅(qū)動(dòng)器;以次類推

3、GetLogicalDriveStrings 獲取一個(gè)字串,其中包含了當(dāng)前所有邏輯驅(qū)動(dòng)器的根驅(qū)動(dòng)器路徑

DWORD GetLogicalDriveStrings(

DWORD nBufferLength, // 字串的長(zhǎng)度
LPTSTR lpBuffer   // 用于裝載邏輯驅(qū)動(dòng)器名稱的字串。每個(gè)名字都用一個(gè)NULL字符分隔,在最后一個(gè)名             字后面用兩個(gè)NULL表示中止(空中止)
);

返回值
裝載到lpBuffer的字符數(shù)量(排除空中止字符)。如緩沖區(qū)的長(zhǎng)度不夠,不能容下路徑,則返回值就變成要求的緩沖區(qū)大小。零表示失敗。會(huì)設(shè)置GetLastError

4、GetFileAttributesA 判斷指定文件的屬性

DWORD GetFileAttributes(

LPCTSTR lpFileName //指定欲獲取屬性的一個(gè)文件的名字
);


5、GetFileSize 判斷文件長(zhǎng)度

DWORD GetFileSize(

HANDLE hFile, // 文件的句柄
LPDWORD lpFileSizeHigh, // 指定一個(gè)長(zhǎng)整數(shù),用于裝載一個(gè)64位文件長(zhǎng)度的頭32位。如這個(gè)長(zhǎng)度沒有超過               2^32字節(jié),則該參數(shù)可以設(shè)為NULL(變成ByVal)
);

返回值
返回文件長(zhǎng)度。&HFFFFFFFF表示出錯(cuò)。注意如lpFileSizeHigh不為NULL,且結(jié)果為&HFFFFFFFF,那么必須調(diào)用GetLastError,判斷是否實(shí)際發(fā)生了一個(gè)錯(cuò)誤,因?yàn)檫@是一個(gè)有效的結(jié)果

6、GetLastError 針對(duì)之前調(diào)用的api函數(shù),用這個(gè)函數(shù)取得擴(kuò)展錯(cuò)誤信息

返回值
由api函數(shù)決定。請(qǐng)參考api32.txt文件,其中列出了一系列錯(cuò)誤常數(shù);都以ERROR_前綴起頭。常用的錯(cuò)誤代碼見下表
ERROR_INVALID_HANDLE 無效的句柄作為一個(gè)參數(shù)傳遞
ERROR_CALL_NOT_IMPLEMENTED 在win 95下調(diào)用專為win nt設(shè)計(jì)的win32 api函數(shù)
ERROR_INVALID_PARAMETER 函數(shù)中有個(gè)參數(shù)不正確

7、ReadFile 從文件中讀出數(shù)據(jù)

具體參考KEYFILE一節(jié)。

8、其它一些CDROM信息

中斷2F是mscdex中斷,可用bpint 2f, al=0 ah=15檢測(cè)Mmscdex是否安裝。
也可試著用文件存取設(shè)斷