本發(fā)明實(shí)施例涉及軟件保護(hù)技術(shù),尤其涉及一種java程序的保護(hù)與運(yùn)行方法、裝置和終端。
背景技術(shù):
軟件作為一種特殊的產(chǎn)品,由于其數(shù)字化的特征,從問(wèn)世起就一直遭受盜版的困擾。盜版的存在不僅給軟件開(kāi)發(fā)者造成了巨大的損失,也極大的阻礙了整個(gè)軟件行業(yè)的發(fā)展。java程序很容易被反編譯,對(duì)于class類文件采用jdk(javadevelopmentkit,軟件開(kāi)發(fā)工具包)的javap命令行工具可以得到j(luò)ava虛擬機(jī)指令,另外采用反編譯軟件jd_gui可以直接得到j(luò)ava源碼,因此軟件很容易被反編譯,進(jìn)而被盜版,安全性很低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種java程序的保護(hù)與運(yùn)行方法、裝置、終端和計(jì)算機(jī)存儲(chǔ)介質(zhì),以實(shí)現(xiàn)增加反編譯的難度,提高軟件產(chǎn)品的安全性。
第一方面,本發(fā)明實(shí)施例提供了一種java程序的保護(hù)方法,包括:
獲取java程序中待保護(hù)方法的java虛擬機(jī)指令、參數(shù)和返回值;
對(duì)所述java虛擬機(jī)指令進(jìn)行加密;
將加密后的java虛擬機(jī)指令保存在指定的目錄;
構(gòu)造受保護(hù)方法,所述受保護(hù)方法中包括:用于查找所述加密后的java虛擬機(jī)指令的代碼、用于對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密的代碼以及用于根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令的代碼;
使用所述受保護(hù)方法替換所述java程序中的所述待保護(hù)方法。
第二方面,本發(fā)明實(shí)施例還提供了一種java程序的運(yùn)行方法,包括:
當(dāng)java程序運(yùn)行到受保護(hù)方法時(shí),查找加密后的java虛擬機(jī)指令;其中,所述受保護(hù)方法是上述的受保護(hù)方法;
對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密;
根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令。
第三方面,本發(fā)明實(shí)施例還提供了一種java程序的保護(hù)裝置,包括:
獲取模塊,用于獲取java程序中待保護(hù)方法的java虛擬機(jī)指令、參數(shù)和返回值;
加密模塊,用于對(duì)所述java虛擬機(jī)指令進(jìn)行加密;
保存模塊,用于將加密后的java虛擬機(jī)指令保存在指定的目錄;
構(gòu)造模塊,用于構(gòu)造受保護(hù)方法,所述受保護(hù)方法中包括:用于查找所述加密后的java虛擬機(jī)指令的代碼、用于對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密的代碼以及用于根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令;
替換模塊,用于使用所述受保護(hù)方法替換所述java程序中的所述待保護(hù)方法。
第四方面,本發(fā)明實(shí)施例還提供了一種java程序的運(yùn)行裝置,包括:
查找模塊,用于當(dāng)java程序運(yùn)行到受保護(hù)方法時(shí),查找加密后的java虛擬機(jī)指令;其中,所述受保護(hù)方法是上述的受保護(hù)方法;
解密模塊,用于對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密;
運(yùn)行模塊,用于根據(jù)參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令。
第五方面,本發(fā)明實(shí)施例還提供了一種終端,所述終端包括:
一個(gè)或多個(gè)處理器;
存儲(chǔ)器,用于存儲(chǔ)一個(gè)或多個(gè)程序,
當(dāng)所述一個(gè)或多個(gè)程序被所述一個(gè)或多個(gè)處理器執(zhí)行,使得所述一個(gè)或多個(gè)處理器實(shí)現(xiàn)上述的java程序的保護(hù)方法。
第六方面,本發(fā)明實(shí)施例還提供了一種終端,所述終端包括:
一個(gè)或多個(gè)處理器;
存儲(chǔ)器,用于存儲(chǔ)一個(gè)或多個(gè)程序,
當(dāng)所述一個(gè)或多個(gè)程序被所述一個(gè)或多個(gè)處理器執(zhí)行,使得所述一個(gè)或多個(gè)處理器實(shí)現(xiàn)上述的java程序的運(yùn)行方法。
第七方面,本發(fā)明實(shí)施例還提供了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),其上存儲(chǔ)有計(jì)算機(jī)程序,該程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)上述的java程序的保護(hù)方法。
第八方面,本發(fā)明實(shí)施例還提供了一種計(jì)算機(jī)存儲(chǔ)介質(zhì),其上存儲(chǔ)有計(jì)算機(jī)程序,該程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)上述的java程序的運(yùn)行方法。
本發(fā)明實(shí)施例將java程序中待保護(hù)方法的java虛擬機(jī)指令加密,構(gòu)造出沒(méi)有記載未加密的虛擬機(jī)指令的受保護(hù)方法,該受保護(hù)方法運(yùn)行時(shí),會(huì)查找加密后的java虛擬機(jī)指令進(jìn)行解密,運(yùn)行解密后的虛擬機(jī)指令。這種方法級(jí)別的加密保護(hù)使得只有當(dāng)執(zhí)行到受保護(hù)方法時(shí),才會(huì)在內(nèi)存中對(duì)加密后的java虛擬機(jī)指令進(jìn)行解密,而無(wú)法直接用反編譯工具獲取到j(luò)ava程序的源碼,解決現(xiàn)有技術(shù)中軟件易于被反編譯和盜版,安全性很低的問(wèn)題,實(shí)現(xiàn)增加反編譯的難度,提高軟件產(chǎn)品的安全性效果。
附圖說(shuō)明
圖1是本發(fā)明實(shí)施例一提供的java程序的保護(hù)方法的流程圖;
圖2是本發(fā)明實(shí)施例二提供的java程序的保護(hù)方法的流程圖;
圖3是本發(fā)明實(shí)施例三提供的java程序的運(yùn)行方法的流程圖;
圖4是本發(fā)明實(shí)施例四提供的java程序的保護(hù)裝置的結(jié)構(gòu)示意圖;
圖5是本發(fā)明實(shí)施例五提供的java程序的運(yùn)行裝置的結(jié)構(gòu)示意圖;
圖6是本發(fā)明實(shí)施例六提供的終端的結(jié)構(gòu)示意圖;
圖7是本發(fā)明實(shí)施例七提供的終端的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明??梢岳斫獾氖?,此處所描述的具體實(shí)施例僅僅用于解釋本發(fā)明,而非對(duì)本發(fā)明的限定。另外還需要說(shuō)明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部結(jié)構(gòu)。
實(shí)施例一
圖1為本發(fā)明實(shí)施例一提供的java程序的保護(hù)方法的流程圖,本實(shí)施例可適用于對(duì)java程序進(jìn)行加密編譯,以避免被反編譯的情況,該方法可以由計(jì)算機(jī)終端來(lái)執(zhí)行,具體包括如下步驟:
步驟110、獲取java程序中待保護(hù)方法的java虛擬機(jī)指令、參數(shù)和返回值;
步驟120、對(duì)所述java虛擬機(jī)指令進(jìn)行加密;
步驟130、將加密后的java虛擬機(jī)指令保存在指定的目錄;
步驟140、構(gòu)造受保護(hù)方法,所述受保護(hù)方法中包括:用于查找加密后的java虛擬機(jī)指令的代碼、用于對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密的代碼以及用于根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令的代碼;
步驟150、使用所述受保護(hù)方法替換所述java程序中的所述待保護(hù)方法。
一般地,java程序中的方法記載在類文件(class文件)中,其包含用于讀取java虛擬機(jī)指令的代碼以及用于根據(jù)參數(shù)和返回值運(yùn)行java虛擬機(jī)指令的代碼。本實(shí)施例提供的java程序的保護(hù)方法,獲取待編譯的方法的java虛擬機(jī)指令、參數(shù)和返回值后,將java虛擬機(jī)指令加密并保存在指定的目錄中,構(gòu)造沒(méi)有直接記載原來(lái)的java虛擬機(jī)指令的受保護(hù)方法,只有在受保護(hù)方法運(yùn)行時(shí),才會(huì)在內(nèi)存中解密java虛擬機(jī)指令,根據(jù)原來(lái)的參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令,實(shí)現(xiàn)運(yùn)行待保護(hù)方法。從而不能直接反編譯獲得待保護(hù)方法的實(shí)際的運(yùn)行過(guò)程,實(shí)現(xiàn)對(duì)java程序的保護(hù)。
具體地,所述指定的目錄優(yōu)選為所述java程序的壓縮包的隨機(jī)子目錄,以避免該方法運(yùn)行過(guò)程中出現(xiàn)調(diào)用錯(cuò)誤的情況。
進(jìn)一步地,在受保護(hù)方法中的用于根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令的代碼,在被處理器執(zhí)行時(shí),實(shí)現(xiàn)以下步驟:
根據(jù)解密后的java虛擬機(jī)指令創(chuàng)建自定義的classloader和臨時(shí)類;
使用所述自定義的classloader加載所述臨時(shí)類,并通過(guò)反射機(jī)制獲取到所述臨時(shí)類中的方法;
根據(jù)讀取的所述參數(shù)和返回值,運(yùn)行所述臨時(shí)類中的方法。
由于將加密后的java虛擬機(jī)指令保存在壓縮包的子目錄中,java自帶的classloader無(wú)法加載,本實(shí)施例通過(guò)自定義classloader,創(chuàng)建臨時(shí)類,獲取到臨時(shí)類中的方法。結(jié)合獲取到的參數(shù)和返回值,可以運(yùn)行設(shè)計(jì)者實(shí)際要編譯的方法。
本實(shí)施例的技術(shù)方案,將java程序中待保護(hù)方法的java虛擬機(jī)指令加密,構(gòu)造出沒(méi)有記載未加密的虛擬機(jī)指令的受保護(hù)方法,該受保護(hù)方法運(yùn)行時(shí),會(huì)查找加密后的java虛擬機(jī)指令進(jìn)行解密,運(yùn)行解密后的虛擬機(jī)指令。這種方法級(jí)別的加密保護(hù)使得只有當(dāng)執(zhí)行到受保護(hù)方法時(shí),才會(huì)在內(nèi)存中將加密后的java虛擬機(jī)指令進(jìn)行解密,而無(wú)法直接用反編譯工具獲取到j(luò)ava程序的源碼,解決現(xiàn)有技術(shù)中軟件易于被反編譯和盜版,安全性很低的問(wèn)題,實(shí)現(xiàn)增加反編譯的難度,提高軟件的安全性效果。
實(shí)施例二
圖2為本發(fā)明實(shí)施例二提供的java程序的保護(hù)方法的流程圖,本實(shí)施例可適用于對(duì)java程序進(jìn)行加密編譯,以避免被反編譯的情況,該方法可以由計(jì)算機(jī)終端來(lái)執(zhí)行。本實(shí)施例與實(shí)施例一的區(qū)別點(diǎn)在于本實(shí)施例獲取待保護(hù)方法的虛擬機(jī)指令、參數(shù)和返回值,是通過(guò)從待加密的java程序的類文件中分析得出類中的方法的虛擬機(jī)指令、參數(shù)和返回值;對(duì)所述虛擬機(jī)指令加密后,是通過(guò)采用jclasslib在該待加密的java程序的類文件中將待保護(hù)方法修改為受保護(hù)方法來(lái)實(shí)現(xiàn)使用受保護(hù)方法替代待保護(hù)方法。具體地,如圖2所示,本實(shí)施例提供的包括如下步驟:
步驟210、從java程序的類文件中讀取待保護(hù)方法的java虛擬機(jī)指令、參數(shù)和返回值;
步驟220、對(duì)所述java虛擬機(jī)指令進(jìn)行加密;
步驟230、將加密后的java虛擬機(jī)指令保存在指定的目錄;
步驟240、構(gòu)造受保護(hù)方法,所述受保護(hù)方法中包括:用于查找加密后的java虛擬機(jī)指令的代碼、用于對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密的代碼以及用于根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令的代碼;
步驟250、采用jclasslib在所述java程序的類文件中將所述待保護(hù)方法修改為所述受保護(hù)方法。
本實(shí)施例提供的java程序的保護(hù)方法可供專門負(fù)責(zé)對(duì)軟件產(chǎn)品進(jìn)行加密保護(hù)的開(kāi)發(fā)者使用,實(shí)現(xiàn)對(duì)已有的java程序進(jìn)行方法級(jí)別的保護(hù)。待保護(hù)方法,可以是由開(kāi)發(fā)者選擇指定,也可以是隨機(jī)選擇,或者是java程序中每一方法都作為待保護(hù)方法。
在上述技術(shù)方案的基礎(chǔ)上,步驟220、對(duì)java虛擬機(jī)指令進(jìn)行加密,可使用純軟件的算法來(lái)進(jìn)行加密,例如,使用aes加密算法或rsa加密算法對(duì)所述方法的java虛擬機(jī)指令進(jìn)行加密。對(duì)應(yīng)地,方法的運(yùn)行步驟是采用aes加密算法或rsa加密算法所對(duì)應(yīng)的解密算法解密虛擬機(jī)指令。
為了進(jìn)一步提高java程序被反編譯的難度,本實(shí)施例優(yōu)選使用存儲(chǔ)在硬件加密鎖中的加密算法來(lái)對(duì)java虛擬機(jī)指令進(jìn)行加密。具體地,步驟220、對(duì)java虛擬機(jī)指令進(jìn)行加密包括:
通過(guò)jni調(diào)用硬件加密鎖中的加密算法;
使用該加密算法對(duì)所述待保護(hù)方法的java虛擬機(jī)指令進(jìn)行加密。
硬件加密鎖是一種可插拔連接在計(jì)算機(jī)終端,可與計(jì)算機(jī)終端進(jìn)行數(shù)據(jù)交換的加密產(chǎn)品。硬件加密鎖能存儲(chǔ)加密算法,當(dāng)它連接在計(jì)算機(jī)終端上,計(jì)算機(jī)終端上執(zhí)行的程序可調(diào)用存儲(chǔ)在加密鎖內(nèi)的加密算法,這些加密算法可通過(guò)使用加密函數(shù)對(duì)要加密的內(nèi)容進(jìn)行封裝、混淆加密的內(nèi)容的流程或者選取加密內(nèi)容的片段存放于加密鎖等方式實(shí)現(xiàn)。如果使用加密鎖內(nèi)的加密算法對(duì)本實(shí)施例要保護(hù)的java程序進(jìn)行加密,則在方法運(yùn)行過(guò)程中,也需要調(diào)用加密鎖內(nèi)的加密算法才能進(jìn)行解密。使得在方法運(yùn)行時(shí),還會(huì)通過(guò)加密鎖是否插拔來(lái)驗(yàn)證運(yùn)行java程序的用戶的合法性。且由于加密算法獨(dú)立存儲(chǔ)于硬件加密鎖內(nèi),使得非法用戶獲得java程序后,由于缺失運(yùn)行過(guò)程中的必要內(nèi)容,使得對(duì)java程序進(jìn)行反編譯的難度更大。
下面以具體的例子來(lái)進(jìn)一步說(shuō)明本實(shí)施例技術(shù)方案的工作原理。該例子在微軟windows764位系統(tǒng)上可實(shí)現(xiàn)。
假設(shè)java程序的源碼如下:
采用eclipse可生成壓縮包為helloworld.jar的java程序,記載上述源碼對(duì)應(yīng)的運(yùn)行步驟。執(zhí)行本實(shí)施例,可分析java程序中的類及類中的方法。對(duì)于該例子來(lái)說(shuō),壓縮包(jar包)中有一個(gè)類為helloworld(對(duì)應(yīng)類文件helloworld.class),類中有main方法,方法有一個(gè)字符串參數(shù),返回值為空。main方法的java虛擬機(jī)指令為:
0:getstatic#16//fieldjava/lang/system.out:ljava/io/printstream;
3:ldc#22//stringhello,world!
5:invokevirtual#24//methodjava/io/printstream.println:(ljava/lang/string;)v
8:return
本實(shí)施例保護(hù)main方法,調(diào)用硬件加密鎖內(nèi)的加密算法對(duì)main方法的java虛擬機(jī)指令進(jìn)行加密,例如使用市場(chǎng)上的深思精銳5加密鎖中的slm_encrypt函數(shù)(該函數(shù)使用對(duì)稱加密算法對(duì)加密內(nèi)容進(jìn)行加密)。將加密后的java虛擬機(jī)指令保存在和類文件helloworld.class同目錄下的encrypt_main.hex文件中。
采用jclasslib在所述java程序的類文件(helloworld.class)中使用受保護(hù)方法替換待保護(hù)方法,對(duì)應(yīng)的源碼為:
受保護(hù)的main方法中,read_encrypt_data函數(shù)讀取加密的java虛擬機(jī)指令,作為enc_code;decrypt_code函數(shù)是通過(guò)jni調(diào)用精銳5加密鎖的slm_decrypt函數(shù)對(duì)enc_code進(jìn)行解密,得到code。
自定義classloader后,mcl.df(code).getmethods()函數(shù)加載臨時(shí)類,通過(guò)反射獲取臨時(shí)類的方法,調(diào)用am[0].invoke(args),即調(diào)用參數(shù)和返回值給java程序返回原來(lái)的結(jié)果。
綜上,本實(shí)施例的技術(shù)方案,將java程序中待保護(hù)方法的java虛擬機(jī)指令采用硬件加密鎖的加密算法進(jìn)行加密保護(hù),構(gòu)造出沒(méi)有記載未加密的虛擬機(jī)指令的受保護(hù)方法,該受保護(hù)方法運(yùn)行時(shí),會(huì)查找加密后的java虛擬機(jī)指令進(jìn)行解密,運(yùn)行解密后的虛擬機(jī)指令。這種方法級(jí)別的加密保護(hù)使得只有當(dāng)執(zhí)行到受保護(hù)方法時(shí),才會(huì)在java程序中查找加密后的java虛擬機(jī)指令,并在內(nèi)存中對(duì)加密后的java虛擬機(jī)指令進(jìn)行解密,因此無(wú)法直接用反編譯工具獲取到j(luò)ava程序的源碼,且需要調(diào)用硬件加密鎖的加密算法,即要求運(yùn)行該java程序的用戶持有硬件加密鎖,驗(yàn)證了用戶的合法性,進(jìn)一步提高了反編譯的難度。
實(shí)施例三
圖3為本發(fā)明實(shí)施例三提供的java程序的運(yùn)行方法的流程圖,本實(shí)施例可適用于運(yùn)行使用上述實(shí)施例提供的保護(hù)方法加密編譯的java程序,該方法可以由計(jì)算機(jī)終端來(lái)執(zhí)行,具體包括如下步驟:
步驟310、當(dāng)java程序運(yùn)行到受保護(hù)方法時(shí),查找加密后的java虛擬機(jī)指令;其中,所述受保護(hù)方法是在對(duì)java程序中待保護(hù)方法的java虛擬機(jī)指令加密并保存在指定的目錄后構(gòu)造的;所述受保護(hù)方法與所述待保護(hù)方法的參數(shù)與返回值相同;
步驟320、對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密;
步驟330、根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令。
其中,受保護(hù)方法為實(shí)現(xiàn)上述實(shí)施例所構(gòu)造的受保護(hù)方法,包括用于查找所述加密后的java虛擬機(jī)指令的代碼、用于對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密的代碼以及用于根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令的代碼,對(duì)應(yīng)實(shí)現(xiàn)步驟310至330。
在具體實(shí)施時(shí),步驟330、根據(jù)所述參數(shù)和返回值,運(yùn)行解密后的java虛擬機(jī)指令,具體包括:
根據(jù)解密后的java虛擬機(jī)指令創(chuàng)建自定義的classloader和臨時(shí)類;
使用所述自定義的classloader加載所述臨時(shí)類,并通過(guò)反射機(jī)制獲取到所述臨時(shí)類中的方法;
根據(jù)獲取的所述參數(shù)和返回值,運(yùn)行所述臨時(shí)類中的方法。
由于受保護(hù)方法調(diào)用虛擬機(jī)指令的規(guī)則發(fā)生了更改,java自帶的classloader無(wú)法加載,本實(shí)施例通過(guò)自定義classloader,創(chuàng)建臨時(shí)類,獲取到臨時(shí)類中的方法。結(jié)合獲取到的參數(shù)和返回值,可以運(yùn)行設(shè)計(jì)者實(shí)際要編譯的方法。
以實(shí)施例二提供的helloword程序?yàn)槔?,受保護(hù)方法對(duì)應(yīng)的源碼為:
對(duì)應(yīng)的源碼為:
main方法的運(yùn)行步驟如下:
java程序正常運(yùn)行,調(diào)用到main方法時(shí),read_encrypt_data函數(shù)讀取加密的java虛擬機(jī)指令,作為enc_code;decrypt_code函數(shù)是通過(guò)jni調(diào)用精銳5加密鎖的slm_decrypt函數(shù)對(duì)enc_code進(jìn)行解密,得到code。
自定義classloader后,mcl.df(code).getmethods()函數(shù)加載臨時(shí)類,通過(guò)反射獲取臨時(shí)類的方法,調(diào)用am[0].invoke(args),即調(diào)用參數(shù)和返回值給java程序返回原來(lái)的結(jié)果。
本實(shí)施例的技術(shù)方案,運(yùn)行上述實(shí)施例所構(gòu)造的受保護(hù)方法,具備上述實(shí)施例相應(yīng)的有益效果。
當(dāng)然,本發(fā)明實(shí)施所提供的java程序的運(yùn)行方法,其能運(yùn)行的java程序方法不限于上述實(shí)施例所構(gòu)造的受保護(hù)方法,還可以是本發(fā)明任意實(shí)施例所提供的java程序的保護(hù)方法所構(gòu)造的受保護(hù)方法。
實(shí)施例四
圖4為本發(fā)明實(shí)施例四提供的java程序的保護(hù)裝置的結(jié)構(gòu)示意圖,本實(shí)施例可適用于對(duì)java程序進(jìn)行加密編譯,以避免被反編譯的情況,該裝置包括:
獲取模塊410,用于獲取java程序中待保護(hù)方法的java虛擬機(jī)指令、參數(shù)和返回值;
加密模塊420,用于對(duì)所述java虛擬機(jī)指令進(jìn)行加密;
保存模塊430,用于將加密后的java虛擬機(jī)指令保存在指定的目錄;
構(gòu)造模塊440,用于構(gòu)造受保護(hù)方法,所述受保護(hù)方法中包括:用于查找加密后的java虛擬機(jī)指令的代碼、用于對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密的代碼以及根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令的代碼;
替換模塊450,用于使用所述受保護(hù)方法替換所述java程序中的所述待保護(hù)方法。
作為其中一種實(shí)施方式,所述加密模塊420包括:
調(diào)用單元,用于通過(guò)jni調(diào)用硬件加密鎖中的加密算法;
執(zhí)行單元,用于使用該加密算法對(duì)所述待保護(hù)方法的java虛擬機(jī)指令進(jìn)行加密。
作為另一種實(shí)施方式,所述加密模塊420具體用于使用aes加密算法或rsa加密算法對(duì)所述待保護(hù)方法的java虛擬機(jī)指令進(jìn)行加密。
作為其中一種實(shí)施方式,所述獲取模塊具體用于從java程序的類文件中讀取待保護(hù)方法的java虛擬機(jī)指令、參數(shù)和返回值;
所述替換模塊具體用于采用jclasslib在所述java程序的類文件中將所述待保護(hù)方法修改為所述受保護(hù)方法。
優(yōu)選地,所述指定的目錄為所述java程序的壓縮包的隨機(jī)子目錄。
本發(fā)明實(shí)施例所提供的java程序的保護(hù)裝置可執(zhí)行本發(fā)明任意實(shí)施例所提供的java程序的保護(hù)方法,具備執(zhí)行方法相應(yīng)的功能模塊和有益效果。
實(shí)施例五
圖5為發(fā)明實(shí)施例五提供的java程序的運(yùn)行裝置的結(jié)構(gòu)示意圖,本實(shí)施例可適用于運(yùn)行使用上述實(shí)施例提供的保護(hù)方法加密編譯的java程序,該裝置包括:
查找模塊510,用于當(dāng)java程序運(yùn)行到受保護(hù)方法時(shí),查找加密后的java虛擬機(jī)指令;其中,所述受保護(hù)方法是上述實(shí)施例所述的受保護(hù)方法;即所述受保護(hù)方法是在對(duì)java程序中待保護(hù)方法的java虛擬機(jī)指令加密并保存在指定的目錄后構(gòu)造的;所述受保護(hù)方法與所述待保護(hù)方法的參數(shù)與返回值相同;
解密模塊520,用于對(duì)所述加密后的java虛擬機(jī)指令進(jìn)行解密;
運(yùn)行模塊530,用于根據(jù)所述參數(shù)和返回值運(yùn)行解密后的java虛擬機(jī)指令。
在具體實(shí)施時(shí),運(yùn)行模塊530包括:
創(chuàng)建單元,用于根據(jù)解密后的java虛擬機(jī)指令創(chuàng)建自定義的classloader和臨時(shí)類;
加載單元,用于使用所述自定義的classloader加載所述臨時(shí)類,并通過(guò)反射機(jī)制獲取到所述臨時(shí)類中的方法;
執(zhí)行單元,用于根據(jù)獲取的所述參數(shù)和返回值,運(yùn)行所述臨時(shí)類中的方法。
本發(fā)明實(shí)施例所提供的java程序的運(yùn)行裝置可執(zhí)行本發(fā)明任意實(shí)施例所提供的java程序的運(yùn)行方法,具備執(zhí)行方法相應(yīng)的功能模塊和有益效果。
實(shí)施例六
圖6為本發(fā)明實(shí)施例六提供的一種終端的結(jié)構(gòu)示意圖,如圖6所示,該終端包括處理器610、存儲(chǔ)器620、輸入裝置630和輸出裝置640;終端中處理器610的數(shù)量可以是一個(gè)或多個(gè),圖6中以一個(gè)處理器610為例;終端中的處理器610、存儲(chǔ)器620、輸入裝置630和輸出裝置640可以通過(guò)總線或其他方式連接,圖6中以通過(guò)總線連接為例。
存儲(chǔ)器620作為一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),可用于存儲(chǔ)軟件程序、計(jì)算機(jī)可執(zhí)行程序以及模塊,本實(shí)施例提供的終端的存儲(chǔ)器存儲(chǔ)本發(fā)明實(shí)施例中的java程序的保護(hù)方法對(duì)應(yīng)的程序指令/模塊(即java程序的保護(hù)裝置中的獲取模塊410、加密模塊420、保存模塊430、構(gòu)造模塊440和替換模塊450)。處理器610通過(guò)運(yùn)行存儲(chǔ)在存儲(chǔ)器620中的軟件程序、指令以及模塊,從而執(zhí)行終端的各種功能應(yīng)用以及數(shù)據(jù)處理,即實(shí)現(xiàn)上述的java程序的保護(hù)方法。
存儲(chǔ)器620可主要包括存儲(chǔ)程序區(qū)和存儲(chǔ)數(shù)據(jù)區(qū),其中,存儲(chǔ)程序區(qū)可存儲(chǔ)操作系統(tǒng)、至少一個(gè)功能所需的應(yīng)用程序;存儲(chǔ)數(shù)據(jù)區(qū)可存儲(chǔ)根據(jù)終端的使用所創(chuàng)建的數(shù)據(jù)等。此外,存儲(chǔ)器620可以包括高速隨機(jī)存取存儲(chǔ)器,還可以包括非易失性存儲(chǔ)器,例如至少一個(gè)磁盤存儲(chǔ)器件、閃存器件、或其他非易失性固態(tài)存儲(chǔ)器件。在一些實(shí)例中,存儲(chǔ)器620可進(jìn)一步包括相對(duì)于處理器610遠(yuǎn)程設(shè)置的存儲(chǔ)器,這些遠(yuǎn)程存儲(chǔ)器可以通過(guò)網(wǎng)絡(luò)連接至終端。上述網(wǎng)絡(luò)的實(shí)例包括但不限于互聯(lián)網(wǎng)、企業(yè)內(nèi)部網(wǎng)、局域網(wǎng)、移動(dòng)通信網(wǎng)及其組合。
輸入裝置630可用于接收輸入的數(shù)字或字符信息,以及產(chǎn)生與終端的用戶設(shè)置以及功能控制有關(guān)的鍵信號(hào)輸入。輸出裝置640可包括顯示屏等顯示設(shè)備。
實(shí)施例七
圖7為本發(fā)明實(shí)施例七提供的一種終端的結(jié)構(gòu)示意圖,如圖7所示,該終端包括處理器710、存儲(chǔ)器720、輸入裝置730和輸出裝置740;終端中處理器710的數(shù)量可以是一個(gè)或多個(gè),圖7中以一個(gè)處理器710為例;終端中的處理器710、存儲(chǔ)器720、輸入裝置730和輸出裝置740可以通過(guò)總線或其他方式連接,圖7中以通過(guò)總線連接為例。
存儲(chǔ)器720作為一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),可用于存儲(chǔ)軟件程序、計(jì)算機(jī)可執(zhí)行程序以及模塊,本實(shí)施例提供的終端的存儲(chǔ)器存儲(chǔ)本發(fā)明實(shí)施例中的java程序的運(yùn)行方法對(duì)應(yīng)的程序指令/模塊(即java程序的運(yùn)行裝置中的查找模塊510、解密模塊520和運(yùn)行模塊530)。處理器710通過(guò)運(yùn)行存儲(chǔ)在存儲(chǔ)器720中的軟件程序、指令以及模塊,從而執(zhí)行終端的各種功能應(yīng)用以及數(shù)據(jù)處理,即實(shí)現(xiàn)上述的java程序的運(yùn)行方法。
存儲(chǔ)器720可主要包括存儲(chǔ)程序區(qū)和存儲(chǔ)數(shù)據(jù)區(qū),其中,存儲(chǔ)程序區(qū)可存儲(chǔ)操作系統(tǒng)、至少一個(gè)功能所需的應(yīng)用程序;存儲(chǔ)數(shù)據(jù)區(qū)可存儲(chǔ)根據(jù)終端的使用所創(chuàng)建的數(shù)據(jù)等。此外,存儲(chǔ)器720可以包括高速隨機(jī)存取存儲(chǔ)器,還可以包括非易失性存儲(chǔ)器,例如至少一個(gè)磁盤存儲(chǔ)器件、閃存器件、或其他非易失性固態(tài)存儲(chǔ)器件。在一些實(shí)例中,存儲(chǔ)器720可進(jìn)一步包括相對(duì)于處理器710遠(yuǎn)程設(shè)置的存儲(chǔ)器,這些遠(yuǎn)程存儲(chǔ)器可以通過(guò)網(wǎng)絡(luò)連接至終端。上述網(wǎng)絡(luò)的實(shí)例包括但不限于互聯(lián)網(wǎng)、企業(yè)內(nèi)部網(wǎng)、局域網(wǎng)、移動(dòng)通信網(wǎng)及其組合。
輸入裝置730可用于接收輸入的數(shù)字或字符信息,以及產(chǎn)生與終端的用戶設(shè)置以及功能控制有關(guān)的鍵信號(hào)輸入。輸出裝置740可包括顯示屏等顯示設(shè)備。
實(shí)施例八
本發(fā)明實(shí)施例八還提供一種存儲(chǔ)有計(jì)算機(jī)程序的計(jì)算機(jī)存儲(chǔ)介質(zhì),所述計(jì)算機(jī)程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)上述任一實(shí)施例提供的java程序的保護(hù)方法。
當(dāng)然,本發(fā)明實(shí)施例所提供的一種包含計(jì)算機(jī)程序的存儲(chǔ)介質(zhì),其計(jì)算機(jī)程序不限于如上所述的方法操作,還可以執(zhí)行本發(fā)明任意實(shí)施例所提供的java程序的保護(hù)方法中的相關(guān)操作。
實(shí)施例九
本發(fā)明實(shí)施例九還提供一種存儲(chǔ)有計(jì)算機(jī)程序的計(jì)算機(jī)存儲(chǔ)介質(zhì),所述計(jì)算機(jī)程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)上述任一實(shí)施例提供的java程序的運(yùn)行方法。
當(dāng)然,本發(fā)明實(shí)施例所提供的一種包含計(jì)算機(jī)程序的存儲(chǔ)介質(zhì),其計(jì)算機(jī)程序不限于如上所述的方法操作,還可以執(zhí)行本發(fā)明任意實(shí)施例所提供的java程序的運(yùn)行方法中的相關(guān)操作。
通過(guò)以上關(guān)于實(shí)施方式的描述,所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,本發(fā)明可借助軟件及必需的通用硬件來(lái)實(shí)現(xiàn),當(dāng)然也可以通過(guò)硬件實(shí)現(xiàn),但很多情況下前者是更佳的實(shí)施方式。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式記載出來(lái),該計(jì)算機(jī)軟件產(chǎn)品可以存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,如計(jì)算機(jī)的軟盤、只讀存儲(chǔ)器(read-onlymemory,rom)、隨機(jī)存取存儲(chǔ)器(randomaccessmemory,ram)、閃存(flash)、硬盤或光盤等,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述的方法。
值得注意的是,上述java程序的保護(hù)裝置和運(yùn)行裝置的實(shí)施例中,所包括的各個(gè)單元和模塊只是按照功能邏輯進(jìn)行劃分的,但并不局限于上述的劃分,只要能夠?qū)崿F(xiàn)相應(yīng)的功能即可;另外,各功能單元的具體名稱也只是為了便于相互區(qū)分,并不用于限制本發(fā)明的保護(hù)范圍。
注意,上述僅為本發(fā)明的較佳實(shí)施例及所運(yùn)用技術(shù)原理。本領(lǐng)域技術(shù)人員會(huì)理解,本發(fā)明不限于這里所述的特定實(shí)施例,對(duì)本領(lǐng)域技術(shù)人員來(lái)說(shuō)能夠進(jìn)行各種明顯的變化、重新調(diào)整和替代而不會(huì)脫離本發(fā)明的保護(hù)范圍。因此,雖然通過(guò)以上實(shí)施例對(duì)本發(fā)明進(jìn)行了較為詳細(xì)的說(shuō)明,但是本發(fā)明不僅僅限于以上實(shí)施例,在不脫離本發(fā)明構(gòu)思的情況下,還可以包括更多其他等效實(shí)施例,而本發(fā)明的范圍由所附的權(quán)利要求范圍決定。