天津工業(yè)大學(xué)計(jì)算機(jī)科學(xué)與軟件學(xué)院 李夢濤
在Java的編譯過程中不將變量和方法等符號的引用轉(zhuǎn)換為數(shù)值引用,也不確定程序執(zhí)行過程中的內(nèi)存狀態(tài),只是將這些符號的引用信息保留在類文件中,由解釋器在運(yùn)行過程中創(chuàng)建內(nèi)存布局,然后再通過查找表來確定一個變量或方法所在的地址。Java源代碼不像C/C++源代碼一樣被編譯成二進(jìn)制機(jī)器碼,編譯Java源代碼會生成中間字節(jié)碼,是一種與平臺無關(guān)的源代碼的表示方式。字節(jié)碼在加載后可以被解釋或編譯,這就產(chǎn)生了高級編程語言到底層機(jī)器代碼之間的兩步變換。是這一中間步驟使得反編譯Java字節(jié)碼得到的源代碼近乎完美。字節(jié)碼攜帶了在源文件中可以找到的所有重要信息。盡管注釋和格式丟失了,但所有的方法、變量和編程邏輯都完好的保留下來,由于字節(jié)碼不表示最底層機(jī)器語言,因此代碼的格式非常類似于源代碼。
Java類文件不是真正的二進(jìn)制文件,而是一種有格式的中間代碼,這就給反編譯Java類文件提供了可能。反編譯得出的代碼具有很高的質(zhì)量,基本上可以完全反映編寫者的思路,這樣一來,軟件開發(fā)商和軟件開發(fā)人員投入大量精力和艱苦努力編寫的源代碼就很容易被黑客竊取,軟件中包含的重要算法也會泄露出去。因此Java應(yīng)用程序也就毫無保密性可言,Java軟件在知識產(chǎn)權(quán)的保護(hù)上面臨著很大的安全風(fēng)險(xiǎn)。
目前的Java軟件的保護(hù)方法大多是基于單機(jī)應(yīng)用的研究,傳統(tǒng)的Java軟件保護(hù)方法主要有本地化技術(shù)、遠(yuǎn)程接口訪問技術(shù)、軟件數(shù)字水印技術(shù)以及混淆技術(shù),其中軟件數(shù)字水印技術(shù)和混淆技術(shù)是目前研究、應(yīng)用較多,受到廣泛關(guān)注的技術(shù)。
Java本地化,是指通過將Java應(yīng)用程序編譯成本地應(yīng)用程序來達(dá)到增加反編譯的難度,實(shí)現(xiàn)軟件保護(hù)的方法。實(shí)現(xiàn)步驟如下:首先編寫Java源代碼,然后通過Java編譯器將Java源代碼編譯成Java類文件,最后使用本地編譯工具將Java類文件編譯成二進(jìn)制的本機(jī)應(yīng)用程序。本地化技術(shù)雖然能夠很好的保護(hù)Java類文件,使其達(dá)到與傳統(tǒng)的用C/C++等語言開發(fā)的軟件一樣的安全強(qiáng)度,但也存在一些問題:本地化技術(shù)能夠?yàn)檩^簡單的單戶機(jī)應(yīng)用軟件提供較高水平的保護(hù),其反編譯的難度與傳統(tǒng)的C/C++開發(fā)的軟件相同,但還無法對復(fù)雜的應(yīng)用軟件提供全面的保護(hù),也無法保護(hù)B/S結(jié)構(gòu)的應(yīng)用軟件,此外,要準(zhǔn)確的診斷和定位本機(jī)編譯產(chǎn)生的Java應(yīng)用程序中出現(xiàn)的問題也是十分困難。雖然目前發(fā)展還很不成熟,但卻是Java領(lǐng)域一項(xiàng)廣受關(guān)注的技術(shù)。實(shí)踐和理論己經(jīng)證明,對于某些應(yīng)用軟件和使用環(huán)境,本地化技術(shù)不失為一種優(yōu)秀的解決方案。
分布式結(jié)構(gòu)是現(xiàn)代軟件開發(fā)中廣泛采用的一種體系結(jié)構(gòu),通常將軟件分為客戶端和服務(wù)器端,核心的功能模塊和業(yè)務(wù)流程都部署在服務(wù)器端為客戶端提供服務(wù),客戶端負(fù)責(zé)采集數(shù)據(jù)、提交服務(wù)請求和與服務(wù)器端通信,這種體系結(jié)構(gòu)的采用可以提高系統(tǒng)的可移植性和互操作性,大幅度降低軟件的開發(fā)成本。遠(yuǎn)程接口訪問技術(shù)能有效地保護(hù)關(guān)鍵的Java類文件,從而達(dá)到軟件保護(hù)的目的。但是這種方式也存在著明顯的局限性和很大的安全隱患:遠(yuǎn)程接口訪問技術(shù)實(shí)際上是將保護(hù)的焦點(diǎn)從關(guān)鍵的類文件轉(zhuǎn)移到了應(yīng)用服務(wù)器上。在這種體系結(jié)構(gòu)下,制定完善的安全機(jī)制來保護(hù)端口至關(guān)重要,因?yàn)槿绻麘?yīng)用服務(wù)器被攻破,那么所有部署在服務(wù)器上的服務(wù)模塊和類文件就完全暴露在攻擊者面前,后果不堪設(shè)想。
軟件數(shù)字水印是眾多數(shù)字水印的一種,它的主要保護(hù)對象是計(jì)算機(jī)代碼,包括源代碼和機(jī)器碼。使得它們免于或者減少遭受非法復(fù)制和非法篡改的危險(xiǎn),由于計(jì)算機(jī)代碼是不能容忍任何錯誤的,因此一些傳統(tǒng)的利用可允許錯誤范圍內(nèi)修改計(jì)算機(jī)程序從而嵌入水印的方法將不適用于計(jì)算機(jī)軟件。軟件數(shù)字水印技術(shù)也存在一些不足,比如:需要插入額外的代碼,需要仔細(xì)地編寫函數(shù)及其調(diào)用,否則容易被有經(jīng)驗(yàn)的反編譯者識破,從而擦除水印。另外,靜態(tài)軟件數(shù)字水印算法的健壯性相對較差,而動態(tài)軟件數(shù)字水印算法雖然具有很好的健壯性,但是它只能保護(hù)整個應(yīng)用程序,而不能保護(hù)某一部分特定的代碼,同時,動態(tài)軟件數(shù)字水印的檢測方式令它的某些應(yīng)用受到限制。目前的水印算法在提供可靠的版權(quán)證明方面或多或少都有一些的尚不完善的地方,因此尋找能提供完全可靠版權(quán)保護(hù)的軟件數(shù)字水印算法成為一個重要的課題。軟件數(shù)字水印的用途主要有以下幾個方面:作為侵犯知識產(chǎn)權(quán)的證據(jù);發(fā)現(xiàn)被剽竊的程序;追蹤非法拷貝的源頭。
代碼混淆技術(shù)是目前比較成熟和流行的一種軟件保護(hù)技術(shù)。代碼混淆技術(shù)是對類文件進(jìn)行代碼語義、程序流程和邏輯結(jié)構(gòu)的重新組織,代碼混淆并不能增加反編譯的難度,使用反編譯器仍然可以對混淆后的類文件進(jìn)行反編譯,得到代碼,但此時的代碼是經(jīng)混淆后的代碼,可讀性已經(jīng)大大降低,難以從代碼中發(fā)現(xiàn)源代碼的編寫思路和關(guān)鍵算法,從而達(dá)到保護(hù)軟件的目的?;煜且粋€相對安全的過程,可以完整地保留應(yīng)用程序的功能。但某些情況下,混淆程序所執(zhí)行的變換也可能會影響程序的正常運(yùn)行。如:動態(tài)類加載的問題、反射問題、串行化問題和違反命名慣例的問題,這些問題雖然較少出現(xiàn),但卻會影響程序的正常執(zhí)行,另外,混淆技術(shù)的應(yīng)用使得維護(hù)應(yīng)用程序和排除故障變得更加困難,有時甚至是不可能的。Java異常事件處理是隔離有缺陷代碼的一種有效方式,而查看堆棧跟蹤一般可以告訴用戶何處出錯以及出什么錯。為源代碼文件名和行編號保留調(diào)試信息,保證運(yùn)行時可以報(bào)告出錯代碼的準(zhǔn)確位置?;煜绦蚩赡軙惯@一特性并使調(diào)試變得困難,因?yàn)殚_發(fā)人員只能看到被混淆的類名稱而不是真正的類名稱和行編號。
目前己經(jīng)有很多針對Java軟件的保護(hù)方法,在一定程度上起到了保護(hù)Java軟件的作用,但是這些方法都有各自的局限性和不足。Java軟件的知識產(chǎn)權(quán)保護(hù)問題也遭遇了非常大的挑戰(zhàn),許多廠商和個人投入大量人力物力開發(fā)的軟件被侵權(quán),一些重要的算法和創(chuàng)新思想被抄襲。因此,研究針對Java軟件的保護(hù)方法已經(jīng)迫在眉睫。
[1]申茜,辛?xí)暂x.JAVA軟件面臨的風(fēng)險(xiǎn)及其保護(hù)[J].電腦知識與技術(shù)(學(xué)術(shù)交流),2007(23).
[2]胡燕京,張健,王海義,劉軼群.軟件保護(hù)研究及其在Java軟件保護(hù)中的應(yīng)用[J].現(xiàn)代電子技術(shù),2007(15).
[3]楊勇義.基于Android平臺的軟件保護(hù)技術(shù)研究[D].北京郵電大學(xué),2012.
[4]霍建雷.用于Java軟件保護(hù)的代碼混淆技術(shù)研究與實(shí)現(xiàn)[D].西北大學(xué),2009.