下面這段話摘自《Java手機/PDA編程入門》壹書,可以作為混淆器性能的概觀:
我沒有用過DashO,所以無法對它進行個人評價。所以我現在只說明我用過的產品。從作者個人角度來說,ZKM是最好的,JAX居中,RetroGuard和ProGuard最差,壹分錢壹分貨是永恒的真理。如果說ZKM和JAX在功能性方面都不錯的話,然而JAX是IBM開發的產品,所以它也繼承了大部分IBM產品的最大特點,就是“超級功能,但是不好用”。僅僅閱讀JAX的配置文件可能是壹個大問題。
下面介紹幾種有代表性的混淆器,並對它們的產品性能進行比較。我們使用不同的混淆器對同壹個java代碼進行混淆,分別列出混淆後代碼反編譯的結果,並給出壹些直接的使用體驗。
原始java代碼:
公共類SimpleBean實現Serializable {
private String[] name = {"name0 "," name1 "," name2 "," name 3 " };
個人分發名單myList = null
public void SimpleBean() {
my list = new ArrayList(4);
}
public void init_public() {
my list . add(" name ");
for(int I = 1;我& lt4;i++){
init _ private(I);
}
}
private void init_private(int j) {
my list . add(name[j]);
}
私有void writeObject(Java . io . object output stream out)
引發IOException {
}
}
壹. ProGuard 4.5.1
ProGuard是壹個免費的Java類文件壓縮器、優化器和混淆器。它可以找到並刪除無用類、字段、方法和屬性。它還可以優化字節碼,刪除無用的指令。最後,它用簡單無意義的名字給妳的類名、字段名、方法名重新命名。經過以上操作,jar文件會變小,很難逆向工程。Eclipse集成了Proguard。它支持腳本控制,GUI界面,未加密字符串和J2ME。
具有類似功能的開源混淆器:
逆向守衛伊瓜德(逆向守衛的升級版)JODE
Jad反編譯從混淆類獲得的代碼:
公共類SimpleBean
實現可序列化
{
公共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;我& lt4;i++)
{
int j = I;
SimpleBean simplebean = this
a _ Java _ util _ List _ fld . add(simple bean . a _ Java _ lang _ String _ array 1d _ fld[j]);
}
}
私有字符串a _ Java _ lang _ String _ array 1d _ fld[]= {
"名稱0 ","名稱1 ","名稱2 ","名稱3 "
};
私有列表a _ java _ util _ List _ fld
}
優勢:
1,內部私有方法調用內聯,但基本達不到混淆效果;
2.文檔使用詳細,有很多混淆選項配置文件的例子;
3.混淆選項的粒度很細,GUI界面可以用來支持本地方法的保護。
4.支持j2me,可以集成到Eclipse中;;
5.開源。
缺點:
1,符號混淆名稱有提示性,字符串不加密,沒有其他混淆措施;
2.混淆主要針對Xlet、Midlet等應用,庫文件混淆時配置文件會很復雜。
第二,詼諧
JOCky是金蝶中間件(原名Joc)技術負責人袁紅崗先生的個人作品。本來是方便開發Apusic應用服務器,現在開放給大家免費使用。Jocky混淆編譯器是在Sun JDK提供的Java編譯器(javac)的基礎上完成的。修改代碼生成過程,對編譯器生成的中間代碼進行混淆,最後生成類文件,這樣編譯和混淆只需壹步完成。換句話說,它直接從源代碼上做文章,這是Jocky與其他令人困惑的編譯器的最大區別。此外,可以在源程序中插入符號保留指令來控制需要保留哪些符號,混淆過程可以與開發過程集成,而不需要單獨的混淆選項配置文件。Jocky的上述特點更適合java類庫的混亂。
Jad反編譯從混淆類獲得的代碼:
公共類SimpleBean
實現可序列化
{
公共SimpleBean()
{
這個;
String as[]= new String[4];
as;
as[0]= " name 0 ";
as;
JVM INSTR交換;
1;
”name 1”;
JVM INSTR aastore
JVM指令dup
JVM INSTR交換;
2;
”名稱2”;
JVM INSTR aastore
JVM指令dup
JVM INSTR交換;
3;
”名稱3”;
JVM INSTR aastore
_$2;
_ $ 1 = null;
返回;
}
public void SimpleBean()
{
這個;
JVM INSTR new # 9 & lt類數組列表& gt;
JVM指令dup
JVM INSTR交換;
4;
ArrayList();
_$1;
}
public void init_public()
{
_ $ 1 . add(" name ");
for(int I = 1;我& lt4;i++)
_ $ 1㈠;
}
私有void _$1(int i)
{
_ $ 1 . add(_ $ 2[I]);
}
私有void writeObject(object output stream object output stream)
拋出IOException
{
}
私有字符串_ $ 2[];
私信列表_ $ 1;
}
優勢:
1,除了符號混淆,還增加了數據混淆(字符數組初始化);
2.有些語句只能通過反編譯得到字節碼指令;
3.在孫JDK提供的Java編譯器(javac)基礎上完成,編譯和混淆壹次完成,不需要生成壹個類文件再混淆;
4.提供了壹個Eclipse的插件,可以在Eclipse中直接使用Jocky。
缺點:
1,混淆選項粒度較粗,可能需要在具體代碼中添加@preserve指令才能實現,工作量較大;
2.沒有控制流混淆。
三。阿拉托裏3.1 _演示
阿拉托裏屬於第二代混淆器,有能力全方位保護妳的知識產權。Allatori有以下保護方法:命名混淆、流混淆、調試信息混淆、字符串編碼和水印技術。這個混淆器是免費的教育和非商業項目。版本2.1支持war和ear文件格式,並允許向需要混亂代碼的應用程序添加生效日期。
Jad反編譯從混淆類獲得的代碼:
公共類SimpleBean
實現可序列化
{
public void init_public()
{
d . add(c . k(" { u { 0 "));
int I = 1;
goto _L1
_L3:
h(壹);
++ I;
_L1:
4;
JVM INSTR icmplt 21;
去L2 L3
_L2:
}
public void SimpleBean()
{
d =新數組列表(4);
}
私有void H(int a)
{
d . add(c[a]);
}
公共SimpleBean()
{
d =空;
}
私有void H(object output stream object output stream)
拋出IOException
{
}
私有字符串c[] = {
c.k("\177q\177te "),c.k("\177q\177td "),c.k("\177q\177tg "),c.k("\177q\177tf ")
};
私人名單d;
}
註意:c.k是C類的壹個靜態方法,是為字符串加密額外生成的。
優勢:
1,設計考慮了庫文件混淆的使用場景;
2.文檔使用詳細,有很多混淆選項配置文件的例子;
3.除了符號混淆,還使用了兩種高級混淆方法:控制混淆(為循環重寫)和字符串加密(字符串數組初始化);
4.混淆選項的粒度很細,支持局部方法的保護。
5.支持水印技術,允許在需要混淆的代碼中添加生效日期;
6.支持j2me;
缺點:
1,商業軟件(價格附後),教育和非商業用途免費(網址鏈接為/price.html)。
附:價格情況
單壹開發者許可證
1許可證290美元
2-5個許可證260美元
6-10許可證230美元
11+許可證200美元
網站許可證3750美元
營業執照4850美元
年度支持更新45美元
第四,澤利克斯·克拉斯馬斯特(ZKM)
Zelix KlassMaster是來自Zelix Pty Ltd的商業混淆器,在官方文檔中很少介紹它的混淆功能。其保護功能非常強大,可以進行符號混淆和控制混淆,支持字符串、堆棧混淆、異常重構、增量混淆和J2ME的復雜加密保護。Zelix KlassMaster提供了壹個試用版,可以從。
動詞 (verb的縮寫)DashO Pro
DashO Pro是由Preemptive Solutions開發的商業混淆器。可以下載免費的評估版。DashO Pro代碼保護強大易用,方便靈活(商業軟件,非開源)。這個Java混淆器是Sun的選擇。對於企業應用程序,作為其Java開發包的壹部分,Sun Microsystems使用DashO Pro來混淆其加密庫。Dashoporo可以重命名ID,使其成為無意義的字符;混亂的元數據;改變控制流等。,所有這些操作都讓java代碼混亂難懂。產品特性包括:
領先的Java源代碼保護機制;
使用獲得專利的重載誘導技術重命名包/類/方法/域;
先進的過程控制混淆機制;
字符串加密技術;
阻止反編譯器生成有用的輸出;
水印軟件;
提高Java源代碼的效率;
不帶類/方法/域完全刪除常量存儲庫;
在類/方法級別優化以提高JIT效果;
動態加載檢測到的類;
全面高效的Java源代碼擴展和部署;
支持包括1.5在內的所有JDK版本(JSE、J2EE、J2ME等);
自動堆棧跟蹤轉換;
指定路徑中的包或javajars
支持任何打包的Java內容——程序、庫、小應用程序、小服務器程序、EJB等。支持J2ME CLDC架構,包括MIDP和iAppli;
CLDC預檢圖書館支持類;
可以從指定的路徑、Zip壓縮包或jars中提取;
支持導出100%純Java,並提供驗證;
命令行界面適合集成到構建環境中;
基於XML的配置文件,簡單易用;
全面準確的PDF格式用戶指南。