程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 淺談Java加殼的問題

淺談Java加殼的問題

編輯:關於JAVA

在C世界,對代碼進行加密,主要通過加殼的方式。所謂加殼,就是先將程序代碼加密,然後用特定的程序加載器,將代碼解密後加載進內存,這樣可以在防止代碼的反編譯,當然,有加殼工具,也有解殼工具,雖然不能100%防止crack,但仍然給代碼增加一層有力的保護。

然而在Java世界,保護代碼是件很困難的事情,因為class文件非常規范,極易反編譯,且反編譯後的代碼清晰可讀。常見的保護辦法是使用混淆器,打亂class和function以及變量的名字,可以干擾反編譯後的代碼的可讀性。雖然簡單提高了代碼的安全性,但還僅僅相當於未加殼的C程序。

Java可以加殼嗎?以前我認為這是不可能的,因為動態加載代碼這樣的內存級別的操作,Java無法做到,除非使用JNI(Java Native Interface),調用自己編寫的C代碼,在C代碼中實現動態加載Java代碼。但是,C如何加載Java代碼呢?這需要對JVM相當的了解。所以當時的我認為這是不可能的。

然而,最近接觸的一些知識告訴我——Java也可以加殼!!

1.URLClassLoader

用URLClassLoader可以在Java程序的運行期間,再將文件夾或者jar加入到classpath中,這個特性事實上就是動態加載。既然可以動態加載class的文件夾或者jar,為何不可以加載加密後的classes呢,將classes用自己的方式加密,在URLClassLoader調用時,使用自己的方式解密。不就是達到了加殼的目的了嗎?不過解密的代碼放在何處是個問題,就是說解殼器的代碼暴露在外,還是很危險的。

2.Javassist

這實在是一個非常神奇的新技術,我是在學習Tapestry5時第一次遇到這個包的,他可以動態創建Java字節碼,甚至可以修改你已經寫好的函數,比如你的getter和setter,只是簡單的讀取和賦值,你可以在Runtime用他修改你的getter和setter,讓你的getter和setter每次調用時都可以觸發某些代碼。借助這項神奇的技術,一定可以實現更強大的動態加載,加殼也就有了可能。

讓我有些不爽的是,Javassist又是小日本創建的項目。

備注:Javassist是一個開源的分析、編輯和創建Java字節碼的類庫。是由東京技術學院的數學和計算機科學 系的 Shigeru Chiba 所創建的。它已加入了開放源代碼JBoss 應用服務器項目,通過使用Javassist對字節碼操作為JBoss實現動態AOP框架。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved