轉(zhuǎn)帖|其它|編輯:郝浩|2010-07-21 09:45:12.000|閱讀 734 次
概述:然而在Java世界,保護(hù)代碼是件很困難的事情,因?yàn)閏lass文件非常規(guī)范,極易反編譯,且反編譯后的代碼清晰可讀。常見的保護(hù)辦法是使用混淆器,打亂class和function以及變量的名字,可以干擾反編譯后的代碼的可讀性。雖然簡單提高了代碼的安全性,但還僅僅相當(dāng)于未加殼的C程序。最近接觸的一些知識告訴我——java也可以加殼!!
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在C世界,對代碼進(jìn)行加密,主要通過加殼的方式。所謂加殼,就是先將程序代碼加密,然后用特定的程序加載器,將代碼解密后加載進(jìn)內(nèi)存,這樣可以在防止代碼的反編譯,當(dāng)然,有加殼工具,也有解殼工具,雖然不能100%防止crack,但仍然給代碼增加一層有力的保護(hù)。
然而在Java世界,保護(hù)代碼是件很困難的事情,因?yàn)閏lass文件非常規(guī)范,極易反編譯,且反編譯后的代碼清晰可讀。常見的保護(hù)辦法是使用混淆器,打亂class和function以及變量的名字,可以干擾反編譯后的代碼的可讀性。雖然簡單提高了代碼的安全性,但還僅僅相當(dāng)于未加殼的C程序。
java可以加殼嗎?以前我認(rèn)為這是不可能的,因?yàn)?動態(tài)加載代碼這樣的內(nèi)存級別的操作,java無法做到,除非使用JNI(JavaNativeInterface),調(diào)用自己編寫的C代碼,在C代碼中實(shí)現(xiàn)動態(tài)加載java代碼。但是,C如何加載java代碼呢?這需要對JVM相當(dāng)?shù)牧私狻K援?dāng)時(shí)的我認(rèn)為這是不可能的。
然而,最近接觸的一些知識告訴我——java也可以加殼!!
1.URLClassLoader。用URLClassLoader可以在java程序的運(yùn)行期間,再將文件夾或者jar加入到classpath中,這個(gè)特性事實(shí)上就是動態(tài)加載。既然可以動態(tài)加載class的文件夾或者jar,為何不可以加載加密后的classes呢,將classes用自己的方式加密,在URLClassLoader調(diào)用時(shí),使用自己的方式解密。不就是達(dá)到了加殼的目的了嗎?不過解密的代碼放在何處是個(gè)問題,就是說解殼器的代碼暴露在外,還是很危險(xiǎn)的。
2.javassist。這實(shí)在是一個(gè)非常神奇的新技術(shù),我是在學(xué)習(xí)Tapestry5時(shí)第一次遇到這個(gè)包的,他可以動態(tài)創(chuàng)建java字節(jié)碼,甚至可以修改你已經(jīng)寫好的函數(shù),比如你的getter和setter,只是簡單的讀取和賦值,你可以在Runtime用他修改你的getter和setter,讓你的getter和setter每次調(diào)用時(shí)都可以觸發(fā)某些代碼。借助這項(xiàng)神奇的技術(shù),一定可以實(shí)現(xiàn)更強(qiáng)大的動態(tài)加載,加殼也就有了可能。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載