當前位置:
首頁 > 最新 > 如何保護Java程序 防止Java反編譯

如何保護Java程序 防止Java反編譯

Java是一種跨平台的、解釋型語言Java 源代碼編譯中間「位元組碼」存儲於class文件中。Class文件是一種位元組碼形式的中間代碼,該位元組碼中包括了很多源代碼的信息,例如變數名、方法名等。因此,Java中間代碼的反編譯就變得非常容易。目前市場上有許多免費的、商用的反編譯軟體,都能夠生成高質量的反編譯後的源代碼。所以,對開發人員來說,如何保護Java程序就變成了一個非常重要的挑戰。

下面我們就結合實例討論

保護Java程序的基本方法

然後對代碼混淆問題進行深入研究,

最後結合一個實際的應用程序,分析如何在實踐中保護Java程序。

反編譯成為保護Java程序的最大挑戰

通常C、C++等編程語言開發的程序都被編譯成目標代碼,這些目標代碼都是本機器的二進位可執行代碼。通常所有的源文件被編譯、鏈接成一個可執行文件。在這些可執行文件中,編譯器刪除了程序中的變數名稱、方法名稱等信息,這些信息往往是由內存地址表示,例如如果需要使用一個變數,往往是通過這個變數的地址來訪問的。因此,反編譯這些本地的目標代碼就是非常困難的。

Java語言的出現,使得反編譯變得非常容易而有效。

原因如下:

1.由於跨平台的需求,Java的指令集比較簡單而通用,較容易得出程序的語義信息;

2.Java編譯器將每一個類編譯成一個單獨的文件,這也簡化了反編譯的工作;

3.Java 的Class文件中,仍然保留所有的方法名稱、變數名稱,並且通過這些名稱來訪問變數和方法,這些符號往往帶有許多語義信息。由於Java程序自身的特點,對於不經過處理的Java程序反編譯的效果非常好。

目前,市場上有許多Java的反編譯工具,有免費的,也有商業使用的,還有的是開放源代碼的。這些工具的反編譯速度和效果都非常不錯。好的反編譯軟體,能夠反編譯出非常接近源代碼的程序。因此,通過反編譯器,黑客能夠對這些程序進行更改,或者復用其中的程序。因此,如何保護Java程序不被反編譯,是非常重要的一個問題。

常用的保護技術

由於Java位元組碼的抽象級別較高,因此它們較容易被反編譯。下面介紹幾種常用的方法,用於保護Java位元組碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因為這些方法都有自己的使用環境和弱點。

隔離Java程序

最簡單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實現有多種方式。例如,開發人員可以將關鍵的Java Class放在伺服器端,客戶端通過訪問伺服器的相關介面來獲得服務,而不是直接訪問Class文件。這樣黑客就沒有辦法反編譯Class文件。目前,通過介面提供服務的標準和協議也越來越多,例如 HTTP、Web Service、RPC等。但是有很多應用都不適合這種保護方式,例如對於單機運行的程序就無法隔離Java程序。這種保護方式如下圖所示。

對Class文件進行加密

為了防止Class文件被直接反編譯,許多開發人員將一些關鍵的Class文件進行加密,例如對註冊碼、序列號管理相關的類等。在使用這些被加密的類之前,程序首先需要對這些類進行解密,而後再將這些類裝載到JVM當中。這些類的解密可以由硬體完成,也可以使用軟體完成。

