Java應(yīng)用程序雖然能夠“編寫一次,隨處運行”(Write Once, Run Anywhere)是一個巨大的優(yōu)勢,但這種環(huán)境的架構(gòu)方式使其遠(yuǎn)比本機應(yīng)用程序更容易被黑客進(jìn)行逆向工程。這意味著開發(fā)人員面臨著失去知識產(chǎn)權(quán)的非常真實的危險。基于應(yīng)用程序的虛擬機比本機應(yīng)用程序更容易逆向工程的原因有很多:
JVM是開源的
Sun已經(jīng)免費提供JVM的源代碼。這使得黑客只需查看代碼即可弄清虛擬機的工作方式。
Java .class文件格式是可公開獲取的
如前所述,Java源代碼被編譯成字節(jié)碼,而字節(jié)碼存儲在Java .class文件中。Java .class文件格式的規(guī)范是可公開獲取的,因此有技術(shù)背景的任何人都能容易地編寫可以處理、修改或轉(zhuǎn)換.class文件的工具。
JVM是軟件,而不是硬件
與需要理解特定處理器的專家使用的標(biāo)準(zhǔn)編程語言不同,JVM是一個應(yīng)用程序,它如同微處理器一樣運作,并使用操作系統(tǒng)和計算機硬件提供的內(nèi)置功能。由于黑客不必深入到硬件級別,因此更容易取得對JVM的完全控制。
因此,例如在使用標(biāo)準(zhǔn)本機系統(tǒng)開發(fā)語言進(jìn)行調(diào)試時,暫停處理器極為困難,需要具備處理器、調(diào)試功能及可用環(huán)調(diào)試器的專家知識。但是,由于JVM 運行環(huán)境的源代碼是可公開獲取的,因此開發(fā)人員可以輕松地建立自己的虛擬機來完全控制虛擬處理器的各個方面。這樣可以容易地分析運行環(huán)境中運行的每個應(yīng)用程序。
Java的指令比本機代碼少
然而,JVM代碼易于進(jìn)行反向工程的另一個原因是它具有比本地應(yīng)用程序更少的指令。這是出于性能考慮。JVM的使用在應(yīng)用程序和本機處理器之間增加了一個軟件層,這會對性能產(chǎn)生負(fù)面影響。雖然現(xiàn)代處理器不斷提高的執(zhí)行速度最終將緩解這一問題,但這一問題仍然很明顯。虛擬機開發(fā)人員提高執(zhí)行速度的一種方法是使用比本機處理器匯編程序更小的字節(jié)碼指令集。本機應(yīng)用程序可能包含多達(dá)400條指令,而Java應(yīng)用程序通常使用不超過200條的指令。更少的指令意味著黑客可以更快地分析代碼以進(jìn)行逆向工程。這些特性使得虛擬機遠(yuǎn)比其它類型的應(yīng)用程序更容易遭受逆向工程攻擊。
第三方反匯編程序增加了漏洞
不僅是JVM本身容易遭受逆向工程攻擊,商業(yè)和免費的Java字節(jié)碼反匯編程序也越來越多,從而進(jìn)一步簡化了代碼逆向工程的過程。IDA和Eclipse字節(jié)碼插件是眾多Java字節(jié)碼反匯編程序中的兩種。作為商業(yè)產(chǎn)品,IDA是一種普遍的反匯編程序,可用于許多不同的處理器,包括80x86和MIPS。Eclipse字節(jié)碼插件是免費軟件。它能夠反編譯Java .class文件的字節(jié)碼并以適當(dāng)?shù)捻樞蝻@示所有操作碼指令。 盡管這些產(chǎn)品不大可能從字節(jié)碼完美地恢復(fù)原始代碼,但它們恢復(fù)的源代碼將等同于原始代碼,并且比字節(jié)碼更具可讀性。一旦恢復(fù)了源代碼,攻擊者可以容易地刪除部分代碼并將其非法地用于競爭對手的應(yīng)用程序中,或在.class文件中定位打補丁。
圖1提供了黑客可能如何在.class文件中打補丁的一個示例。屏幕的上半部分顯示了一小段Java源代碼。屏幕的下半部分顯示了字節(jié)碼反匯編的輸出,也就是一個字節(jié)碼指令列表。標(biāo)記為紅色的區(qū)域是源代碼中IF結(jié)構(gòu)的對應(yīng)指令。字節(jié)碼指令“LCMP”的十六進(jìn)制表示為0x94。該工具還指出了操作碼在.class文件中的位置。有了這些信息,黑客可以使用簡單的十六進(jìn)制編輯器來改變該IF分支,而這只需不到一分鐘的時間。假設(shè)該IF條件用于許可證檢查,黑客可倒置該條件,指示即使在許可證被驗證為無效(如已過期)的情況下仍返回“True”,從而突破許可證檢查。在這種情況下,黑客使用一個字節(jié)的補丁即可完成所有工作。雖然大多數(shù)應(yīng)用程序都比這個示例更加復(fù)雜,但即使在復(fù)雜的應(yīng)用程序中,字節(jié)碼也非常簡單并且容易理解。
Java應(yīng)用程序雖然能夠“編寫一次,隨處運行”(Write Once, Run Anywhere)是一個巨大的優(yōu)勢,但這種環(huán)境的架構(gòu)方式使其遠(yuǎn)比本機應(yīng)用程序更容易被黑客進(jìn)行逆向工程。這意味著開發(fā)人員面臨著失去知識產(chǎn)權(quán)的非常真實的危險。基于應(yīng)用程序的虛擬機比本機應(yīng)用程序更容易逆向工程的原因有很多:

圖1 - 用于字節(jié)碼反匯編的Eclipse字節(jié)碼插件