JAVA類加密的思路以及結果

  曾經做過一段時間的java類加密處理,我最終得到的結論是類無法安全加密,比較噁心到想破解的人的方法就是多加判定,然後混淆。這裏把加密的思路記錄下來,並記錄破解的方法,希望後續有相同想法的人拿來借鑑。

  場景

  很多時候有些處理我們不想讓別人知道,所以採用混淆的方法,但是混淆也帶來了一定的麻煩,那就是不能調試,遇到問題查找是個麻煩,於是想到通過加密類來解決這個問題。

  基本想法

  由於處理的手段不想讓別人知道,那麼處理的類需要被加密,最簡單就是需要加密的類單獨成一個jar包,然後這個jar包自己來做一個加密。這樣jar包的文件結構就被破壞了,無法正常被打開。

  衆所周知,java類是被classloader加載的,正常的classloader是沒有解密的功能的,所以我們需要一個自定義的classloader來做這個事情。同時解密的方法也暴露了出來。這就帶來了一個很大的麻煩,解密方法暴露了那就一點意義沒有了。

  爲了讓解密的方法隱藏起來,想到了用jni的方式來做解密的過程,然後用jni反調java中classloader的defineclass方法來做類的加載。並且返回一個加載後的對象。

  破解的方法

  因爲一直是圍繞着classloader來做的,所以實際走的還是java的方法,使用jni解密只是比java解密更難處理一點,但本質也是利用defineclass的方法來做的,所以本質的問題沒有改變,那就是得通過Java的機制來加載字節碼到內存。所以比較簡單的一個破解方法就是ClassFileTransformer,實現這個接口的話就會有如下的一個方法

  public byte[] transform(ClassLoader loader, String className, ClassclassBeingRedefined,

  ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException

  從這個方法中可以看到classloader,className,classfileBuffer(字節碼的byte數組),這裏可以獲取到類名和類的內容,只要寫出來,加密的部分就被還原了。使用的方法就是javaagent,有興趣的可以查看一下。

  結論

  依靠在classloader上做手腳是達不到保密的,破解方法就在上面可能比較暴力,但是是一個最簡單的破解方法。想簡單一些還是依靠混淆。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章