在實現時,開發人員往往通過自定義ClassLoader類來完成加密類的裝載(注意由於安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而後進行解密,最後將解密後的類裝載到JVM當中。在這種保護方式中,自定義的ClassLoader是非常關鍵的類。由於它本身不是被加密的,因此它可能成為黑客最先攻擊的目標。如果相關的解密密鑰和演算法被攻克,那麼被加密的類也很容易被解密。這種保護方式示意圖見下圖。

轉換成本地代碼

將程序轉換成本地代碼也是一種防止反編譯的有效方法。因為本地代碼往往難以被反編譯。開發人員可以選擇將整個應用程序轉換成本地代碼,也可以選擇關鍵模塊轉換。如果僅僅轉換關鍵部分模塊,Java程序在使用這些模塊時,需要使用JNI技術進行調用。

當然,在使用這種技術保護Java程序的同時,也犧牲了Java的跨平台特性。對於不同的平台,我們需要維護不同版本的本地代碼,這將加重軟體支持和維護的工作。不過對於一些關鍵的模塊,有時這種方案往往是必要的。

為了保證這些本地代碼不被修改和替代,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進行認證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調用相關JNI方法。這種保護方式示見下圖

代碼混淆

轉換成本地代碼示意圖

代碼混淆是對Class文件進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能(語義)。但是混淆後的代碼很難被反編譯,即反編譯後得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客如果有足夠的時間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研製反混淆的工具。但是從實際情況來看,由於混淆技術的多元化發展,混淆理論的成熟,經過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會詳細介紹混淆技術,因為混淆是一種保護Java程序的重要技術。

代碼混淆示意圖

以上幾種技術都有不同的應用環境,各自都有自己的弱點,表1是相關特點的比較。

混淆技術介紹

表1 不同保護技術比較表

到目前為止,對於Java程序的保護,混淆技術還是最基本的保護方法。Java混淆工具也非常多,包括商業的、免費的、開放源代碼的。Sun公司也提供了自己的混淆工具。它們大多都是對Class文件進行混淆處理,也有少量工具首先對源代碼進行處理,然後再對Class進行處理,這樣加大了混淆處理的力度。目前,商業上比較成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和4thpass.com的SourceGuard等。主要的混淆技術按照混淆目標可以進行如下分類,它們分別為符號混淆(Lexical Obfuscation)、數據混淆(Data Obfuscation)、控制混淆(Control Obfuscation)、預防性混淆(Prevent Transformation)。

案例分析

在實踐當中,保護一個大型Java程序經常需要綜合使用這些方法,而不是單一使用某一種方法。這是因為每種方法都有其弱點和應用環境。綜合使用這些方法使得Java程序的保護更加有效。另外,我們經常還需要使用其它的相關安全術,例如安全認證、數字簽名、PKI等。

現在我們要分析的是一個Java應用程序,它是一個SCJP(Sun Certificate Java Programmer)的模擬考試軟體。該應用程序帶有大量的模擬題目,所有的題目都被加密後存儲在文件中。由於它所帶的題庫是該軟體的核心部分,所以關於題庫的存取和訪問就成為非常核心的類。一旦這些相關的類被反編譯,則所有的題庫將被破解。現在,我們來考慮如何保護這些題庫及相關的類。

在這個例子中,我們考慮使用綜合保護技術,其中包括本地代碼和混淆技術。因為該軟體主要發布在Windows上,因此轉換成本地代碼後,僅僅需要維護一個版本的本地代碼。另外,混淆對Java程序也是非常有效的,適用於這種獨立發布的應用系統。

在具體的方案中,我們將程序分為兩個部分,一個是由本地代碼編寫的題庫訪問的模塊,另外一個是由Java開發的其它模塊。這樣可以更高程度地保護題目管理模塊不被反編譯。對於Java開發的模塊,我們仍然要使用混淆技術。

該方案的示意圖如下:

動圖

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java學習吧 的精彩文章:

給Java初學者福利——Java語法基礎
Java熱門的秘密,熱愛Java的同志們進來看看
作為Java程序員這些都 不知道那就真的OUT了
Java初學者的 問題及答案總匯
Java程序員修鍊之路(一)我們為什麼選擇Java

TAG:java學習吧 |

您可能感興趣

Python 程序員如何防止數據被修改?
谷歌為 Play Store 的應用程序加入防止篡改的 DRM 保護
EntityFramework Core 2.0執行原始查詢如何防止SQL注入?
Dropout為何能防止過擬合?
Sophos Intercept X for Server高效防止網路攻擊
Drive.ai試行自動駕駛免費接送服務,稱有信心防止Uber悲劇
如何防止Apple ID被「釣」?Apple ID防騙教程
防止黑客通過SIM卡入侵 Instagram構建新的身份驗證系統
如何防止HTML5的video標籤在iphone中自動全屏
Patriot One開發的PatScan雷達系統旨在防止大規模槍擊事件
微軟稱Windows Defender可以防止大規模加密貨幣挖掘攻擊
可防止碎屏 moto z2 force在印度開售
「rm的詛咒」——防止rm誤操作
JNeurosci:研究發現受教育可以防止認知下降
Joule薦讀:滑鐵盧大學Linda Nazar實驗室——原位生成固體電解質層防止鋰金屬枝晶生長
谷歌修改Chrome API 防止隱身模式檢測
IBM和Salon Media正試驗防止廣告欺詐的區塊鏈項目
國際清算銀行(BIS)總裁Agustin Carstens:要防止數字貨幣成為現行金融體系「寄生蟲」
防止 AirPods 被盜的最佳方法
Facebook 擬禁止加密貨幣廣告,防止詐騙信息傳播