一種增強(qiáng)軟件保護(hù)易用性的方法【專利摘要】本發(fā)明公開了一種提高虛擬機(jī)軟件保護(hù)方式的易用性的方法,包括:A.利用與虛擬機(jī)匹配的編譯器將源代碼編譯為虛擬指令文件;B.構(gòu)造目標(biāo)文件;C.添加對(duì)虛擬機(jī)和虛擬指令的引用。本方法對(duì)源代碼進(jìn)行轉(zhuǎn)換,生成軟件開發(fā)工具在鏈接時(shí)可直接利用的文件,虛擬機(jī)用戶可以按照函數(shù)或類的定義直接調(diào)用被保護(hù)代碼,即用戶調(diào)用一個(gè)被保護(hù)的函數(shù)或類時(shí)和調(diào)用未被保護(hù)的函數(shù)或類方法相同,無需額外編寫代碼,能增強(qiáng)虛擬機(jī)保護(hù)方法的易用性,減少調(diào)用被保護(hù)代碼的繁瑣工作?!緦@f明】一種增強(qiáng)軟件保護(hù)易用性的方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及軟件版權(quán)保護(hù)技術(shù),特別涉及一種增強(qiáng)軟件保護(hù)易用性的方法?!?br>背景技術(shù):
】[0002]虛擬機(jī)(VirtualMachine,簡稱VM),指通過軟件模擬硬件系統(tǒng)功能,VMWare就是一種虛擬機(jī)。許多解釋性語言,如Java、LUA也是虛擬機(jī)。一個(gè)虛擬機(jī)引擎由編譯器、解釋器和VPUContext(虛擬CPU環(huán)境)組成,再配上一個(gè)或多個(gè)指令系統(tǒng)。使用虛擬機(jī)是實(shí)現(xiàn)軟件版權(quán)保護(hù)的一種有效方法。該方法將要保護(hù)的軟件代碼轉(zhuǎn)換成一種特定形式或架構(gòu)的虛擬指令,虛擬指令在目標(biāo)計(jì)算機(jī)上不能直接執(zhí)行,而必須由虛擬機(jī)解釋執(zhí)行。由于虛擬機(jī)解釋執(zhí)行的速度較慢,大型軟件為保證效率不能將全部代碼轉(zhuǎn)換為虛擬指令,而是一部分關(guān)鍵代碼轉(zhuǎn)換為虛擬指令,需要時(shí)再通過虛擬機(jī)執(zhí)行虛擬指令。[0003]現(xiàn)有的直接對(duì)源代碼進(jìn)行轉(zhuǎn)換的虛擬機(jī)使用較為繁瑣。一般是由程序員針對(duì)被保護(hù)代碼專門編制一段程序,一般包括三個(gè)步驟:輸入?yún)?shù)處理、調(diào)用虛擬機(jī)和輸出參數(shù)處理。例如LUA是一種腳本語言,利用解釋器執(zhí)行程序,LUA提供了C代碼與LUA進(jìn)行交互的函數(shù)集一“CAPI”。當(dāng)利用C語言調(diào)用一個(gè)LUA的函數(shù)時(shí),需要利用“CAPI”將所有函數(shù)參數(shù)按順序放入堆棧中,然后調(diào)用解釋器執(zhí)行程序,最后按順序從堆棧中取出計(jì)算結(jié)果。該方法對(duì)不同的代碼需要編制不同的程序,不具備通用性;要求嚴(yán)格得對(duì)參數(shù)進(jìn)行處理,且不能發(fā)揮編譯器對(duì)參數(shù)的檢查功能,因而易出錯(cuò),難調(diào)試。[0004]此外,COFF(CommonObjectFileFormat,通用對(duì)象文件格式)是一種很流行的對(duì)象文件格式。比如,VisualStudio編譯器所產(chǎn)生的目標(biāo)文件(*.0bj)就是這種格式。其它的編譯器,如GCC(GNUCompilerCollection)、ICL(IntelC/C++Compiler)、VectorC,也使用這種格式的目標(biāo)文件。不僅僅是C/C++,很多其它語言也使用這種格式的對(duì)象文件。[0005]COFF文件的整體結(jié)構(gòu)如下:FileHeaderOptionalHeaderSectionHeaderISectionHeadernSectionDataRelocationDirectivesLineNumbersSymbolTableStringTable因此,COFF文件一共有8種數(shù)據(jù),自上而下分別為:1.文件頭(FileHeader)2.可選頭(OptionalHeader)3.段落頭(SectionHeader)4.段落數(shù)據(jù)(SectionData)5.重定位表(RelocationDirectives)6.行號(hào)表(LineNumbers)7.符號(hào)表(SymbolTable)8.字符串表(StringTable)其中,除了段落頭可以有多個(gè)節(jié)(因?yàn)榭梢杂卸鄠€(gè)段落)以外,其它的所有類型的節(jié)最多只能有一個(gè)。[0006]文件頭:C0FF文件的頭,它用來保存COFF文件的基本信息,如文件標(biāo)識(shí),各個(gè)表的位置等等。[0007]可選頭:在目標(biāo)文件中,基本上都沒有這個(gè)頭;但在其它的文件中(如:可執(zhí)行文件)這個(gè)段用來保存在文件頭中沒有描述到的信息。[0008]段落頭:用來描述段落信息,每個(gè)段落都有一個(gè)段落頭來描述。段落的數(shù)目在文件頭中會(huì)指出。[0009]段落數(shù)據(jù):通常是COFF文件中最大的數(shù)據(jù)段,每個(gè)段落真正的數(shù)據(jù)就保存在這個(gè)位置。[0010]重定位表:通常只存在于目標(biāo)文件中,用來描述COFF文件中符號(hào)的重定位信息。[0011]符號(hào)表:用來保存COFF文件中所用到的所有符號(hào)的信息,連接多個(gè)COFF文件時(shí),這個(gè)表幫助我們重定位符號(hào)。調(diào)試程序時(shí)也要用到它。[0012]字符串表:用來保存字符串的。符號(hào)表是以記錄的形式來描述符號(hào)信息的,但它只為符號(hào)名稱留置了8個(gè)字符的空間,在現(xiàn)在的程序中,一個(gè)符號(hào)名動(dòng)不動(dòng)就數(shù)十個(gè)字符,8個(gè)字符空間的不夠,因此需將這些名稱存在字符串表中。而符號(hào)表中只記錄這些字符串的位置?!?br/>發(fā)明內(nèi)容】[0013]一般的軟件開發(fā)工具對(duì)源代碼的處理如圖1所示,先由編譯器將各源代碼文件編譯并生成目標(biāo)文件,再由將各目標(biāo)文件和庫文件鏈接生成可執(zhí)行程序。[0014]【
背景技術(shù):
】所述的一般方法相當(dāng)于將要保護(hù)的源代碼替換成程序員編制的調(diào)用虛擬機(jī)的代碼,而本發(fā)明提供的一種提高虛擬機(jī)軟件保護(hù)方式的易用性的方法如圖2所示(假設(shè)源代碼為要保護(hù)的代碼)。本發(fā)明方法先調(diào)用與虛擬機(jī)匹配的編譯器將源代碼編譯為虛擬指令文件,再根據(jù)虛擬指令文件生成目標(biāo)文件,該目標(biāo)文件中包含源代碼中的變量和函數(shù),包含符號(hào)表、重定位表等鏈接器需要的信息,包含對(duì)虛擬機(jī)的引用、對(duì)虛擬指令的引用。[0015]本發(fā)明所述方法可自動(dòng),具有通用性,無需程序員針對(duì)被保護(hù)代碼編制專門的程序,從而提高虛擬機(jī)保護(hù)方式的易用性。本發(fā)明提供一種通過虛擬機(jī)增強(qiáng)軟件保護(hù)易用性的方法,其特征在于,所述方法包括如下步驟:步驟1:利用與虛擬機(jī)匹配的編譯器將源代碼編譯為虛擬指令文件;步驟2:根據(jù)虛擬指令文件構(gòu)造目標(biāo)文件;步驟3:在目標(biāo)文件中添加對(duì)虛擬機(jī)和虛擬指令的引用。[0016]根據(jù)本發(fā)明的一個(gè)方面,在步驟2中,進(jìn)一步包括:構(gòu)造本地函數(shù)、變量;按目標(biāo)文件格式要求構(gòu)造源代碼中涉及的函數(shù)、變量的符號(hào),并使本地定義的各符號(hào)分別指向其實(shí)體;構(gòu)造函數(shù)、變量的重定位信息。[0017]根據(jù)本發(fā)明的一個(gè)方面,在步驟2中,進(jìn)一步包括:所述構(gòu)造本地函數(shù),包括構(gòu)造跳轉(zhuǎn)到虛擬機(jī)入口函數(shù)的跳轉(zhuǎn)指令,以及構(gòu)造虛擬機(jī)所需參數(shù);所述構(gòu)造變量,包括將變量的初始數(shù)據(jù)添加到文件中。[0018]根據(jù)本發(fā)明的一個(gè)方面,在步驟3中,進(jìn)一步包括:設(shè)定虛擬機(jī)入口函數(shù)符號(hào)使符號(hào)指向虛擬機(jī)入口函數(shù),以及設(shè)定虛擬指令符號(hào),并使所述虛擬指令符號(hào)指向?qū)?yīng)的虛擬指令。[0019]根據(jù)本發(fā)明的一個(gè)方面,在對(duì)面向?qū)ο缶幊陶Z言程序進(jìn)行保護(hù)時(shí),在步驟3之后,還包括:構(gòu)造全局變量構(gòu)造與析構(gòu)函數(shù)。[0020]根據(jù)本發(fā)明的一個(gè)方面,在對(duì)允許將全局變量初始化為變量的程序進(jìn)行保護(hù)時(shí),還包括:構(gòu)造初始化函數(shù)列表。[0021]根據(jù)本發(fā)明的一個(gè)方面,還包括:設(shè)置目標(biāo)文件格式需要的其他信息。[0022]根據(jù)本發(fā)明的一個(gè)方面,還包括:輸出目標(biāo)文件。[0023]與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:本方法生成軟件開發(fā)工具在鏈接時(shí)可直接利用的文件,虛擬機(jī)用戶可以用使用函數(shù)或類的方法直接調(diào)用被保護(hù)代碼,即用戶調(diào)用一個(gè)被保護(hù)的函數(shù)或類時(shí)和調(diào)用未被保護(hù)的函數(shù)或類方法相同,無需做額外處理,增強(qiáng)虛擬機(jī)保護(hù)方法的易用性?!緦@綀D】【附圖說明】[0024]圖1為軟件開發(fā)工具生成可執(zhí)行程序的示意圖。[0025]圖2為應(yīng)用本發(fā)明方法時(shí)生成可執(zhí)行程序的示意圖。[0026]圖3為本發(fā)明方法的實(shí)施例一的示意圖。[0027]圖4為本發(fā)明方法的實(shí)施例二的示意圖?!揪唧w實(shí)施方式】[0028]下面結(jié)合附圖對(duì)本發(fā)明的實(shí)施例進(jìn)行詳細(xì)說明。[0029]根據(jù)本發(fā)明的一個(gè)方面,本發(fā)明的方法包括:A.調(diào)用與虛擬機(jī)匹配的編譯器將源代碼編譯為虛擬指令文件。其中,由于虛擬機(jī)應(yīng)有與之匹配的編譯器,否則不能應(yīng)用,而且本發(fā)明并非針對(duì)編譯器,加之本領(lǐng)域的技術(shù)人員能夠?qū)崿F(xiàn)與虛擬機(jī)匹配的編譯器,因此本文不再對(duì)編譯器進(jìn)行詳細(xì)描述。[0030]B.根據(jù)虛擬指令文件構(gòu)造目標(biāo)文件;C.在目標(biāo)文件中添加對(duì)虛擬機(jī)和虛擬指令的引用;其中,B步驟中還可進(jìn)一步包括以下內(nèi)容:B1.構(gòu)造本地函數(shù)、變量的實(shí)體。對(duì)函數(shù)而言,需要構(gòu)造跳轉(zhuǎn)到虛擬機(jī)入口函數(shù)的跳轉(zhuǎn)指令,構(gòu)造虛擬機(jī)需要的參數(shù)。對(duì)變量而言,需要將變量的初始數(shù)據(jù)添加到文件中。[0031]B2.按目標(biāo)文件格式要求構(gòu)造源代碼中涉及的函數(shù)、變量的符號(hào),并使本地定義的各符號(hào)分別指向其實(shí)體。[0032]B3.構(gòu)造函數(shù)、變量的重定位信息。[0033]B4.在對(duì)面向?qū)ο缶幊陶Z言程序進(jìn)行保護(hù)時(shí),還包括:構(gòu)造全局變量構(gòu)造與析構(gòu)函數(shù);一般面向?qū)ο缶幊陶Z言如C語言沒有構(gòu)造與析構(gòu)函數(shù),對(duì)用類似語言的程序進(jìn)行保護(hù)時(shí),可不包括本步驟。[0034]B5.在對(duì)允許將全局變量初始化為變量的程序進(jìn)行保護(hù)時(shí),還包括:構(gòu)造初始化函數(shù)列表;一般面向?qū)ο缶幊陶Z言如C語言不支持將全局變量初始化為變量,對(duì)用類似語言的程序進(jìn)行保護(hù)時(shí),可不包括本步驟。[0035]其中,C步驟還可進(jìn)一步包括以下內(nèi)容:Cl.設(shè)定虛擬機(jī)入口函數(shù)符號(hào)使符號(hào)指向虛擬機(jī)入口函數(shù)。[0036]C2.設(shè)定虛擬指令符號(hào),并使該符號(hào)指向?qū)?yīng)的虛擬指令。[0037]以下提供具體實(shí)施例,以便更明確地理解和適用本發(fā)明:實(shí)施例一:以C語言編寫的example,c文件中包含以下代碼:staticintnumber;externintGetParameterO;intGetSum(inta){returnGetParameter()+number+a;}軟件運(yùn)行環(huán)境為32位x86平臺(tái),操作系統(tǒng)為32位windowsxp。[0038]上述example,c文件編譯為虛擬指令后其目標(biāo)文件為ELF格式的example.0,虛擬機(jī)的入口函數(shù)為EnterVm,要求的參數(shù)為虛擬指令地址、重定位表。[0039]本實(shí)施例的目標(biāo)是構(gòu)造一個(gè)COFF格式的目標(biāo)文件——example,obj,其中包含GetSum函數(shù)及COFF格式要求的信息。[0040]在軟件開發(fā)工具(如VisualStudio6.0)加入該目標(biāo)文件(example,obj),用戶在編程時(shí)就可以直接調(diào)用GetSum函數(shù)。[0041]其中,ELF格式簡介如下:ELF=ExecutableandLinkableFormat,可執(zhí)行連接格式,是UNIX系統(tǒng)實(shí)驗(yàn)室(USL)作為應(yīng)用程序二進(jìn)制接口(ApplicationBinaryInterface,ABI)而開發(fā)和發(fā)布的。[0042]ELF頭位于文件的開始,描述了該文件的組織情況。sections保存著object文件的信息,較為常見的section包括指令,數(shù)據(jù),符號(hào)表,字符串表,重定位信息等等。section頭表(sectionheadertable)包含了描述文件sections的信息。每個(gè)section在這個(gè)表中有一個(gè)入口;每個(gè)入口給出了該section的名字,大小,等等信息。各部分分布如下表所示:ElfheaderProgramheadertablesectionlsectionn【權(quán)利要求】1.一種通過虛擬機(jī)增強(qiáng)軟件保護(hù)易用性的方法,其特征在于,所述方法包括如下步驟:步驟1:利用與虛擬機(jī)匹配的編譯器將源代碼編譯為虛擬指令文件;步驟2:根據(jù)虛擬指令文件構(gòu)造目標(biāo)文件;步驟3:在目標(biāo)文件中添加對(duì)虛擬機(jī)和虛擬指令的引用。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在步驟2中,進(jìn)一步包括:構(gòu)造本地函數(shù)、變量;按目標(biāo)文件格式要求構(gòu)造源代碼中涉及的函數(shù)、變量的符號(hào),并使本地定義的各符號(hào)分別指向其實(shí)體;構(gòu)造函數(shù)、變量的重定位信息。3.根據(jù)權(quán)利要求2所述的方法,其特征在于,在步驟2中,進(jìn)一步包括:所述構(gòu)造本地函數(shù),包括構(gòu)造跳轉(zhuǎn)到虛擬機(jī)入口函數(shù)的跳轉(zhuǎn)指令,以及構(gòu)造虛擬機(jī)所需參數(shù);所述構(gòu)造變量,包括將變量的初始數(shù)據(jù)添加到文件中。4.根據(jù)權(quán)利要求1所述的方法,其特征在于,在步驟3中,進(jìn)一步包括:設(shè)定虛擬機(jī)入口函數(shù)符號(hào)使符號(hào)指向虛擬機(jī)入口函數(shù),以及設(shè)定虛擬指令符號(hào),并使所述虛擬指令符號(hào)指向?qū)?yīng)的虛擬指令。5.根據(jù)權(quán)利要求1所述的方法,其特征在于,在對(duì)面向?qū)ο缶幊陶Z言程序進(jìn)行保護(hù)時(shí),在步驟3之后,還包括:構(gòu)造全局變量構(gòu)造與析構(gòu)函數(shù)。6.根據(jù)權(quán)利要求5所述的方法,其特征在于,在對(duì)允許將全局變量初始化為變量的程序進(jìn)行保護(hù)時(shí),還包括:構(gòu)造初始化函數(shù)列表。7.根據(jù)權(quán)利要求1或6所述的方法,其特征在于,還包括:設(shè)置目標(biāo)文件格式需要的其他信息。8.根據(jù)權(quán)利要求7所述的方法,其特征在于,還包括:輸出目標(biāo)文件?!疚臋n編號(hào)】G06F21/12GK103514027SQ201310284247【公開日】2014年1月15日申請(qǐng)日期:2013年11月12日優(yōu)先權(quán)日:2013年11月12日【發(fā)明者】不公告發(fā)明人申請(qǐng)人:北京深思數(shù)盾科技有限公司