本發(fā)明涉及軟件程序開(kāi)發(fā)領(lǐng)域,具體涉及一種軟件程序的校驗(yàn)保護(hù)方法及系統(tǒng)。
背景技術(shù):
目前,軟件程序通常采用模塊化開(kāi)發(fā),將軟件的功能進(jìn)行模塊化拆分為多份模塊文件,不同文件負(fù)責(zé)不同的功能,每份文件均可單獨(dú)使用。當(dāng)軟件程序發(fā)布至客戶(hù)端后,程序主框架則會(huì)加載一個(gè)個(gè)獨(dú)立的文件來(lái)實(shí)現(xiàn)整個(gè)程序的功能。
對(duì)于軟件程序而言,以windows客戶(hù)端程序?yàn)槔?,該程序包括多個(gè)dll(dynamiclinklibrary,文件為動(dòng)態(tài)鏈接庫(kù)文件)文件。windows客戶(hù)端程序發(fā)布至客戶(hù)端后,第三方(例如hack)能夠非常容易的從客戶(hù)端安裝目錄中,獲取dll文件,由于每份dll文件均可獨(dú)立使用,因此第三方獲取任意dll文件后,即可在未授權(quán)的情況下直接使用。例如第三方獲取到具有圖片美顏功能的dll文件后,即可直接使用該文件的圖片美顏功能。
因此,上述模塊文件在使用時(shí),軟件程序的安全無(wú)法保障,進(jìn)而對(duì)軟件開(kāi)發(fā)商的利益造成了損失,例如無(wú)償使用了軟件開(kāi)發(fā)商擁有的關(guān)于模塊文件的知識(shí)產(chǎn)權(quán)等。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明解決的技術(shù)問(wèn)題為:如何避免第三方在未授權(quán)的情況下,使用自行獲取的模塊文件。本發(fā)明能夠?qū)浖绦蛑械哪K文件進(jìn)行多重校驗(yàn)和保護(hù),保證了軟件開(kāi)發(fā)商的利益,非常適于推廣。
為達(dá)到以上目的,本發(fā)明提供的軟件程序的校驗(yàn)保護(hù)方法,包括以下步驟:
s1:當(dāng)客戶(hù)端上的軟件程序進(jìn)行初始化時(shí),獲取初始化過(guò)程中加載的所有模塊文件名稱(chēng),所有模塊文件包括1份主模塊文件和若干子模塊文件,轉(zhuǎn)到s2;
s2:獲取主模塊文件的內(nèi)存起始地址、以及主模塊文件中代碼段的相對(duì)地址;根據(jù)起始地址和相對(duì)地址得到代碼段的內(nèi)存地址,根據(jù)內(nèi)存地址確定代碼段;對(duì)代碼段進(jìn)行哈希計(jì)算,得到代碼段校驗(yàn)值,轉(zhuǎn)到s3;
s3:將所述所有模塊文件名稱(chēng)和代碼段校驗(yàn)值,作為校驗(yàn)數(shù)據(jù),將校驗(yàn)數(shù)據(jù)發(fā)送至服務(wù)端,轉(zhuǎn)到s4;
s4:對(duì)校驗(yàn)數(shù)據(jù)進(jìn)行校驗(yàn),若校驗(yàn)通過(guò),向客戶(hù)端發(fā)送軟件程序合法的校驗(yàn)結(jié)果,若校驗(yàn)未通過(guò),向客戶(hù)端發(fā)送軟件程序非法的校驗(yàn)結(jié)果,轉(zhuǎn)到s5;
s5:當(dāng)客戶(hù)端收到軟件程序合法的校驗(yàn)結(jié)果時(shí),初始化軟件程序;當(dāng)客戶(hù)端收到軟件程序非法的校驗(yàn)結(jié)果時(shí),終止初始化軟件程序。
本發(fā)明提供的軟件程序的校驗(yàn)保護(hù)系統(tǒng),包括模塊文件名稱(chēng)獲取單元、代碼段計(jì)算單元、校驗(yàn)數(shù)據(jù)發(fā)送單元、校驗(yàn)單元和校驗(yàn)結(jié)果執(zhí)行單元;
模塊文件名稱(chēng)獲取單元用于:當(dāng)客戶(hù)端上的軟件程序進(jìn)行初始化時(shí),獲取初始化過(guò)程中加載的所有模塊文件名稱(chēng),所有模塊文件包括1份主模塊文件和若干子模塊文件,向代碼段計(jì)算單元發(fā)送代碼段計(jì)算信號(hào);
代碼段計(jì)算單元用于:收到代碼段計(jì)算信號(hào)后,獲取主模塊文件的內(nèi)存起始地址、以及主模塊文件中代碼段的相對(duì)地址;根據(jù)起始地址和相對(duì)地址得到代碼段的內(nèi)存地址,根據(jù)內(nèi)存地址確定代碼段;對(duì)代碼段進(jìn)行哈希計(jì)算,得到代碼段校驗(yàn)值,向校驗(yàn)數(shù)據(jù)發(fā)送單元發(fā)送校驗(yàn)數(shù)據(jù)發(fā)送信號(hào);
校驗(yàn)數(shù)據(jù)發(fā)送單元用于:收到校驗(yàn)數(shù)據(jù)發(fā)送信號(hào)后,將所述所有模塊文件名稱(chēng)和代碼段校驗(yàn)值,作為校驗(yàn)數(shù)據(jù),將校驗(yàn)數(shù)據(jù)發(fā)送至服務(wù)端的校驗(yàn)單元;
校驗(yàn)單元用于:收到校驗(yàn)數(shù)據(jù)后,對(duì)校驗(yàn)數(shù)據(jù)進(jìn)行校驗(yàn),若校驗(yàn)通過(guò),向客戶(hù)端的校驗(yàn)結(jié)果執(zhí)行單元發(fā)送軟件程序合法的校驗(yàn)結(jié)果,若校驗(yàn)未通過(guò),向客戶(hù)端的校驗(yàn)結(jié)果執(zhí)行單元發(fā)送軟件程序非法的校驗(yàn)結(jié)果;
校驗(yàn)結(jié)果執(zhí)行單元用于:當(dāng)收到的校驗(yàn)結(jié)果為軟件程序合法時(shí),允許初始化軟件程序;當(dāng)收到的校驗(yàn)結(jié)果為軟件程序非法時(shí),終止初始化軟件程序。
與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)在于:
(1)參見(jiàn)本發(fā)明的s1至s5可知,本發(fā)明在軟件程序初始化時(shí),會(huì)要求客戶(hù)端上傳校驗(yàn)數(shù)據(jù)(主模塊文件名稱(chēng)、子模塊文件名稱(chēng)、以及主模塊文件中的代碼段),只有當(dāng)所有校驗(yàn)數(shù)據(jù)均被服務(wù)端校驗(yàn)通過(guò)后,才給予軟件程序正常運(yùn)行的權(quán)限;若任意校驗(yàn)數(shù)據(jù)校驗(yàn)未通過(guò),則終止軟件程序的運(yùn)行。
因此,本發(fā)明能夠?qū)浖绦蛑械哪K文件進(jìn)行多重校驗(yàn)和保護(hù),即使第三方獲取了模塊文件,但未通過(guò)本發(fā)明的校驗(yàn)過(guò)程,也無(wú)法使用獲取的模塊文件,進(jìn)而保證了軟件開(kāi)發(fā)商的利益,非常適于推廣。
(2)參見(jiàn)本發(fā)明的s2和s4可知,本發(fā)明校驗(yàn)軟件程序時(shí),會(huì)校驗(yàn)客戶(hù)端計(jì)算的主模塊文件的代碼段校驗(yàn)值,進(jìn)而避免了第三方通過(guò)修改主模塊文件代碼段來(lái)改變校驗(yàn)結(jié)果的問(wèn)題,顯著提高了軟件程序的校驗(yàn)質(zhì)量。
在此基礎(chǔ)上,本發(fā)明對(duì)代碼段進(jìn)行哈希計(jì)算時(shí),會(huì)去除代碼段中的重定位數(shù)據(jù),進(jìn)而保證了計(jì)算數(shù)據(jù)的統(tǒng)一,避免了主模塊文件因加載位置不同而出現(xiàn)的計(jì)算數(shù)據(jù)不一致的情形。因此,本發(fā)明能夠排除因計(jì)算數(shù)據(jù)不同而導(dǎo)致的錯(cuò)誤校驗(yàn)結(jié)果,顯著提高了校驗(yàn)結(jié)果的準(zhǔn)確度。
(3)本發(fā)明發(fā)送和接收校驗(yàn)數(shù)據(jù)時(shí),會(huì)分別對(duì)校驗(yàn)數(shù)據(jù)進(jìn)行加解密,加解密方式自定義設(shè)置,進(jìn)而提高了校驗(yàn)數(shù)據(jù)傳輸?shù)陌踩阅?,進(jìn)一步提高了軟件程序的校驗(yàn)質(zhì)量。
附圖說(shuō)明
圖1為本發(fā)明實(shí)施例中的軟件程序的校驗(yàn)保護(hù)方法的流程圖。
具體實(shí)施方式
以下結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)說(shuō)明。
參見(jiàn)圖1所示,本發(fā)明實(shí)施例中的軟件程序的校驗(yàn)保護(hù)方法,包括以下步驟:
s1:檢測(cè)當(dāng)前運(yùn)行環(huán)境:當(dāng)客戶(hù)端上的軟件程序進(jìn)行初始化時(shí),獲取初始化過(guò)程中加載的所有模塊文件名稱(chēng),所有模塊文件包括1份主模塊文件和若干子模塊文件。
s1中獲取初始化過(guò)程中加載的所有模塊文件的具體流程為:確定主模塊文件名稱(chēng)后,獲取主模塊文件加載的所有文件名稱(chēng),所述所有文件均為子模塊文件。
s1的原理為:每個(gè)軟件程序的模塊文件,都包括1份主模塊文件和若干子模塊文件,當(dāng)軟件程序初始化時(shí)會(huì)先執(zhí)行主模塊文件(主模塊文件名稱(chēng)對(duì)應(yīng)該程序運(yùn)行時(shí)的進(jìn)程名稱(chēng)),再通過(guò)主模塊文件來(lái)加載其他子模塊文件。
s1的實(shí)現(xiàn)方式為:
s101:通過(guò)調(diào)用windwosapi函數(shù)getmodulefilename來(lái)獲取主模塊文件名稱(chēng),windwosapi函數(shù)原型為:
dwordwinapigetmodulefilename(
hmodulehmodule,
lptstrlpfilename,
dwordnsize);
其中參數(shù)hmodule填入null標(biāo)示獲取主模塊文件名稱(chēng),參數(shù)lpfilename則會(huì)返回獲取的主模塊文件名稱(chēng),參數(shù)nsize則會(huì)返回獲取的主模塊文件名稱(chēng)的長(zhǎng)度。
s102:根據(jù)主模塊文件的名稱(chēng),通過(guò)調(diào)用windowsapi函數(shù)createtoolhelp32snapshot,獲取主模塊文件加載的文件列表的快照:createtoolhelp32snapshot(th32cs_snapmodule,processid);其中參數(shù)th32cs_snapmodule標(biāo)示獲取文件的快照,參數(shù)processid則是當(dāng)前進(jìn)程的id。
s103:調(diào)用windowsapi函數(shù)module32first,在文件列表中獲取第一個(gè)文件名稱(chēng):bmodule=module32first(hmodule,&me32);其中mem32結(jié)構(gòu)中szexepath則是獲取的文件名稱(chēng)。
s104:通過(guò)一個(gè)while循環(huán)來(lái)不斷的調(diào)用函數(shù)module32next來(lái)獲取下一個(gè)模塊的名稱(chēng):
while(bmodule)
{bmodule=module32next(hmodule,&me32);}。
s2:獲取主模塊文件的內(nèi)存起始地址、以及主模塊文件中代碼段的相對(duì)地址(即代碼段的內(nèi)存地址相對(duì)于內(nèi)存起始地址的偏移量);根據(jù)起始地址和相對(duì)地址得到代碼段的內(nèi)存地址,根據(jù)內(nèi)存地址確定代碼段;去除代碼段中的重定位數(shù)據(jù)后,使用md5算法對(duì)代碼段進(jìn)行哈希計(jì)算,得到代碼段校驗(yàn)值。
s2的原理為:主模塊文件獲取當(dāng)前運(yùn)行環(huán)境的功能代碼在代碼段中,若第三方修改主模塊文件(核心模塊文件)的代碼段,則可能自行修改校驗(yàn)的結(jié)果,進(jìn)而極大的降低軟件程序的校驗(yàn)質(zhì)量。后續(xù)對(duì)s2中計(jì)算的代碼段校驗(yàn)值進(jìn)行校驗(yàn),則可防止第三方修改代碼段,若代碼段被修改,則代碼段校驗(yàn)值會(huì)不同,進(jìn)而無(wú)法通過(guò)校驗(yàn)。
s2中獲取主模塊文件的內(nèi)存起始地址的實(shí)現(xiàn)方式為:通過(guò)調(diào)用windowsapi函數(shù)getmodulehandle,獲取主模塊文件的內(nèi)存起始地址,函數(shù)原型為:hmodulegetmodulehandle(lpctstrlpmodulename),其中參數(shù)pmodulename為主模塊文件,返回值hmodule為主模塊文件的內(nèi)存起始地址。
s2中代碼段的相對(duì)地址和重定位數(shù)據(jù),均在主模塊文件的頭部信息中獲??;主模塊文件的頭部信息還包括:主模塊文件的大小和名稱(chēng)、主模塊文件包含的所有段、以及每個(gè)段的起始地址和大小。
s2去除代碼段中的重定位數(shù)據(jù)后再進(jìn)行哈希計(jì)算的原理為:主模塊文件每次加載時(shí),可能會(huì)加載至不同的內(nèi)存地址,進(jìn)而導(dǎo)致主模塊文件對(duì)于直接尋址的指令每次都會(huì)發(fā)生變化;若根據(jù)變化后的重定位數(shù)據(jù)進(jìn)行哈希計(jì)算,會(huì)導(dǎo)致每次的計(jì)算結(jié)果均不相同,進(jìn)而導(dǎo)致計(jì)算結(jié)果校驗(yàn)不通過(guò)。將重定位數(shù)據(jù)去除則可保證代碼段原始計(jì)算數(shù)據(jù)的統(tǒng)一,進(jìn)而避免上述情況,排除因計(jì)算數(shù)據(jù)不同而導(dǎo)致的錯(cuò)誤校驗(yàn)結(jié)果,提高了校驗(yàn)結(jié)果的準(zhǔn)確度。
s3:將s1中的所有模塊文件名稱(chēng)、以及s2中的代碼段校驗(yàn)值作為校驗(yàn)數(shù)據(jù),將校驗(yàn)數(shù)據(jù)壓縮、并采用加密算法后,得到校驗(yàn)壓縮包,將校驗(yàn)壓縮包發(fā)送至服務(wù)端。
s4:服務(wù)端根據(jù)與s3對(duì)應(yīng)的解密算法對(duì)校驗(yàn)壓縮包進(jìn)行解密和解壓縮后,得到校驗(yàn)數(shù)據(jù);校驗(yàn)數(shù)據(jù)發(fā)送前加密收到后解密,進(jìn)一步提高校驗(yàn)數(shù)據(jù)的安全性能。對(duì)校驗(yàn)數(shù)據(jù)進(jìn)行校驗(yàn),若校驗(yàn)通過(guò),向客戶(hù)端發(fā)送軟件程序合法的校驗(yàn)結(jié)果,若校驗(yàn)未通過(guò),向客戶(hù)端發(fā)送軟件程序非法的校驗(yàn)結(jié)果。
s4中校驗(yàn)通過(guò)的校驗(yàn)數(shù)據(jù)需要同時(shí)滿(mǎn)足以下條件:
1、校驗(yàn)數(shù)據(jù)中的所有模塊文件名稱(chēng),均與服務(wù)端的軟件程序?qū)?yīng)的文件相同;
2、校驗(yàn)數(shù)據(jù)中的代碼段校驗(yàn)值,與服務(wù)端計(jì)算的代碼段校驗(yàn)值相同。
s5:當(dāng)客戶(hù)端收到軟件程序合法的校驗(yàn)結(jié)果時(shí),正常初始化軟件程序;當(dāng)客戶(hù)端收到軟件程序非法的校驗(yàn)結(jié)果時(shí),終止初始化軟件程序、并返回錯(cuò)誤。
本發(fā)明實(shí)施例中的軟件程序的校驗(yàn)保護(hù)系統(tǒng),包括模塊文件名稱(chēng)獲取單元、代碼段計(jì)算單元、校驗(yàn)數(shù)據(jù)發(fā)送單元、校驗(yàn)單元和校驗(yàn)結(jié)果執(zhí)行單元。
模塊文件名稱(chēng)獲取單元用于:當(dāng)客戶(hù)端上的軟件程序進(jìn)行初始化時(shí),獲取初始化過(guò)程中加載的所有模塊文件名稱(chēng),所有模塊文件包括1份主模塊文件和若干子模塊文件,向代碼段計(jì)算單元發(fā)送代碼段計(jì)算信號(hào)。
代碼段計(jì)算單元用于:收到代碼段計(jì)算信號(hào)后,獲取主模塊文件的內(nèi)存起始地址、以及主模塊文件中代碼段的相對(duì)地址;根據(jù)起始地址和相對(duì)地址得到代碼段的內(nèi)存地址,根據(jù)內(nèi)存地址確定代碼段;去除代碼段中的重定位數(shù)據(jù)后(重定位數(shù)據(jù)和相對(duì)地址均在主模塊文件的頭部信息中獲取),對(duì)代碼段進(jìn)行哈希計(jì)算,得到代碼段校驗(yàn)值,向校驗(yàn)數(shù)據(jù)發(fā)送單元發(fā)送校驗(yàn)數(shù)據(jù)發(fā)送信號(hào)。
校驗(yàn)數(shù)據(jù)發(fā)送單元用于:收到校驗(yàn)數(shù)據(jù)發(fā)送信號(hào)后,將所述所有模塊文件名稱(chēng)和代碼段校驗(yàn)值,作為校驗(yàn)數(shù)據(jù);采用加密算法對(duì)校驗(yàn)數(shù)據(jù)進(jìn)行加密后,將校驗(yàn)數(shù)據(jù)發(fā)送至服務(wù)端的校驗(yàn)單元。
校驗(yàn)單元用于:收到校驗(yàn)數(shù)據(jù)后,采用解密算法對(duì)校驗(yàn)數(shù)據(jù)進(jìn)行解密,解密算法與加密算法對(duì)應(yīng);對(duì)校驗(yàn)數(shù)據(jù)進(jìn)行校驗(yàn),若校驗(yàn)通過(guò),向客戶(hù)端的校驗(yàn)結(jié)果執(zhí)行單元發(fā)送軟件程序合法的校驗(yàn)結(jié)果,若校驗(yàn)未通過(guò),向客戶(hù)端的校驗(yàn)結(jié)果執(zhí)行單元發(fā)送軟件程序非法的校驗(yàn)結(jié)果。
校驗(yàn)單元校驗(yàn)通過(guò)的校驗(yàn)數(shù)據(jù)需要同時(shí)滿(mǎn)足以下條件:校驗(yàn)數(shù)據(jù)中的所有模塊文件名稱(chēng),均與服務(wù)端的軟件程序?qū)?yīng)的文件相同;校驗(yàn)數(shù)據(jù)中的代碼段校驗(yàn)值,與服務(wù)端計(jì)算的代碼段校驗(yàn)值相同。
校驗(yàn)結(jié)果執(zhí)行單元用于:當(dāng)收到的校驗(yàn)結(jié)果為軟件程序合法時(shí),允許初始化軟件程序;當(dāng)收到的校驗(yàn)結(jié)果為軟件程序非法時(shí),終止初始化軟件程序。
通過(guò)本發(fā)明實(shí)施例可知,本發(fā)明能夠?qū)浖绦蛑械哪K文件進(jìn)行多重校驗(yàn)和保護(hù),即使第三方獲取了模塊文件,但未通過(guò)本發(fā)明的校驗(yàn)過(guò)程,也無(wú)法使用獲取的模塊文件,進(jìn)而保證了軟件開(kāi)發(fā)商的利益,非常適于推廣。
進(jìn)一步,本發(fā)明不局限于上述實(shí)施方式,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也視為本發(fā)明的保護(hù)范圍之內(nèi)。本說(shuō)明書(shū)中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員公知的現(xiàn)有技術(shù)。