在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又是小曰本創建的項目。
http://www.open-open.com/open54954.htm
Javassist是一個開源的分析、編輯和創建Java字節碼的類庫。是由東京技術學院的數學和計算機科學 系的 Shigeru Chiba 所創建的。它已加入了開放源代碼JBoss 應用服務器項目,通過使用Javassist對字節碼操作為JBoss實現動態AOP框架。