關於java加殼和程式碼混淆

kongjianxuanxing發表於2014-08-16


  在C中,進行,首要經過加殼的方法。所謂加殼,即是先將程式程式碼加密,然後用特定的程式載入器,將程式碼解密後載入進記憶體,這樣能夠在避免程式碼的反編譯,當然,有加殼東西,也有解殼東西,儘管不能100%避免crack,但仍然給程式碼增加一層有力的維護。

  然而在Java中,維護程式碼是件很困難的工作,由於class檔案十分標準,很容易反編譯,且反編譯後的程式碼明晰可讀。常見的維護辦法是運用器,打亂class和function以及變數的姓名,能夠攪擾反編譯後的程式碼的可讀性。儘管簡略提高了程式碼的安全性,但還僅僅適當於未加殼的C程式。

  java能夠加殼嗎?曾經我以為這是不能夠的,由於動態載入程式碼這樣的記憶體等級的操作,java無法做到,除非運用JNI(JavaNativeInterface),呼叫自個編寫的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每次呼叫時都能夠觸發某些程式碼。憑藉這項奇特的技能,必定能夠完成更強壯的動態載入,加殼也就有了能夠。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29588083/viewspace-1252438/,如需轉載,請註明出處,否則將追究法律責任。

相關文章