2008-08-15 45 views
50

我想知道是否有人在他自己的商業產品上使用商業/免費Java混淆器。我只知道一個項目實際上在發佈的ant構建步驟中有一個模糊的步驟。你是否混淆了商業Java代碼?

你混淆了嗎?如果是這樣,你爲什麼混淆?

它真的是一種保護代碼的方式,還是對開發人員/管理人員來說更好?

編輯:好吧,我確切地說我的觀點:你是否混淆保護你的IP(你的算法,你已經放入產品的工作)?出於安全原因,我不會混淆視聽,這不太合適。所以我只是在談論保護你的應用程序代碼免受競爭對手的侵害

@staffan好點:

遠離鏈碼流走的原因是,一些變化使得它不可能爲JVM能夠有效地優化代碼。實際上,它實際上會降低應用程序的性能。

+1

我還沒有看到一個很好的混淆呢,但也許你想看看這個線程,甚至是有關.NET:[http://stackoverflow.com/questions/12075/should-i-be-worried - 關於-obfusicating - 我的網碼(http://stackoverflow.com/questions/12075/should-i-be-worried-about-obfusicating-my-net-code) – 2008-08-15 09:16:17

回答

60

如果混淆,從通過改變代碼流和/或添加例外塊,這樣使它難以拆解修改代碼混淆器望而卻步。爲了使代碼不可讀,只需更改方法,字段和類的所有名稱即可。

遠離改變碼流走的原因是,一些變化使得它不可能爲JVM以有效地優化代碼。實際上,它實際上會降低應用程序的性能。

+7

聽起來像我過早優化。 – NateS 2014-01-30 18:48:28

7

我想這真的可以歸結爲什麼您的Java代碼是,它是如何分佈的,誰你的客戶。我們不會混淆任何東西,因爲我們從來沒有發現過一個特別好的東西,它往往比它的價值更麻煩。如果有人能夠訪問我們的JAR文件並且知道能夠在裏面嗅探,那麼比起剝離我們的源代碼更令人擔心的是他們可以做的事情。

17

我使用proguard進行JavaME開發。它不僅非常擅長將jar文件製作得更小(對於移動設備來說是必不可少的),但它可以作爲一種更好的方式來執行特定於設備的代碼,而無需使用IDE等不友好的預處理工具,如天線。

E.g.

public void doSomething() 
{ 
    /* Generated config class containing static finals: */ 
    if (Configuration.ISMOTOROLA) 
    { 
     System.out.println("This is a motorola phone"); 
    } 
    else 
    { 
     System.out.println("This is not a motorola phone"); 
    } 
} 

這被編譯,混淆和類文件結束了,彷彿你已經寫:

public void doSomething() 
{ 
    System.out.println("This is a motorola phone"); 
} 

所以,你可以有代碼變種,以解決在JVM /庫實現製造商的錯誤,而不填充最終的可執行類文件。

我相信某些商業混淆器也可以在某些情況下將類文件合併在一起。這很有用,因爲您擁有的課程越多,您在zip(jar)文件中的開銷就越大。

+0

事實上,相對於條件代碼中,Java規範要求編譯器像這樣丟棄一個死代碼,前提是條件是通過靜態錯誤表達式分配的。 Proguard可以做哪些事情。 – 2017-01-10 03:13:10

13

今年我花了一些時間嘗試各種Java混淆器,我發現先行的一個要數:JBCO。不幸的是,設置起來有點麻煩,並且沒有GUI,但就其產生的混淆程度而言,它是無與倫比的。您嘗試餵養它一個簡單的循環,如果你的反編譯器不會崩潰試圖加載它,你會看到這樣的事情:

if(i < ll1) goto _L6; else goto _L5 
_L5: 
    char ac[] = run(stop(lI1l)); 
    l7 = (long)ac.length << 32 & 0xffffffff00000000L^l7 & 0xffffffffL; 
    if((int)((l7 & 0xffffffff00000000L) >> 32) != $5$) 
    { 
     l = (long)III << 50 & 0x4000000000000L^l & 0xfffbffffffffffffL; 
    } else 
    { 
     for(l3 = (long)III & 0xffffffffL^l3 & 0xffffffff00000000L; (int)(l3 & 0xffffffffL) < ll1; l3 = (long)(S$$ + (int)(l3 & 0xffffffffL))^l3 & 0xffffffff00000000L) 
     { 
      for(int j = III; j < ll1; j++) 
      { 
       l2 = (long)actionevent[j][(int)(l3 & 0xffffffffL)] & 65535L^l2 & 0xffffffffffff0000L; 
       l6 = (long)(j << -351) & 0xffffffffL^l6 & 0xffffffff00000000L; 
       l1 = (long)((int)(l6 & 0xffffffffL) + j) & 0xffffffffL^l1 & 0xffffffff00000000L; 
       l = (long)((int)(l1 & 0xffffffffL) + (int)(l3 & 0xffffffffL)) << 16 & 0xffffffff0000L^l & 0xffff00000000ffffL; 
       l = (long)ac[(int)((l & 0xffffffff0000L) >> 16)] & 65535L^l & 0xffffffffffff0000L; 
       if((char)(int)(l2 & 65535L) != (char)(int)(l & 65535L)) 
       { 
        l = (long)III << 50 & 0x4000000000000L^l & 0xfffbffffffffffffL; 
       } 
      } 

     } 

    } 

你不知道的Java不得不轉到的?那麼,JVM支持他們=)

