2009-12-10 93 views
2

正如我們所知,有很多java反編譯器工具可以將.cl​​ass轉換爲.java文件。如何保護Java代碼免受反編譯?

因此,我們需要保護我們的.java文件免受反編譯器的影響。我知道這是一個很大的話題,也許沒有結局。

通常,有兩種方式:混淆器和自定義類加載器。

是否有任何成熟的解決方案或開源框架,它們結合了這兩種方式?

另一個方面與exe4j有關,它將jars包裝到exe文件中,似乎可以保護java代碼,因爲我們可以看到的是exe文件而不是jar文件或類文件。但實際上,當它運行時,它會將所有jar文件分解爲臨時目錄,這意味着很容易獲取反編譯器的類文件。 因此,從exe4j方面保護java代碼的任何考慮?

感謝您的意見和建議。

正在更新

感謝大家的建議或經驗分享。這對我很有幫助。爲了得出結論,我將放棄任何混淆器或定製類加載器加密的東西。因爲最終Java代碼可以在聰明的黑客之前被披露。

我將在編譯時使用C#語言中的「#ifdef」等技巧刪除一些核心代碼。在Java中,可以使用靜態和最終的布爾類變量來完成相同的工作。 然後編譯的類文件將不包含需要保護的java代碼。

+0

重複的問題? – 2009-12-10 07:11:03

+0

是的,這是一個重複的:http://stackoverflow.com/questions/49379/how-to-lock-compiled-java-classes-to-prevent-decompilation – David 2009-12-10 07:13:20

+5

使用開源框架來創建閉源產品。有趣。 – 2009-12-10 07:25:34

回答

12

您無法保護反編譯器和惡意用戶的類文件。但是,反編譯器的輸出可能不是有效的java。

最好的方法是記錄你的API(假設這可供你的客戶使用)和應用程序非常好。並讓您的支持人員能夠解決API和應用程序問題。那麼你的客戶將沒有理由想要使用反編譯器來探索爲什麼事情不能正常工作。

+0

我們只是想提供免費的演示版本供任何人試用。但是怕黑客可以反編譯並獲取java代碼。 因此,第一步是使用這個技巧刪除一些核心數據或核心代碼:http://stackoverflow.com/questions/1813853/ifdef-ifndef-in-java 第二步將考慮一些反反編譯器方法。 那麼我聽到你說「你不能保護反編譯器和惡意用戶的類文件」,我會放棄任何反反編譯器解決方案。 「 – Forrest 2009-12-10 07:24:16

+6

」您無法保護反編譯器和惡意用戶的類文件。「 :) 無法通過反編譯器來解析類文件。如果是這樣,它也將被保護,不會在Java-VM中運行,因此無用,因爲無法將解釋和反編譯區分開來(從類文件的角度來看)。 – Kosi2801 2009-12-10 07:35:33

10

軟件即服務。

+0

確實。現在SaaS似乎非常受歡迎。有些人甚至設想,大多數應用程序將在幾年內作爲Saas提供。通過像GWT,Vaadin或ICE Faces這樣的工具,可以爲他們的應用程序創建非常好的用戶界面。 – 2009-12-10 06:53:49

6

這是特別有效的唯一辦法就是:把你的程序作爲某種形式的網絡服務,使編譯後的代碼是從來沒有提供對終端用戶機。

下一個最有效的解決方案是實踐中廣泛使用的解決方案,它使您的程序變得如此糟糕以至於沒有人願意使用它,或者花費時間對其進行逆向工程。但我懷疑發生這種情況通常是偶然的。

1

事實上,不僅Java,Silverlight和Flash也有同樣的問題。任何下載了該軟件包的人都可以解壓然後反編譯來反編譯你的代碼。

我同意Saas將會是最好的解決方案,它擁有Web服務來處理所有底層邏輯並提供數據,爲最終客戶端建立一個相對安全的隔離層來消費數據。

+0

對於核心邏輯,可以使用C++來生成dll文件,然後Java使用JNIWrapper將其打包。 – Forrest 2009-12-10 07:36:29

1

我的建議是,如果您真的認真對待這個問題,那麼您應該只向已簽署具有法律約束力的保密協議的人員發佈演示軟件。如果他們違反了協議,準備去法庭。

通過一切手段,混淆你的演示應用程序等,但不要想象這將阻止一個確定的黑客發現你的應用程序中的「祕密醬油」。從理論上和實踐上來說,不可能是以防止這種情況。如果您使用付費許可模式將軟件貨幣化,盜版是不可避免的。

(實際上,它在理論上是可能的,但只有像TPM一個完全安全的平臺,而這是不適合你的選擇。相信我。)

0

希望加密的類文件,並使用自定義什麼classloader加載你的類文件?

+1

不起作用(請參閱http://www.javaworld.com/javaworld/javaqa/2003-05/01-qa-0509-jcrypt.html)。這些類必須解密才能運行它們,因此您可以在此處獲取未加密的版本。 – 2009-12-10 12:38:42

0

一切都是可以破解的。只需擁有一份可靠的EULA,並將努力放在那裏,而不是浪費他們去保護代碼的絕望嘗試。

18
  1. 您可以使用混淆器,如ProGard或Ygard,但解密字符串並重命名類,字段和方法並不太複雜。
  2. 您可以使用私鑰加密您的類,並使用自定義類加載器在加載到內存之前使用公鑰解密您的類,但修改類加載器以保存到光盤上並不太複雜,所有加載的類。
  3. 你可以嘗試崩潰反編譯器。 JAD是最好的反編譯器之一,但是如果您在常量池中添加損壞的條目,則所有由JAD驅動的產品都會崩潰。但是,一些反編譯器仍在工作。

保護軟件的唯一方法是將其部署到SaaS/PaaS中。

但保持一個人的頭腦:大多數人使用反編譯器,因爲他們有技術問題,文檔很差或不存在。編寫一個好的文檔並使用一個可靠的EULA是更好的解決方案。