JAVA .class 文件防止反編譯。

常用的保護技術

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

1隔離Java程序

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

2Class文件進行加密   

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

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

3.轉換成本地代碼   

將程序轉換成本地代碼也是一種防止反編譯的有效方法。因爲本地代碼往往難以被反編譯。開發人員可以選擇將整個應用程序轉換成本地代碼,也可以選擇關鍵模塊轉換。如果僅僅轉換關鍵部分模塊,Java程序在使用這些模塊時,需要使用JNI技術進行調用。當然,在使用這種技術保護Java程序的同時,也犧牲了Java的跨平臺特性。對於不同的平臺,我們需要維護不同版本的本地代碼,這將加重軟件支持和維護的工作。不過對於一些關鍵的模塊,有時這種方案往往是必要的。爲了保證這些本地代碼不被修改和替代,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進行認證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調用相關JNI方法。

4.代碼混淆

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

幾種技術的總結   

以上幾種技術都有不同的應用環境,各自都有自己的弱點,表1是相關特點的比較。     到目前爲止,對於Java程序的保護,混淆技術還是最基本的保護方法。Java混淆工具也非常多,包括商業的、免費的、開放源代碼的。Sun公司也提供了自己的混淆工具。它們大多都是對Class文件進行混淆處理,也有少量工具首先對源代碼進行處理,然後再對Class進行處理,這樣加大了混淆處理的力度。目前,商業上比較成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink4thpass.comSourceGuard等。主要的混淆技術按照混淆目標可以進行如下分類,它們分別爲符號混淆(Lexical Obfuscation)、數據混淆(Data Obfuscation)、控制混淆(Control Obfuscation)、預防性混淆(Prevent Transformation)。   符號混淆   在Class中存在許多與程序執行本身無關的信息,例如方法名稱、變量名稱,這些符號的名稱往往帶有一定的含義。例如某個方法名爲getKeyLength(),那麼這個方法很可能就是用來返回Key的長度。符號混淆就是將這些信息打亂,把這些信息變成無任何意義的表示,例如將所有的變量從vairant_001開始編號;對於所有的方法從method_001開始編號。這將對反編譯帶來一定的困難。對於私有函數、局部變量,通常可以改變它們的符號,而不影響程序的運行。但是對於一些接口名稱、公有函數、成員變量,如果有其它外部模塊需要引用這些符號,我們往往需要保留這些名稱,否則外部模塊找不到這些名稱的方法和變量。因此,多數的混淆工具對於符號混淆,都提供了豐富的選項,讓用戶選擇是否、如何進行符號混淆。  

數據混淆

數據混淆是對程序使用的數據進行混淆。混淆的方法也有多種,主要可以分爲改變數據存儲及編碼(Store and Encode Transform)、改變數據訪問(Access Transform)。   改變數據存儲和編碼可以打亂程序使用的數據存儲方式。例如將一個有10個成員的數組,拆開爲10個變量,並且打亂這些變量的名字;將一個兩維數組轉化爲一個一維數組等。對於一些複雜的數據結構,我們將打亂它的數據結構,例如用多個類代替一個複雜的類等。  另外一種方式是改變數據訪問。例如訪問數組的下標時,我們可以進行一定的計算,圖5就是一個例子。   在實踐混淆處理中,這兩種方法通常是綜合使用的,在打亂數據存儲的同時,也打亂數據訪問的方式。經過對數據混淆,程序的語義變得複雜了,這樣增大了反編譯的難度。  控制混淆   控制混淆就是對程序的控制流進行混淆,使得程序的控制流更加難以反編譯,通常控制流的改變需要增加一些額外的計算和控制流,因此在性能上會給程序帶來一定的負面影響。有時,需要在程序的性能和混淆程度之間進行權衡。控制混淆的技術最爲複雜,技巧也最多。這些技術可以分爲如下幾類:  增加混淆控制 通過增加額外的、複雜的控制流,可以將程序原來的語義隱藏起來。例如,對於按次序執行的兩個語句AB,我們可以增加一個控制條件,以決定B的執行。通過這種方式加大反彙編的難度。但是所有的干擾控制都不應該影響B的執行。圖6就給出三種方式,爲這個例子增加混淆控制。   

控制流重組

重組控制流也是重要的混淆方法。例如,程序調用一個方法,在混淆後,可以將該方法代碼嵌入到調用程序當中。反過來,程序中的一段代碼也可以轉變爲一個函數調用。另外,對於一個循環的控制流,爲可以拆分多個循環的控制流,或者將循環轉化成一個遞歸過程。這種方法最爲複雜,研究的人員也非常多。  預防性混淆   這種混淆通常是針對一些專用的反編譯器而設計的,一般來說,這些技術利用反編譯器的弱點或者Bug來設計混淆方案。例如,有些反編譯器對於Return後面的指令不進行反編譯,而有些混淆方案恰恰將代碼放在Return語句後面。這種混淆的有效性對於不同反編譯器的作用也不太相同的。一個好的混淆工具,通常會綜合使用這些混淆技術。  案例分析   在實踐當中,保護一個大型Java程序經常需要綜合使用這些方法,而不是單一使用某一種方法。這是因爲每種方法都有其弱點和應用環境。綜合使用這些方法使得Java程序的保護更加有效。另外,我們經常還需要使用其它的相關安全技術,例如安全認證、數字簽名、PKI等。   本文給出的例子是一個Java應用程序,它是一個SCJP(Sun Certificate Java Programmer)的模擬考試軟件。該應用程序帶有大量的模擬題目,所有的題目都被加密後存儲在文件中。由於它所帶的題庫是該軟件的核心部分,所以關於題庫的存取和訪問就成爲非常核心的類。一旦這些相關的類被反編譯,則所有的題庫將被破解。現在,我們來考慮如何保護這些題庫及相關的類。  在這個例子中,我們考慮使用綜合保護技術,其中包括本地代碼和混淆技術。因爲該軟件主要發佈在Windows上,因此轉換成本地代碼後,僅僅需要維護一個版本的本地代碼。另外,混淆對Java程序也是非常有效的,適用於這種獨立發佈的應用系統。   在具體的方案中,我們將程序分爲兩個部分,一個是由本地代碼編寫的題庫訪問的模塊,另外一個是由Java開發的其它模塊。這樣可以更高程度地保護題目管理模塊不被反編譯。對於Java開發的模塊,我們仍然要使用混淆技術。

   對於題目管理模塊,由於程序主要在Windows下使用,所以使用C++開發題庫訪問模塊,並且提供了一定的訪問接口。爲了保護題庫訪問的接口,我們還增加了一個初始化接口,用於每次使用題庫訪問接口之前的初始化工作。它的接口主要分爲兩類:  

1. 初始化接口   在使用題庫模塊之前,我們必須先調用初始化接口。在調用該接口時,客戶端需要提供一個隨機數作爲參數。題庫管理模塊和客戶端通過這個隨機數,按一定的算法同時生成相同的SessionKey,用於加密以後輸入和輸出的所有數據。通過這種方式,只有授權(有效)的客戶端才能夠連接正確的連接,生成正確的SessionKey,用於訪問題庫信息。非法的客戶很難生成正確的SessionKey,因此無法獲得題庫的信息。如果需要建立更高的保密級別,也可以採用雙向認證技術。   

2. 數據訪問接口   認證完成之後,客戶端就可以正常的訪問題庫數據。但是,輸入和輸出的數據都是由SessionKey所加密的數據。因此,只有正確的題庫管理模塊才能夠使用題庫管理模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章