+6

在機器代碼級別(因此在字節碼中,這是與機器無關的機器代碼),所有計算機都使用goto。循環只是轉到/條件結構。有意思的是,繼續和休息不過是限制使用標籤(有時標籤是推斷的,而不是顯式的)。 – 2011-04-27 05:55:41

+3

JBCO的不足之處在於它是研究質量代碼。我甚至無法讓它在簡單的測試用例上運行,而文檔幾乎不存在。 – Antimony 2012-10-23 20:53:34

+0

我想再加一個想法......如果這真的是「簡單循環」的結果,那麼它會付出高昂的效率代價,以換取使反向工程代碼難以理解和模糊。 – 2017-01-10 03:07:45

13

我用ProGuard,並強烈推薦它。儘管混淆確保了您的代碼不受臨時攻擊者的影響,但其主要好處是可以最小化刪除未使用的類和方法的效果,並將所有標識符縮短爲1或2個字符。

12

我認爲,大多數情況下,混淆是毫無意義的:即使使用完整的源代碼,通常也很難弄清楚它的意圖是什麼(假設沒有註釋,並且沒有有意義的局部變量名稱 - 這是從字節碼重新生成源的情況)。迷惑只是裝飾蛋糕。

我覺得開發商尤其是他們的經理往往會極大地過分誇大有人看到源代碼的風險。雖然好的反編譯器可以生成漂亮的源代碼,但使用它並不是一件容易的事情,而且相關的成本(更不用說法律風險)足以使這種方法很少有用。我只反編譯調試關閉源供應商產品的問題(DB抽象層中的死鎖,呃)。 Bytecode實際上被混淆了,我想,但我們仍然發現了底層問題 - 這是一個實際的設計問題。

25

我認爲模糊的舊(傳統)方式正在逐漸失去它的意義。因爲在大多數情況下,經典的混淆器破壞堆棧跟蹤(這不利於支持您的客戶端)

時下主要的一點不是保護一些算法,而是爲了保護敏感數據:API登錄/密碼/鍵,代碼該負責許可(盜版仍然在這裏,特別是西歐,俄羅斯,亞洲,恕我直言),廣告帳戶ID等

有趣的事實:我們在字符串中的所有這些敏感數據。其實絃樂約佔我們應用程序邏輯的50-80%。 在我看來,混淆的未來是「字符串加密工具」。 AllatoriZelix KlassMasterSmokescreenStringer Java Obfuscation ToolkitDashO

但現在 「字符串加密」 功能只適用於商業混淆器,如可用。

N.B. 我是Licel LLC的首席執行官。 Stringer Java混淆器的開發者。