關(guān)于Java加殼和代碼混淆
在C中,進(jìn)行代碼加密,首要經(jīng)過加殼的方法。所謂加殼,即是先將程序代碼加密,然后用特定的程序加載器,將代碼解密后加載進(jìn)內(nèi)存,這樣能夠在避免代碼的反編譯,當(dāng)然,有加殼東西,也有解殼東西,盡管不能100%避免crack,但仍然給代碼增加一層有力的維護(hù)。
然而在Java中,維護(hù)代碼是件很困難的工作,由于class文件十分標(biāo)準(zhǔn),很容易反編譯,且反編譯后的代碼明晰可讀。常見的維護(hù)辦法是運(yùn)用代碼混淆器,打亂class和function以及變量的姓名,能夠攪擾反編譯后的代碼的可讀性。盡管簡略提高了代碼的安全性,但還僅僅適當(dāng)于未加殼的C程序。
java能夠加殼嗎?曾經(jīng)我以為這是不能夠的,由于動(dòng)態(tài)加載代碼這樣的內(nèi)存等級(jí)的操作,java無法做到,除非運(yùn)用JNI(JavaNativeInterface),調(diào)用自個(gè)編寫的C代碼,在C代碼中完成動(dòng)態(tài)加載java代碼。可是,C如何加載java代碼呢?這需要對(duì)JVM適當(dāng)?shù)闹馈K云鋾r(shí)的我以為這是不能夠的。
然而,最近接觸的一些常識(shí)告訴我——java也能夠加殼!!
1.URLClassLoader。用URLClassLoader能夠在java程序的運(yùn)轉(zhuǎn)時(shí)間,再將文件夾或許jar加入到classpath中,這個(gè)特性事實(shí)上即是動(dòng)態(tài)加載。既然能夠動(dòng)態(tài)加載class的文件夾或許jar,為何不能夠加載加密后的classes呢,將classes用自個(gè)的方法加密,在URLClassLoader調(diào)用時(shí),運(yùn)用自個(gè)的方法解密。不即是達(dá)到了加殼的目的了嗎?不過解密的代碼放在何處是個(gè)疑問,即是說解殼器的代碼暴露在外,仍是很風(fēng)險(xiǎn)的。
2.javassist。這實(shí)在是一個(gè)十分奇特的新技能,我是在學(xué)習(xí)Tapestry5時(shí)首次遇到這個(gè)包的,他能夠動(dòng)態(tài)創(chuàng)立java字節(jié)碼,乃至能夠修正你現(xiàn)已寫好的函數(shù),比如你的getter和setter,僅僅簡略的讀取和賦值,你能夠在Runtime用他修正你的getter和setter,讓你的getter和setter每次調(diào)用時(shí)都能夠觸發(fā)某些代碼。憑借這項(xiàng)奇特的技能,必定能夠完成更強(qiáng)壯的動(dòng)態(tài)加載,加殼也就有了能夠。
posted on 2014-08-26 09:42 順其自然EVO 閱讀(1910) 評(píng)論(0) 編輯 收藏 所屬分類: 測試學(xué)習(xí)專欄