Java反編譯的幾種常用方法
由于Java字節(jié)碼的抽象級(jí)別較高,因此它們較容易被反編譯。下面介紹了幾種常用的Java反編譯的方法,用于保護(hù)Java字節(jié)碼不被反編譯。通常,這些方法不能夠絕對(duì)防止程序被反編譯,而是加大反編譯的難度而已,因?yàn)檫@些方法都有自己的使用環(huán)境和弱點(diǎn)。
一、隔離Java程序
最簡(jiǎn)單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實(shí)現(xiàn)有多種方式。例如,開發(fā)人員可以將關(guān)鍵的Java Class放在服務(wù)器端,客戶端通過訪問服務(wù)器的相關(guān)接口來獲得服務(wù),而不是直接訪問Class文件。這樣黑客就沒有辦法反編譯Class文件。目前,通過接口提供服務(wù)的標(biāo)準(zhǔn)和協(xié)議也越來越多,例如 HTTP、Web Service、RPC等。但是有很多應(yīng)用都不適合這種保護(hù)方式,例如對(duì)于單機(jī)運(yùn)行的程序就無法隔離Java程序。
二、對(duì)Class文件進(jìn)行加密
為了防止Class文件被直接反編譯,許多開發(fā)人員將一些關(guān)鍵的Class文件進(jìn)行加密,例如對(duì)注冊(cè)碼、序列號(hào)管理相關(guān)的類等。在使用這些被加密的類之前,程序首先需要對(duì)這些類進(jìn)行解密,而后再將這些類裝載到JVM當(dāng)中。這些類的解密可以由硬件完成,也可以使用軟件完成。
在實(shí)現(xiàn)時(shí),開發(fā)人員往往通過自定義ClassLoader類來完成加密類的裝載(注意由于安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而后進(jìn)行解密,最后將解密后的類裝載到JVM當(dāng)中。在這種保護(hù)方式中,自定義的ClassLoader是非常關(guān)鍵的類。由于它本身不是被加密的,因此它可能成為黑客最先攻擊的目標(biāo)。如果相關(guān)的解密密鑰和算法被攻克,那么被加密的類也很容易被解密。
三、轉(zhuǎn)換成本地代碼
將程序轉(zhuǎn)換成本地代碼也是一種防止反編譯的有效方法。因?yàn)楸镜卮a往往難以被反編譯。開發(fā)人員可以選擇將整個(gè)應(yīng)用程序轉(zhuǎn)換成本地代碼,也可以選擇關(guān)鍵模塊轉(zhuǎn)換。如果僅僅轉(zhuǎn)換關(guān)鍵部分模塊,Java程序在使用這些模塊時(shí),需要使用JNI技術(shù)進(jìn)行調(diào)用。當(dāng)然,在使用這種技術(shù)保護(hù)Java程序的同時(shí),也犧牲了Java的跨平臺(tái)特性。對(duì)于不同的平臺(tái),我們需要維護(hù)不同版本的本地代碼,這將加重軟件支持和維護(hù)的工作。不過對(duì)于一些關(guān)鍵的模塊,有時(shí)這種方案往往是必要的。為了保證這些本地代碼不被修改和替代,通常需要對(duì)這些代碼進(jìn)行數(shù)字簽名。在使用這些本地代碼之前,往往需要對(duì)這些本地代碼進(jìn)行認(rèn)證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調(diào)用相關(guān)JNI方法。
四、代碼混淆
代碼混淆是對(duì)Class文件進(jìn)行重新組織和處理,使得處理后的代碼與處理前代碼完成相同的功能(語(yǔ)義)。但是混淆后的代碼很難被反編譯,即反編譯后得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語(yǔ)義。從理論上來說,黑客如果有足夠的時(shí)間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是從實(shí)際情況來看,由于混淆技術(shù)的多元化發(fā)展,混淆理論的成熟,經(jīng)過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會(huì)詳細(xì)介紹混淆技術(shù),因?yàn)榛煜且环N保護(hù)Java程序的重要技術(shù)。
以上便是四種最常用的Java反編譯的方法。
【編輯推薦】
- 20個(gè)開發(fā)人員非常有用的Java功能代碼
- 走進(jìn)Java 7中的模塊系統(tǒng)
- JavaFX 1.2 已經(jīng)發(fā)布 主要新功能一覽
- 2009年十大Java技術(shù)解決方案
- 2008最值得學(xué)習(xí)的五種JAVA技術(shù)