java代碼混淆插件jocky(java 混淆器)

本文目錄一覽:

有人使用過 Zelix KlassMaster進行混淆嗎

你要的功能其實是Java代碼混淆,如果要了解Java編譯成exe,可以看“參考資料”。下面一段文字摘自《Java手機/PDA程序設計入門》一書,可以做為混淆器性能的大致觀點:筆者沒用過DashO,所以無法對其作出個人評價。所以現在僅說明筆者曾用過的產品。以筆者的個人觀點,如果就混淆的程度來說,ZKM最好,JAX中等,RetroGuard和ProGuard最差,一分錢一分貨,這是千古不變的道理。如果就功能性而言,ZKM和JAX都不錯,不過,JAX是IBM所開發的產品,因此也繼承了大部分IBM產品的最大特色,就是“功能超強,可是不易使用”,可能光是要看完JAX的設定文件就是一個很大的問題。下面分別介紹幾種具有代表性的混淆器,對它們的產品性能進行對比。我們使用不同混淆器對同一段java代碼進行混淆,分別列出混淆後代碼反編譯的結果,並給出使用的一些直接體會。原始java代碼:publicclassSimpleBeanimplementsSerializable{privateString[]name={“name0″,”name1″,”name2″,”name3”};privateListmyList=null;publicvoidSimpleBean(){myList=newArrayList(4);}publicvoidinit_public(){myList.add(“name”);for(inti=1;i;JVMINSTRdup;JVMINSTRswap;4;ArrayList();_$1;}publicvoidinit_public(){_$1.add(“name”);for(inti=1;i4;i++)_$1(i);}privatevoid_$1(inti){_$1.add(_$2[i]);}privatevoidwriteObject(ObjectOutputStreamobjectoutputstream)throwsIOException{}privateString_$2[];privateList_$1;}優點:1、除符號混淆外增加了數據混淆(字符數組初始化);2、有一些語句反編譯只能得到字節碼指令;3、在SunJDK中提供的Java編譯器(javac)的基礎上完成,編譯和混淆一體完成,不需要先生成class文件再混淆;4、提供了Eclipse的插件,能夠直接在Eclipse中使用Jocky。缺點:1、混淆選項粒度較粗,使用中可能要在具體代碼中添加@preserve指令來實現,工作量大;2、沒有控制流混淆。三、Allatori3.1_demoAllatori屬於第二代混淆器,具有全方位保護你的知識產權的能力。Allatori具有以下幾種保護方式:命名混淆,流混淆,調試信息混淆,字符串編碼,以及水印技術。對於教育和非商業項目來說這個混淆器是免費的。2.1版本支持war和ear文件格式,並且允許對需要混淆代碼的應用程序添加有效日期。Jad反編譯混淆後class得到的代碼:publicclassSimpleBeanimplementsSerializable{publicvoidinit_public(){d.add(c.k(“{u{0”));inti=1;goto_L1_L3:H(i);++i;_L1:4;JVMINSTRicmplt21;goto_L2_L3_L2:}publicvoidSimpleBean(){d=newArrayList(4);}privatevoidH(inta){d.add(c[a]);}publicSimpleBean(){d=null;}privatevoidH(ObjectOutputStreamobjectoutputstream)throwsIOException{}privateStringc[]={c.k(“\177q\177te”),c.k(“\177q\177td”),c.k(“\177q\177tg”),c.k(“\177q\177tf”)};privateListd;}註:c.k是為進行字符串加密額外生成的類c的靜態方法。優點:1、設計考慮了庫文件混淆的使用場景;2、使用文檔詳盡,混淆選項配置文件的編寫示例多;3、除符號混淆外,還使用了兩種高級的混淆手段:控制混淆(改寫了for循環)和字符串加密(String數組初始化);4、混淆選項粒度較細,支持本地方法的保護等;5、支持水印技術,允許對需要混淆的代碼添加有效日期;6、支持j2me;缺點:1、商業軟件(價格附後),對教育和非商業用途免費(網站鏈接是

java的源代碼隱藏問題

你要的功能其實是Java代碼混淆,如果要了解Java編譯成exe,可以看“參考資料”。

下面一段文字摘自《Java 手機/PDA 程序設計入門》一書,可以做為混淆器性能的大致觀點:

筆者沒用過DashO,所以無法對其作出個人評價。所以現在僅說明筆者曾用過的產品。以筆者的個人觀點,如果就混淆的程度來說,ZKM最好,JAX中等,RetroGuard和ProGuard最差,一分錢一分貨,這是千古不變的道理。如果就功能性而言,ZKM和JAX都不錯,不過,JAX是IBM所開發的產品,因此也繼承了大部分IBM產品的最大特色,就是“功能超強,可是不易使用”,可能光是要看完JAX的設定文件就是一個很大的問題。

下面分別介紹幾種具有代表性的混淆器,對它們的產品性能進行對比。我們使用不同混淆器對同一段java代碼進行混淆,分別列出混淆後代碼反編譯的結果,並給出使用的一些直接體會。

原始java代碼:

public class SimpleBean implements Serializable {

private String[] name = {“name0″,”name1″,”name2″,”name3”};

private List myList = null;

public void SimpleBean() {

myList = new ArrayList(4);

}

public void init_public() {

myList.add(“name”);

for(int i= 1; i 4; i++){

init_private(i);

}

}

private void init_private(int j) {

myList.add(name[j]);

}

private void writeObject(java.io.ObjectOutputStream out)

throws IOException {

}

}

一、ProGuard 4.5.1

ProGuard是一款免費的Java類文件壓縮器、優化器和混淆器。它能發現並刪除無用類、字段(field)、方法和屬性值(attribute)。它也能優化字節碼並刪除無用的指令。最後,它使用簡單無意義的名字來重命名你的類名、字段名和方法名。經過以上操作的jar文件 會變得更小,並很難進行逆向工程。eclipse已經把Proguard集成在一起了。它支持腳本控制,可以使用GUI界面,字符串不加密,支持 J2ME。

類似功能的開源混淆器:

RetroGuard yGuard(RetroGuard的一個升級版本) JODE

Jad反編譯混淆後class得到的代碼:

public class SimpleBean

implements Serializable

{

public SimpleBean()

{

a_java_util_List_fld = null;

}

public void SimpleBean()

{

a_java_util_List_fld = new ArrayList(4);

}

public void init_public()

{

a_java_util_List_fld.add(“name”);

for(int i = 1; i 4; i++)

{

int j = i;

SimpleBean simplebean = this;

a_java_util_List_fld.add(simplebean.a_java_lang_String_array1d_fld[j]);

}

}

private String a_java_lang_String_array1d_fld[] = {

“name0”, “name1”, “name2”, “name3”

};

private List a_java_util_List_fld;

}

優點:

1、對內部private方法的調用進行了內聯,但基本達不到混淆效果;

2、使用文檔詳盡,混淆選項配置文件的編寫示例多;

3、混淆選項粒度較細,可以使用GUI界面,支持本地方法的保護等;

4、支持j2me,可以集成到Eclipse;

5、開源。

缺點:

1、符號混淆的命名具有提示性,字符串未加密,沒有其它的混淆措施;

2、混淆主要針對Xlet、Midlet等應用,混淆庫文件時配置文件將會很複雜。

二、Jocky

Jocky是金蝶中間件技術領袖袁紅崗先生的個人作品(舊有名稱JOC)。原本是方便Apusic 應用服務器的開發,現在開放出來,供大家自由使用。Jocky混淆編譯器是在Sun JDK中提供的Java編譯器(javac)的基礎上完成的,修改了其中的代碼生成過程,對編譯器生成的中間代碼進行混淆,最後再生成class文件,這樣編譯和混淆只需要一個步驟就可以完成。也就是說,它是直接從源碼上做文章,這是Jocky與其它混淆編譯器最大的不同之處。另外可以在源程序中插入符號保留指令來控制哪些符號需要保留,將混淆過程與開發過程融合在一起,不需要單獨的混淆選項配置文件。Jocky的上述特點較適合於java類庫的混淆。

Jad反編譯混淆後class得到的代碼:

public class SimpleBean

implements Serializable

{

public SimpleBean()

{

this;

String as[] = new String[4];

as;

as[0] = “name0”;

as;

JVM INSTR swap ;

1;

“name1”;

JVM INSTR aastore ;

JVM INSTR dup ;

JVM INSTR swap ;

2;

“name2”;

JVM INSTR aastore ;

JVM INSTR dup ;

JVM INSTR swap ;

3;

“name3”;

JVM INSTR aastore ;

_$2;

_$1 = null;

return;

}

public void SimpleBean()

{

this;

JVM INSTR new #9 Class ArrayList;

JVM INSTR dup ;

JVM INSTR swap ;

4;

ArrayList();

_$1;

}

public void init_public()

{

_$1.add(“name”);

for(int i = 1; i 4; i++)

_$1(i);

}

private void _$1(int i)

{

_$1.add(_$2[i]);

}

private void writeObject(ObjectOutputStream objectoutputstream)

throws IOException

{

}

private String _$2[];

private List _$1;

}

優點:

1、除符號混淆外增加了數據混淆(字符數組初始化);

2、有一些語句反編譯只能得到字節碼指令;

3、在Sun JDK中提供的Java編譯器(javac)的基礎上完成,編譯和混淆一體完成,不需要先生成class文件再混淆;

4、提供了Eclipse的插件,能夠直接在Eclipse中使用Jocky。

缺點:

1、混淆選項粒度較粗,使用中可能要在具體代碼中添加@preserve指令來實現,工作量大;

2、沒有控制流混淆。

三、Allatori 3.1_demo

Allatori屬於第二代混淆器,具有全方位保護你的知識產權的能力。Allatori具有以下幾種保護方式:命名混淆,流混淆,調試信息混淆,字符串編碼,以及水印技術。對於教育和非商業項目來說這個混淆器是免費的。2.1版本支持war和ear文件格式,並且允許對需要混淆代碼的應用程序添加有效日期。

Jad反編譯混淆後class得到的代碼:

public class SimpleBean

implements Serializable

{

public void init_public()

{

d.add(c.k(“{u{0”));

int i = 1;

goto _L1

_L3:

H(i);

++i;

_L1:

4;

JVM INSTR icmplt 21;

goto _L2 _L3

_L2:

}

public void SimpleBean()

{

d = new ArrayList(4);

}

private void H(int a)

{

d.add(c[a]);

}

public SimpleBean()

{

d = null;

}

private void H(ObjectOutputStream objectoutputstream)

throws IOException

{

}

private String c[] = {

c.k(“\177q\177te”), c.k(“\177q\177td”), c.k(“\177q\177tg”), c.k(“\177q\177tf”)

};

private List d;

}

註:c.k是為進行字符串加密額外生成的類c的靜態方法。

優點:

1、設計考慮了庫文件混淆的使用場景;

2、使用文檔詳盡,混淆選項配置文件的編寫示例多;

3、除符號混淆外,還使用了兩種高級的混淆手段:控制混淆(改寫了for循環)和字符串加密(String數組初始化);

4、混淆選項粒度較細,支持本地方法的保護等;

5、支持水印技術,允許對需要混淆的代碼添加有效日期;

6、支持j2me;

缺點:

1、商業軟件(價格附後),對教育和非商業用途免費(網站鏈接是)。

附:價格情況

SINGLE DEVELOPER LICENSE

1 license $290

2-5 licenses $260

6-10 licenses $230

11+ licenses $200

SITE LICENSE $3750

BUSINESS LICENSE $4850

ANNUAL SUPPORT UPDATE $45

四、Zelix KlassMaster(ZKM)

Zelix KlassMaster是一個來自Zelix Pty Ltd的商業混淆器。官方文檔中關於它的混淆特性的介紹很少。它的保護功能非常強大,可以進行符號混淆和控制混淆,支持字符串的複雜加密保護,堆棧混亂,支持異常重構,支持增量混淆,支持J2ME。Zelix KlassMaster提供試用版本,可以到下載。

五、DashO Pro

DashO Pro 是由Preemptive Solutions開發的商業化的混淆器. 免費的評估版可以到下載。DashO Pro代碼保護能力強大易用,方便靈活(商業軟件,非開源)。該Java混淆器是Sun的選擇,對於企業級應用,作為其Java開發包的一部分,Sun微系統使用DashO Pro來混淆其加密庫。DashO Pro能夠對ID進行重新命名,使之成為毫無意義的字符;混淆元數據;改變控制流等,所有這些操作使得java代碼被混淆,難於理解。產品特點包括:

領先的Java源碼保護機制;

運用專利Overload-Induction技術對包/類/方法/域進行重命名;

高級的流程控制混淆機制;

字符串加密技術;

防止反編譯器生成有用的輸出;

水印軟件;

提高Java源碼效率;

不採用類/方法/域,全面移除常數存儲庫;

類/方法級別的優化,以提高JIT效果;

動態加載檢測到的類;

全面高效的Java源碼的拓展和部署;

支持所有的JDK版本 (JSE, J2EE, J2ME, etc)包括1.5;

自動堆棧跟蹤轉換;

在指定路徑打包或者java jars;

支持任何打包類型的Java內容——程序、庫、applets程序、小服務器程序、EJB等;支持基於J2ME CLDC的架構,包括MIDP和 iAppli;

支持CLDC預檢驗庫中的類;

可以從指定路徑、Zip壓縮包或者jars中提取;

支持導出100%純粹的Java,並提供驗證;

命令行接口適合集成到構建環境內;

基於XML的配置文件,易於使用;

全面準確的PDF格式用戶指南。

java 代碼混淆 用什麼命令

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目錄下的部分包而不是全部。

JAVA 有對源代碼進行混淆的混淆器么

不需要對源代碼混淆。class有這種功能的,在J2ME中混淆是必須的,結果跟你說的一樣,不過原理不是你那麼走的,混淆以後的class反編譯也會讓人看不懂,全部變成了a,b,c,d這樣的名字。

如何有效的防止Java程序被反編譯和破解

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

1.隔離Java程序

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

2.對Class文件進行加密

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

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

3.轉換成本地代碼

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

4.代碼混淆

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

Jocky使用

常規用法

使用Jocky非常簡單,獲得jocky.jar以後,只需要運行java -jar jocky.jar就可以啟動Jocky混淆編譯器,jocky的命令行參數和javac完全相同,但增加了一個新的參數-scramble,它的用法如下:

-scramble          混淆所有package private或private符號

-scrambleall       混淆所有符號

-scramble:level  混淆相應級別的符號

其中level指定混淆級別,可以是以下幾種級別:

-scramble:none        不進行混淆

-scramble:private     對所有private訪問級別的元素進行混淆

-scramble:package     對所有private或package private元素進行混淆

-scramble:protected   對所有private, package private, protected元素進行混淆

-scramble:public      對所有的元素都進行混淆

-scramble:all         相當於-scramble:public

如果使用-scramble不帶級別參數,則相當於-scramble:package

Jocky提供了Eclipse的插件,從而能夠直接在Eclipse中使用Jocky。

    1. Jocky插件的安裝:

    將

Jocky插件安裝至Eclipse中非常簡單,只需要將eclipse/plugins/org.apusic.jocky_1.0.0目錄 copy

至 Eclipse的 plugins目錄即可。或者在Eclipse/links文件夾中,通過link方式指定Jocky的插件目錄。

    2. 在Eclipse中使用Jocky:

    在Eclipse中使用Jocky也非常簡單,任何一個Java工程,選中工程通過右鍵菜單,都可以出現Jocky的快捷菜單:

原創文章,作者:RYVLR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/324863.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RYVLR的頭像RYVLR
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29

發表回復

登錄後才能評論