1.隔離Java程序
最簡單的方法是阻止用戶訪問Java類程序,這是最根本的方法,可以通過多種方式實現。比如壹個開發者可以把壹個關鍵的Java類放在服務器端,客戶端可以通過訪問服務器的相關接口來獲取服務,而不是直接訪問類文件。所以黑客無法反編譯類文件。目前,通過接口提供服務的標準和協議越來越多,如HTTP、Web Service、RPC等。但是很多應用並不適合這種保護,比如Java程序對於單機運行的程序是無法隔離的。
2.加密類文件
為了防止類文件被直接反編譯,很多開發者會對壹些關鍵的類文件進行加密,比如與註冊碼、序列號管理相關的類。在使用這些加密的類之前,程序需要首先解密它們,然後將它們加載到JVM中。這些類別的解密可以通過硬件或軟件來完成。
在實現中,開發人員通常通過定制ClassLoader類來加載加密類(註意,出於安全原因,Applet不支持定制的ClassLoader)。自定義類加載器首先找到加密的類,然後解密它,最後將解密的類加載到JVM中。在這種保護模式下,自定義類加載器是壹個非常關鍵的類。因為沒有加密,所以可能是黑客的第壹目標。如果攻克了相關的解密密鑰和算法,加密的類就可以輕松解密。
3.轉換為本地代碼
將程序轉換成本地代碼也是防止反編譯的有效方法。因為本地代碼往往很難反編譯。開發者可以選擇將整個應用程序轉換成本地代碼,也可以選擇轉換關鍵模塊。如果只轉換關鍵模塊,Java程序在使用這些模塊時需要使用JNI技術進行調用。當然,在利用這種技術保護Java程序的同時,也犧牲了Java的跨平臺特性。對於不同的平臺,我們需要維護不同版本的本地代碼,這將增加軟件支持和維護的工作。但是,對於壹些關鍵模塊,有時這種方案往往是必要的。為了確保這些本地代碼不能被修改和替換,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,通常需要對這些本地代碼進行認證,以確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調用相關的JNI方法。
4.代碼混亂
代碼混淆是對類文件進行重新組織和處理,使處理後的代碼能夠完成與預處理代碼相同的功能(語義)。而對於混淆的代碼,很難進行反編譯,即反編譯後得到的代碼非常難以理解和晦澀,所以反編譯者很難知道程序的真實語義。理論上,如果黑客有足夠的時間,混淆的代碼仍然可能被破解,甚至有人在開發反混淆工具。但從實際情況來看,由於混淆技術的多元化發展和混淆理論的成熟,混淆後的Java代碼仍然可以很好地防止反編譯。下面我們將詳細介紹混淆技術,因為混淆是保護Java程序的重要技術。