尹艷陽(yáng),任洪敏
(上海海事大學(xué)信息工程學(xué)院,上海 201306)
Java軟件保護(hù)機(jī)制的研究與實(shí)現(xiàn)
尹艷陽(yáng),任洪敏
(上海海事大學(xué)信息工程學(xué)院,上海 201306)
軟件保護(hù)是一個(gè)困擾軟件行業(yè)開發(fā)者的問(wèn)題,特別是在當(dāng)今互聯(lián)網(wǎng)飛速發(fā)展且強(qiáng)調(diào)知識(shí)產(chǎn)權(quán)的時(shí)代,更應(yīng)該引起業(yè)界的足夠重視。Java語(yǔ)言以其“一次編譯,到處運(yùn)行”等眾多優(yōu)點(diǎn)占據(jù)著編程語(yǔ)言排行榜第一的位置。但是天生的特性使其非常容易通過(guò)各類反編譯軟件反編譯得到源代碼,致使Java軟件安全面臨著巨大危險(xiǎn)。因而提出Java軟件序列號(hào)方式實(shí)現(xiàn)授權(quán),對(duì)序列號(hào)和Java類文件分別加密,在自定義加載類中解碼編譯,并用混淆器做代碼混淆。結(jié)果表明Java軟件無(wú)任何異常同時(shí)實(shí)現(xiàn)保護(hù)作用。
軟件保護(hù);類文件;自定義加載類;代碼混淆
軟件的開發(fā)需要大量的人力、智力和財(cái)力的投入,是由一個(gè)人或團(tuán)隊(duì)協(xié)作完成的高強(qiáng)度腦力勞動(dòng)的結(jié)晶,是以知識(shí)、經(jīng)驗(yàn)和智慧為基礎(chǔ)具有創(chuàng)造性的產(chǎn)物。與有形財(cái)產(chǎn)一樣,也應(yīng)受到保護(hù),以提高開發(fā)者積極性和創(chuàng)造力,促進(jìn)軟件行業(yè)發(fā)展。但它同一般物質(zhì)性商品有明顯的差別,軟件產(chǎn)品的復(fù)制(批量生產(chǎn))是極其簡(jiǎn)單的,其復(fù)制成本同其開發(fā)成本相比較,幾乎可以忽略不計(jì)。
Java語(yǔ)言在知識(shí)產(chǎn)權(quán)保護(hù)方面有著天然的劣勢(shì),Java代碼經(jīng)過(guò)編譯后產(chǎn)生字節(jié)碼,但是字節(jié)碼能夠通過(guò)反編譯從而獲得到軟件源代碼的,從而來(lái)推導(dǎo)出軟件產(chǎn)品所使用的思路、結(jié)構(gòu)、算法、原理、運(yùn)行方法、處理過(guò)程等具有知識(shí)產(chǎn)權(quán)的設(shè)計(jì)要素,這樣就使Java軟件的安全和知識(shí)產(chǎn)權(quán)受到嚴(yán)重威脅。
目前已經(jīng)有多種技術(shù)方法來(lái)限制反編譯或者提升反編譯的難度。本地編譯技術(shù)是把 Java程序編譯成為能夠在特定計(jì)算機(jī)上運(yùn)行的應(yīng)用程序。編譯后產(chǎn)生的是本地可執(zhí)行的二進(jìn)制文件,使得用戶無(wú)法通過(guò)反編譯獲得源代碼,但此方法破壞了Java語(yǔ)言的可移植性。數(shù)字水印是在軟件產(chǎn)品中嵌入的標(biāo)識(shí)信號(hào),數(shù)字不破壞軟件的使用價(jià)值和使用體驗(yàn)。但是水印技術(shù)不是從本質(zhì)上解決反編譯問(wèn)題,只是提供了有反編譯行為時(shí)的證據(jù)。代碼混淆(Obfuscated code)也稱之為花指令,是保持軟件程序功能等價(jià)的基礎(chǔ)上對(duì)源代碼做復(fù)雜的再組織和加工,令閱讀和理解代碼增加難度。
在Java軟件保護(hù)方面,本文提出Java軟件以序列號(hào)方式授權(quán),用戶必須擁有合法身份使用軟件,對(duì)于非法用戶有排斥和懲治措施。以及對(duì)Java class文件加密,動(dòng)態(tài)解密。該方案的主要思想是:由程序獲得運(yùn)行計(jì)算機(jī)唯一標(biāo)識(shí)MAC地址,對(duì)唯一標(biāo)識(shí)做RSA公鑰加密作為軟件序列號(hào)。同時(shí)對(duì)選擇的類文件加密,然后在類文件被加載調(diào)用時(shí)對(duì)其進(jìn)行解密,在動(dòng)態(tài)解密過(guò)程中隨機(jī)對(duì)序列號(hào)進(jìn)行檢測(cè),從而實(shí)現(xiàn)對(duì) Java源代碼的保護(hù)。然后對(duì)加載類和部分代碼做混淆。
2.1 Java軟件序列號(hào)授權(quán)設(shè)計(jì)
本文提出的Java軟件保護(hù)機(jī)制的序列號(hào)方式授權(quán)的主要思路過(guò)程可以分為如下步驟:①將程序獲得運(yùn)行機(jī)的唯一標(biāo)識(shí)MAC地址以及用戶提交用戶信息交由開發(fā)者;②開發(fā)者對(duì)計(jì)算機(jī)唯一標(biāo)識(shí)和用戶信息進(jìn)行處理,做加密作為軟件序列號(hào),然后將軟件的序列號(hào)發(fā)送給用戶;③用戶輸入軟件序列號(hào)并保存在軟件配置文件中,由本地程序判斷序列號(hào)的合法性,檢查用戶是否為合法身份。Java軟件序列號(hào)授權(quán)過(guò)程整體流程如圖1所示。
圖1
2.2 class文件加密設(shè)計(jì)
(1)加密類文件
利用 Java Security包中加密擴(kuò)展接口結(jié)合 RSA加密算法來(lái)對(duì) Java應(yīng)用程序里關(guān)鍵核心類文件和數(shù)據(jù)進(jìn)行加密。加密后class文件不再是符合規(guī)則的字節(jié)碼文件,而是變成反編譯器無(wú)法打開的亂碼文件,那么意味著反編譯器為首的逆向工程工具無(wú)法從加密后的Java class文件中獲得任何受保護(hù)的信息。整體思路如圖2所示。
圖2
(2)自定義加載器
類加載器 Classloader是Java運(yùn)行環(huán)境的一部分,負(fù)責(zé)把Java類動(dòng)態(tài)加載到Java虛擬機(jī)的內(nèi)存里。每一個(gè)Java類必須由某個(gè)類加載器裝入到內(nèi)存中。Java虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)內(nèi)有三個(gè)默認(rèn)的類加載器,形成類加載器層次:Bootstrap ClassLoader是用本地代碼實(shí)現(xiàn)的,它負(fù)責(zé)加載Java核心庫(kù) (存儲(chǔ)在 圖3 在Java軟件開始運(yùn)行時(shí),Java虛擬機(jī)將自定義的類加載器載入JVM內(nèi)存中。在自定義ClassLoader中調(diào)用findClass方法實(shí)現(xiàn)父親委托。所謂的父親委托機(jī)制就是自定義加載器委托父加載器(Common)加載Class,Common委托System加載器,System委托BootStrap,如果BootStrap不能加載,則讓Sys加載,逐級(jí)下發(fā),如果直到自定義 ClassLoader還不能加載 Class這拋出ClassNotFindException。委托機(jī)制被提出的最初原因是為安全性考慮的,為了確保Object等重要類只可由JVM加載。要特別說(shuō)明的是加載器之間的父子關(guān)系與類之間的繼承關(guān)系不是同一概念,指的是加載器彼此的包裝關(guān)系。在本方案中,自定義的類加載器通過(guò)讀取配置文件中的參數(shù),實(shí)現(xiàn)查找辨別完成解密處理后完成類文件的加載。請(qǐng)求加載過(guò)程如圖 4所示。 2.3 混淆設(shè)計(jì) Java Obfuscator的原理就是將字節(jié)碼轉(zhuǎn)換為一個(gè)邏輯上的對(duì)等物,這種轉(zhuǎn)換后的版本極難拆散。即使有人試圖去反編譯,過(guò)程將極其艱難復(fù)雜,并很難繞過(guò)轉(zhuǎn)換后模糊晦澀的編碼。主要的過(guò)程如下: 用一個(gè)常規(guī)編譯器(例如JDK)編譯Java源代碼運(yùn)行混淆器,在受保護(hù)的環(huán)境下生成編譯類文件。最后生成的會(huì)是一個(gè)不同的輸出文檔,也許擴(kuò)展名也會(huì)不同。這個(gè)被重命名為.class file的文件在功能上與原字節(jié)碼是對(duì)等的,由于虛擬機(jī)仍然可以對(duì)其進(jìn)行解譯,因此對(duì)功能不會(huì)產(chǎn)生影響。 圖4 3.1 Java軟件序列號(hào)的生成 將程序獲得的計(jì)算機(jī)唯一標(biāo)識(shí),用戶提交的用戶信息,提交注冊(cè)時(shí)間戳,隨即字符串做為Java軟件序列號(hào)生成的參數(shù),通過(guò)處理得到序列號(hào)。如式(1)。 在檢查序列號(hào)正確性時(shí),對(duì)用戶輸入的序列號(hào)做MD5加密與用戶名判斷是否為特定值,同時(shí)與MAC、用戶信息做對(duì)比,如果身份合法則調(diào)用裝載器將軟件加密部分做解密處理裝入內(nèi)存,初始化JVM虛擬機(jī)環(huán)境并運(yùn)行Java軟件,否則終止退出。如式(2): 3.2 自定義加載類的實(shí)現(xiàn) 使用自定義的類加載器 ClassLoader:在自定義ClassLoader中調(diào)用findClass()方法判斷類是否己經(jīng)是需要解密的類文件,如果是普通未被做加密處理的類文件,則交給父類Webapp加載類的findClass()方法負(fù)責(zé)加載;否則由自定義加載器調(diào) findClassEncrypt()方法來(lái)載入className,這樣被 className直接或間接引用的Java類都將由自定義加載類DeryptClassLoader載入。自定義加載類調(diào)入方法核心代碼如下所示: 自定義加載類調(diào)入過(guò)程詳細(xì)說(shuō)明: (1)判斷此Class有沒(méi)有載入過(guò)(即在cache中是否有此Class),如果有到(8),如果沒(méi)有到(2)。 (2)如果parent classloader不存在(沒(méi)有parent,那parent一定是bootstrap classloader了),到(4);如果存在,到(3)。 (3)請(qǐng)求parent classloader載入,如果成功到(8),不成功到(5)。 (4)請(qǐng)求JVM從bootstrap classloader中載入,如果成功到(8)。 (5)查找Class文件(在和該classloader有關(guān)的類路徑中查找)。找到了到(6),如果找不到則到(7)。 (6)從文件中載入Class,到(8)。 (7)拋出ClassNotFoundException。 (8)返回Class. 在 Java軟件加載自定義加載類和對(duì)加密后的class文件進(jìn)行解密的過(guò)程中,添加一個(gè)隨機(jī)調(diào)用序列號(hào)判斷方法,概率控制在10%,該方法用于進(jìn)行檢測(cè)用戶身份合法性,對(duì)于非法用戶有排斥和懲治措施。 3.3 代碼混淆的實(shí)現(xiàn) 使用Zelix KlassMaster混淆器,它是一款用Java寫的實(shí)用工具,能讀取和修改Java類文件。該工具綜合了控制流模糊處理和異常模糊處理技術(shù),對(duì)Java字節(jié)碼文件進(jìn)行混淆處理。含有對(duì)字符串加密技術(shù),加密后的字符串存儲(chǔ)在常量池中。同時(shí)它提供了命名混淆功能,以降低項(xiàng)目包、類、字段、方法名稱字節(jié)碼大小。下圖為例子HelloWorld混淆之后代碼。 圖5 運(yùn)行class文件加密程序,選擇要加密的class文件。運(yùn)行效果圖6: 圖6 用加密過(guò)的class文件替換掉原未被加密的class文件 將自定義的加載器打成jar包放在lib文件夾中。并在context.xml里 用JD-GUI等反編譯軟件測(cè)試反編譯加密后的class文件結(jié)果無(wú)法打開。 測(cè)試在class文件加密后,項(xiàng)目依然可以正常運(yùn)行。加密后的字節(jié)碼文件對(duì)比如圖。 圖7 圖8 由于class文件的加密,在加載時(shí)有解密的過(guò)程,必然會(huì)消耗一些時(shí)間,降低一點(diǎn)運(yùn)行效率。實(shí)驗(yàn)用了幾組不同大小的class文件做測(cè)試性能分析,發(fā)現(xiàn)系統(tǒng)執(zhí)行效率與加密的class文件大小存在線性關(guān)系。 任何的軟件保護(hù)都并不是無(wú)法攻克的城池,但作為保護(hù)軟件安全和知識(shí)產(chǎn)權(quán)的最后一道關(guān)卡,要盡可能地阻止和增加破解的代價(jià)。本文主要研究了一套Java軟件的保護(hù)方案,實(shí)現(xiàn)了在不影響Java軟件正常運(yùn)行的情況下完成了對(duì)Java軟件的保護(hù)。通過(guò)Java軟件序列號(hào)方式實(shí)現(xiàn)授權(quán)。以兩種加密方式對(duì)序列號(hào)和Java類文件分別加密,在自定義加載類中解碼編譯。用Java混淆器做代碼混淆。詳解了部署過(guò)程和方法,對(duì)測(cè)試結(jié)果做了判斷分析,證明該方案起到了保護(hù)作用。 [1]Eckel B.Java編程思想[M].機(jī)械工業(yè)出版社,2007 [2]SHorstmann G,Cornell G.Java核心技術(shù) 卷II:高級(jí)特性[M].機(jī)械工業(yè)出版社,2008. [3]探矽工作室.深入嵌入式Java虛擬機(jī)[M].中國(guó)鐵道出版社,2003. [4]梁棟.Java加密與解密的藝術(shù)[M].機(jī)械工業(yè)出版社,2010 [5]周志明.深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐[M].機(jī)械工業(yè)出版社,2011 [6]Herbert Schildt著.Java:The Complete Reference.張良華等譯.電子工業(yè)出版社,2008 [7]Jason Brittain著.Tomcat權(quán)威指南.O’Reilly Taiwan譯.中國(guó)電力出版社,2004 [8]Alex Kalinovsky.透視Java-反編譯、修補(bǔ)和逆向工程技術(shù)[M].清華大學(xué)出版社,2005 [9]Joshua Bloch.《Effective Java中文版》第二版 [M].機(jī)械工業(yè)出版社,2009 Software Protection;Class Files;Custom ClassLoader;Code Obfuscation Research and Implement of Java Software Protection Mechanism YIN Yan-yang,Ren Hong-min Software protection is a troubled developer of software industry,particularly the rapid development of the Internet in today's era of intellectual property rights and stressed,should arouse enough attention to the industry.Java language with its"compile once,run anywhere" and many other advantages list of programming languages occupy the first position.However,the natural features make it very easy to decompile the source code through various decompile software,resulting Java software security is facing great danger.Therefore,proposes ways Java software serial number authorization for serial numbers and Java class files are encrypted,in a custom compiled loaded class decoding,and code obfuscation to do with confusion.The results show no protective effect of Java software while achieving the exception. 1007-1423(2016)19-0027-05 10.3969/j.issn.1007-1423.2016.19.008 尹艷陽(yáng)(1990-),男,吉林梅河口人,碩士,研究方向?yàn)檐浖_發(fā)方法與軟件管理 任洪敏 (1969-),男,上海人,博士,副教授,研究方向?yàn)檐浖w系結(jié)構(gòu)、構(gòu)件技術(shù)、軟件復(fù)用、過(guò)程工程、軟件項(xiàng)目管理 2016-05-04 2016-06-303 Java軟件保護(hù)的實(shí)現(xiàn)
4 Java軟件保護(hù)部署及測(cè)試
5 結(jié)語(yǔ)
(College of Information Engineering,Shanghai Maritime University,Shanghai 201306)