1.1 什麼是Jocky?
我們知道,Java是一種跨平台的程式設計語言,其源碼(.java檔案)被編譯成與平台無關的位元組碼(.class檔案),然後在運行期動態連結。 這樣,編譯後的類檔案中將包含有符號表,從而使得Java程式很容易被反編譯。相信每一個Java開發人員,都曾經用過諸如Jad之類的反編譯器,對Java的class 檔案進行反編譯,從而觀察程式的結構與實現細節。如此一來,對於那些需要嚴格進行智慧財產權保護的Java應用,如何有效保護客戶的商業投資, 是開發人員經常需要面對的問題。 於是就出現了Java混淆編譯器,它的作用是打亂class檔案中的符號資訊,從而使反向工程變得非常困難。 Jocky就是這樣一款優秀的Java混淆編譯器。
1.2 為什麼需要Jocky?
目前業界有不少商業的甚或是開源的混淆編譯器,但它們普遍存在一些這樣或者那樣的問題。一般而言,現有的混淆器都是對編譯好的 class檔案進行混淆,這樣就需要編譯和混淆兩個步驟。而事實上,並不是所有的符號都需要混淆。如果你開發的是一個類庫,或者某些類需要動態裝載, 那些公用API(或者說:那些被publish出來的API)就必須保留符號不變,只有這樣,別人才能使用你的類庫。現有的混淆器提供了GUI或指令碼的方式來對那些 需要保留的符號名稱進行配置,但如果程式較大時,配置工作將變得很複雜,而程式一旦修改,配置工作又要重新進行。某些混淆器能夠調整位元組碼的順序, 使反編譯更加困難,但筆者經曆過混淆之後的程式運行出錯的情況。 而Jocky與其它混淆編譯器最大的不同之處在於:它是直接從源碼上做文章,也就是說編譯過程本身就是一個混淆過程。
1.3 Jocky是如何工作的?
Jocky混淆編譯器是在Sun JDK中提供的Java編譯器(javac)的基礎上完成的,修改了其中的代碼產生過程,對編譯器產生的中間代碼進行混淆, 最後再產生class檔案,這樣編譯和混淆只需要一個步驟就可以完成。另外可以在來源程式中插入符號保留指令來控制哪些符號需要保留,將混淆過程與開發過程 融合在一起,不需要單獨的配置。
以上為摘抄
Jocky的下載和配置
OperaMasks上的下載連結已經失效,請移步CSDN自行搜尋下載
1、下載完成後解壓得到名為org.apusic.jocky_1.0.3的檔案夾,把這個檔案夾放到eclipse根目錄的plugins檔案夾下(myeclipse和eclipse同理)。
2、重啟eclipse,右鍵一個工程檔案,出現Jocky選項說明OK。
3、一般是先進行設定-Jocky Settings,然後進行Jocky Now!。以下是settings介面
Enable Jocky多選框選中
Jocky build file是在項目建立一個xml檔案,根據裡面的配置進行混淆
Scramble level是進行混淆的代碼等級,有none、private、package、protected、public、all,將根據設定對java檔案中的相應修飾符修飾的方法代碼進行混淆
Target VM是java虛擬機器的版本,有1.4和1.5,一般選擇1.5
Output directory是輸出檔案夾,在項目根目錄下
點擊確認會自動根據項目的設定產生xml檔案
4、jocky_build.xml,實際上是一個ant build檔案,由系統自動產生,有幾處需要說明
- <pathelement location="bin"/> <pathelement location="XXX.jar"/>這類標籤代表項目編譯所需的jar包,由於是自動產生一般不用理睬,如果出現找不到相關的package之類的報錯,那麼有可能是location路徑有問題。如果你安裝系統時是使用者名稱設定成了中文名,並且使用了maven,maven的jar包的下載路徑設定成了預設${user}/.m2/repository/,那麼jocky這裡的路徑會出現問題,中文名的使用者名稱會亂碼或者消失,請修改maven配置xml檔案修改下載路徑<localRepository>[自己指定的路徑]</localRepository> 。
- <javac destdir="${jocky.output.dir}/bin" target="${target}" encoding="UTF-8" > 代碼中如果有中文名,必須手動設定編碼,預設是沒有的。
- <src path="src"/> 設定源檔案的目錄,因為有時候我們只想輸出src目錄下的部分包而不是全部。
5、最後Jocky Now!產生的.class檔案要通過命令進行打包,下篇文章簡單介紹。