• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于Hotspot 的虛擬機(jī)加密方法研究

      2014-01-21 00:51:50冰,魏
      電子設(shè)計工程 2014年20期
      關(guān)鍵詞:常量數(shù)據(jù)結(jié)構(gòu)解密

      陳 冰,魏 江

      (西北工業(yè)大學(xué) 電子信息學(xué)院,陜西 西安 710072)

      Java語言以其“一次編寫,到處運行”的思想和較為安全的內(nèi)存管理訪問機(jī)制,實現(xiàn)了熱點代碼檢測和運行時編譯及優(yōu)化,使得Java應(yīng)用隨著運行時間的增加而獲得更高的性能。Java有一套完善的應(yīng)用程序接口,還有大量來自商業(yè)機(jī)構(gòu)和開源商業(yè)社區(qū)的第三方類庫來幫助實現(xiàn)各種各樣的功能[1]。Java的這些優(yōu)勢大大提升了程序的開發(fā)效率,同時也給開發(fā)者帶來了一個煩惱,Java的跨平臺特性使得Java源代碼被編譯為一種中間代碼——字節(jié)碼,字節(jié)碼可以較容易地被反編譯為可讀性很高的源代碼。無論采用何種形式的代碼混淆和自定義Classloader,只要依據(jù)Java虛擬機(jī)規(guī)范[2]對加密后的字節(jié)碼文件進(jìn)行文件格式比對和邏輯分析很容易獲取軟件源碼,使軟件的安全和知識產(chǎn)權(quán)難以保護(hù)。采用加密狗將部分軟件核心算法分離至硬件的方式能有效的提高程序的安全性,但會增加硬件成本并占用本地接口資源且不便于遠(yuǎn)程部署。本文提出一種解決方案,基于開源Hotspot虛擬機(jī),通過定制虛擬機(jī)、加密字節(jié)碼文件和修改類的生命周期3種方式來提高對Java源碼的保護(hù),將傳統(tǒng)對Java軟件加密的思路由字節(jié)碼文件拓展到虛擬機(jī)內(nèi)部,使逆向工程難度由反編譯字節(jié)碼提高至對二進(jìn)制文件的破解,顯著提升了軟件的安全性。

      1 字節(jié)碼文件格式、類生命周期及傳統(tǒng)軟件保護(hù)方法

      Java源碼編譯后生成的字節(jié)碼文件具有非常好的跨平臺特性,該特性正是基于字節(jié)碼文件格式遵循Java虛擬機(jī)規(guī)范,可以由任意平臺下的虛擬機(jī)解釋運行。

      1.1 字節(jié)碼文件結(jié)構(gòu)

      根據(jù)Java虛擬機(jī)規(guī)范[2]規(guī)定,字節(jié)碼文件結(jié)構(gòu)體如表1所示, 其中 u2為 unsigned short,u4為 unsigned long,cp_info是常量池的指針數(shù)組,指針數(shù)組個數(shù)為onstant_pool_count,結(jié)構(gòu)體cp_info為:

      struct cp_info

      {

      u1 tag;//常數(shù)表數(shù)據(jù)類型

      u1*info;//常數(shù)表數(shù)據(jù)

      }[3]

      1.2 類文件的虛擬機(jī)加載機(jī)制

      類從被加載到虛擬機(jī)內(nèi)存中開始,到卸載出內(nèi)存為止,它的整個生命周期包括:加載、驗證、準(zhǔn)備、解析、初始化、使用和卸載7個階段。其中驗證、準(zhǔn)備和解析三個部分統(tǒng)稱為連接,這7個階段的發(fā)生順序如圖1所示[1]。

      字節(jié)碼文件被加載到虛擬機(jī)后通過一個類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流,然后將該字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu),最后在Java堆中生成一個代表這個類的java.lang.class對象,作為方法區(qū)訪問這些數(shù)據(jù)的入口[4]。

      在驗證階段,虛擬機(jī)主要校驗字節(jié)碼文件的文件格式、元數(shù)據(jù)、字節(jié)碼和符號引用。在文件格式驗證中,首先驗證是否以魔數(shù)0xCAFEBABE開頭,主次版本號是否在當(dāng)前虛擬機(jī)的處理范圍內(nèi),常量池的常量中是否存在不被支持的常量類型(檢查常量的Tag標(biāo)志)。指向常量的各種索引值中是否指向不存在的常量或不符合UTF8編碼的數(shù)據(jù),字節(jié)碼文件中各個部分及文件本身是否有被刪除的或附加的其他信息等。在經(jīng)過了文件格式驗證之后,字節(jié)流才會被存儲于內(nèi)存的方法區(qū)中[5]。其余三個驗證階段全部是基于方法區(qū)的存儲結(jié)構(gòu)進(jìn)行的。元數(shù)據(jù)驗證主要驗證這個類是否存在父類、抽象類、接口等;字節(jié)碼驗證主要驗證類的方法體是否堆棧超界;符號引用驗證主要對自身以外的信息進(jìn)行匹配性校驗,如:全限定名是否存在,類、字段和方法的訪問性等信息[6]。

      表1 字節(jié)碼文件數(shù)據(jù)結(jié)構(gòu)Tab.1 The structure and format of bytecode file

      圖1 類的生命周期Fig.1 The lifetime of class

      1.3 傳統(tǒng)Java軟件保護(hù)方法

      傳統(tǒng)的軟件保護(hù)方法主要有:本地化技術(shù)、遠(yuǎn)程接口訪問技術(shù)、軟件數(shù)字水印技術(shù)以及混淆技術(shù)等方式進(jìn)行加密[7]。

      本地化技術(shù)可以有效的將軟件由中間代碼轉(zhuǎn)換為二進(jìn)制代碼,提高了對軟件的保護(hù)強(qiáng)度,但是失去了跨平臺性且無法應(yīng)用于B/S模式。

      遠(yuǎn)程接口訪問技術(shù)由于實現(xiàn)了代碼的隔離起到了保護(hù)的作用,這種模式只適用于B/S模式,對單機(jī)應(yīng)用軟件不適用。

      靜態(tài)軟件數(shù)字水印技術(shù)健壯性較差,動態(tài)軟件數(shù)字水印算法具有較好的健壯性,但是它只能保護(hù)整個應(yīng)用程序,而不能保護(hù)某一部分特定的代碼,同時,動態(tài)軟件數(shù)字水印的檢測方式令它的某些應(yīng)用受到限制。目前的水印算法在提供可靠的版權(quán)證明方面或多或少都有一些尚不完善的地方[8]。

      混淆技術(shù)可以很大程度上破壞反編譯代碼的可讀性,增加逆向工程的難度,而且該難度只是增加了逆向工程的時間量而非技術(shù)難度。

      2 定制Java虛擬機(jī)

      編譯生成的或通過不同方式加密后的字節(jié)碼文件必須嚴(yán)格遵循Java虛擬機(jī)規(guī)范[2],否則程序在官方虛擬機(jī)下無法正確識別并運行。逆向工程正是依照該規(guī)范將傳統(tǒng)軟件保護(hù)方式保護(hù)后的字節(jié)碼文件成功反編譯。通過定制Java虛擬機(jī)和修改虛擬機(jī)規(guī)范中的數(shù)據(jù)結(jié)構(gòu),由Java源碼編譯的字節(jié)碼文件遵循定制虛擬機(jī)規(guī)范和數(shù)據(jù)結(jié)構(gòu),逆向工程由于無法獲悉Class遵循的虛擬機(jī)規(guī)范和數(shù)據(jù)結(jié)構(gòu)無法對文件反編譯,有效的保護(hù)軟件。

      定制Java虛擬機(jī)主要通過在官方虛擬機(jī)Hotspot的內(nèi)部添加文件解密算法、硬件授權(quán)檢測算法及對規(guī)范內(nèi)的常量池Tag值進(jìn)行重新排序和賦值。

      2.1 運行環(huán)境硬件授權(quán)驗證

      虛擬機(jī)加載字節(jié)碼文件前,首先檢驗程序運行環(huán)境是否經(jīng)過授權(quán)。若經(jīng)過授權(quán)則正式開始進(jìn)入類的生命周期,否則退出程序并提示未經(jīng)授權(quán)信息。

      對運行環(huán)境的授權(quán)通過讀取本地指定目錄下的授權(quán)文件和本地硬件機(jī)器碼,將機(jī)器碼與自定義字符串組合后的值經(jīng)MD5算法加密并與授權(quán)文件的授權(quán)碼比對 (如圖2所示)。由于MD5算法不可逆且與硬件碼組合的字符串隨機(jī),使得授權(quán)碼具有唯一性,保證軟件只能在授權(quán)的電腦上正常運行[9]。

      每次加載字節(jié)碼文件的硬件授權(quán)驗證會降低虛擬機(jī)的運行效率,通過在虛擬機(jī)中設(shè)置獨立的全局變量,標(biāo)識該運行環(huán)境是否經(jīng)過授權(quán),同時開啟后臺線程,不定時檢測本機(jī)硬件是否授權(quán),從而在保證硬件授權(quán)驗證的同時,兼顧虛擬機(jī)的運行效率。

      圖2 授權(quán)驗證流程Fig.2 Authorization verification process

      2.2 自定義常量Tag值

      Java虛擬機(jī)規(guī)范[2]中的常量池中常量的數(shù)據(jù)結(jié)構(gòu)如表2所示。

      表2 常量池內(nèi)常量的數(shù)據(jù)結(jié)構(gòu)Tab.2 Structure of the constant

      逆向工程根據(jù)常量池內(nèi)常量的Tag值確認(rèn)常量的數(shù)據(jù)結(jié)構(gòu),字節(jié)碼文件其余數(shù)據(jù)結(jié)構(gòu)基于不同常量值,依照虛擬機(jī)規(guī)范進(jìn)而推測出Java源碼[10]。本方法通過對常量池內(nèi)所有Tag值重新排列,達(dá)到逆向工程無法按照官方Java虛擬機(jī)規(guī)范中的Tag列表正確識別常量所代表的數(shù)據(jù)結(jié)構(gòu),完成對常量池的加密。由于無法獲取常量池內(nèi)所有的常量值和索引信息,對字節(jié)碼文件的剩余數(shù)據(jù)便無法正確識別。

      對常量池中Tag值的重新設(shè)置,不會影響虛擬機(jī)的運行效率。對軟件的分發(fā)采用定制專用虛擬機(jī)的方式,即每套軟件只能在授權(quán)方提供的指定且唯一的虛擬機(jī)下運行。對逆向工程而言同一套軟件的不同分發(fā)版中同一類型的常量Tag值并不相同,無法獲取隨機(jī)排序的規(guī)律性,有效的保護(hù)了軟件源碼。

      2.3 加密字節(jié)碼文件

      對常量池中常量的Tag值替換可以避免對常量的識別,但對字節(jié)碼文件中其余的數(shù)據(jù)機(jī)構(gòu)卻無法保護(hù)。因此對字節(jié)碼文件中的不同數(shù)據(jù)結(jié)構(gòu)采用整體加密方式,將字節(jié)碼文件的數(shù)據(jù)經(jīng)過算法變換后全部不再符合虛擬機(jī)規(guī)范。這樣可以避免對字節(jié)碼文件中其余數(shù)據(jù)結(jié)構(gòu)的反編譯。由于在虛擬機(jī)內(nèi)部對加密后的數(shù)據(jù)解密需要耗費一定的時間,加密算法采用運算量最低的數(shù)字替換法。將字節(jié)碼文件中十六進(jìn)制字節(jié)數(shù)據(jù)重新映射為新的十六進(jìn)制數(shù)據(jù),虛擬機(jī)加載字節(jié)碼文件識別到加密標(biāo)識后,按照加密的映射關(guān)系進(jìn)行解密。

      原始字節(jié)碼文件格式如圖3所示[11],加密后的字節(jié)碼文件格式如圖4所示,加密后的數(shù)據(jù)結(jié)構(gòu)如表3所示。

      圖3 加密前的字節(jié)碼文件結(jié)構(gòu)Fig.3 Structure of bytecode file before encryption

      圖4 加密后的字節(jié)碼文件結(jié)構(gòu)Fig.4 Structure of bytecode file after encryption

      該Tag值區(qū)別于常規(guī)字節(jié)碼文件的Tag值,Length表示加密后的數(shù)據(jù)長度,Data為加密后的字節(jié)流數(shù)據(jù),如表3所示。

      表3 加密后的數(shù)據(jù)結(jié)構(gòu)Tab.3 The encrypted data structures

      2.4 定制虛擬機(jī)使用與傳統(tǒng)加密方法對比

      以上3種虛擬機(jī)的定制方法,全部使用可增強(qiáng)對軟件的保護(hù)效果,但會帶來軟件運行效率的降低,單獨或組合使用可在保證軟件運行效率的前提下增強(qiáng)對軟件的保護(hù)效果。

      不同定制方法的使用及優(yōu)缺點如表4所示。

      表4 不同保護(hù)方式優(yōu)缺點Tab.4 Different advantages and disadvantages of protection

      定制虛擬機(jī)可以保證在不同平臺下運行B/S和C/S模式的Java程序,從根源上解決代碼混淆易被反編譯的問題。定制虛擬機(jī)與傳統(tǒng)保護(hù)方法特性對比如表5所示。

      3 結(jié)束語

      文中提出基于Hotspot虛擬機(jī)的Java軟件加密方案,通過在定制虛擬機(jī)完成對運行環(huán)境硬件授權(quán)驗證、修改常量池內(nèi)常量Tag值混淆字節(jié)碼數(shù)據(jù)格式和加密字節(jié)碼文件等方式來保護(hù)Java程序。加密后的程序只有在軟件授權(quán)后和定制虛擬機(jī)下才可以正確運行。對字節(jié)碼的解密過程在虛擬機(jī)內(nèi)部,只有破解了虛擬機(jī)內(nèi)部的解密算法才可以對軟件進(jìn)行反編譯,大大增加了軟件破解的難度。本方案的不足之處在于,虛擬機(jī)內(nèi)部大量對字節(jié)碼的解密過程會延長系統(tǒng)啟動和運行時間,增加系統(tǒng)開銷,如何優(yōu)化方案來降低虛擬機(jī)系統(tǒng)開銷需要在以后的工作中進(jìn)一步研究。

      表5 特性對比Tab.5 Comparison of characteristics

      [1]周志明.深入理解Java虛擬機(jī)[M].北京:機(jī)械工業(yè)出版社.2011.

      [2]Venners B.Inside the Java 2 Virtual Machine[M].(Second Edition).McGraw-Hill Companies,2000.

      [3]Lindholm T,Yellin n,Bracha G,et al.The Java Virtual Machine Specification[M].(Second Edition).Addison-Wesley Professional,1999.

      [4]James G,Guy S,Gilad B.The Java Language Specification[M].(Third Edition).ADDISON-WESLEY,2000.

      [5]左天軍,朱智林,韓俊剛,等.Java動態(tài)類加載分析[J].計算機(jī)科學(xué),2005:194-196.ZUO Tian-jun,ZHU Zhi-lin,HAN Jun-gang,et al.The analysis of Java dynamic class loading[J].Computer science,2005:194-196.

      [6]Hirt M,Lagergren M.Orocal JRockit The Definitive[M].Guide.Packt Publishing,2010.

      [7]看雪.加密與解密——軟件保護(hù)技術(shù)及完全解決方案[M].北京:電子工業(yè)出版社,2001.

      [8]吳強(qiáng).加密與解密[M].北京:企業(yè)管理出版社,2009.

      [9]DouglasR.Stinson.密碼學(xué)原理與實踐[M].北京:電子工業(yè)出版社,2003.

      [10]Muchnick S S.Advanced Compiler Design and Implemen tation[M].Elserier Science,2003.

      [11]Biham E,Shamir A.Differential cryptanalysis of the data encryption standard[M].Berlin:Springer-Verlag,1993.

      猜你喜歡
      常量數(shù)據(jù)結(jié)構(gòu)解密
      解密“熱脹冷縮”
      科學(xué)照亮世界
      ——卡文迪什測定萬有引力常量
      解密“一包三改”
      少先隊活動(2020年9期)2020-12-17 06:17:31
      炫詞解密
      “翻轉(zhuǎn)課堂”教學(xué)模式的探討——以《數(shù)據(jù)結(jié)構(gòu)》課程教學(xué)為例
      高職高專數(shù)據(jù)結(jié)構(gòu)教學(xué)改革探討
      中國市場(2016年45期)2016-05-17 05:15:48
      低氧低分壓環(huán)境下泡塑吸附火焰原子吸收光譜法測定常量金
      西藏科技(2015年1期)2015-09-26 12:09:20
      解密“大調(diào)解”
      TRIZ理論在“數(shù)據(jù)結(jié)構(gòu)”多媒體教學(xué)中的應(yīng)用
      《數(shù)據(jù)結(jié)構(gòu)》教學(xué)方法創(chuàng)新探討
      河南科技(2014年5期)2014-02-27 14:08:57
      黄陵县| 青河县| 罗甸县| 浏阳市| 海南省| 安福县| 宽城| 明溪县| 双辽市| 盐山县| 临沭县| 鹿泉市| 泰安市| 连江县| 镇远县| 望奎县| 循化| 博爱县| 苍南县| 牟定县| 三江| 天峻县| 无为县| 布尔津县| 汾西县| 东乌| 卓资县| 大港区| 义马市| 温泉县| 呼伦贝尔市| 卓尼县| 手游| 荣昌县| 云阳县| 汾西县| 海晏县| 瓮安县| 汝城县| 镇平县| 平顺县|