關於java類加密的思路以及結果

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

場景

        不少時候有些處理咱們不想讓別人知道,因此採用混淆的方法,可是混淆也帶來了必定的麻煩,那就是不能調試,遇到問題查找是個麻煩,因而想到經過加密類來解決這個問題。數組

基本想法

        因爲處理的手段不想讓別人知道,那麼處理的類須要被加密,最簡單就是須要加密的類單獨成一個jar包,而後這個jar包本身來作一個加密。這樣jar包的文件結構就被破壞了,沒法正常被打開。安全

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

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

        下面介紹一些jni的經常使用用法spa

        jni對字符串的處理 https://my.oschina.net/xpbob/blog/600133.net

        jni對一維數組的處理 https://my.oschina.net/xpbob/blog/600453調試

        jni對二維數組的處理 https://my.oschina.net/xpbob/blog/600788code

        jni對對象的處理 https://my.oschina.net/xpbob/blog/601237orm

        jni對不一樣平臺的處理和異常處理 https://my.oschina.net/xpbob/blog/601251

        當時在多個平臺上測試,而且記錄了對應平臺的編譯方法 https://my.oschina.net/xpbob/blog/610809

破解的方法

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

public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
            ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException

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

結論

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

相關文章
相關標籤/搜索