日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java通过对.class文件字节码加密,不被轻易反编译出源代码,分析及其实现。

發布時間:2024/4/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java通过对.class文件字节码加密,不被轻易反编译出源代码,分析及其实现。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java通過對字節碼加密,不被輕易反編譯出源代碼。

分析:

JVM運行java文件是通過加載.class文件實現程序運行的,而且這個過程被我們稱為類加載機制
執行加載這個動作的是類加載器(java.lang.ClassLoader):
除了JVM自己實現的幾個加載器,我們還能通過繼承父類ClassLoader,重寫其findClass方法,實現自定義的類加載器

重點之一就是我們自己的類加載器,它在這其中扮演著解密被加密的class文件的角色(同時加載加密文件)。

自然有加密.class文件步驟,寫一個工具類完成這個角色。

其他的步驟是一些基本的文件流讀寫。

歸納一下思路:

1.加密.class文件:寫一個工具類,確定加密方法。
2.解密·.class文件: 自定義的類加載器類。
3.加載.class文件到JVM:自定義的類加載器類。(主要步驟)
4.驗證加載成功:測試類。

實現

1.加密.class文件:寫一個工具類,確定加密方法(此處取反)。
:根據路徑字節讀取class然后取反,再寫回文件。
:方法僅提供思路

/*** 加密類文件** @param name 類名* @return* @throws Exception*/public void enCryptClass(String name) {// 類文件路徑(絕對路徑)String path = ROOT_DIR + name.replace('.', '/') + ".class";int temp = 0;// 類文件讀寫FileInputStream inputStream = null;FileOutputStream fileOutputStream = null;ByteArrayOutputStream outputStream=new ByteArrayOutputStream();File file = null;try {// 讀文件file = new File(path);inputStream = new FileInputStream(file);// 注意讀寫沖突while ((temp = inputStream.read()) != -1) {// 寫入字節取反outputStream.write(temp^0XFF);}// 新建輸出流fileOutputStream = new FileOutputStream(file);} catch (Exception e) {e.printStackTrace();} finally {if (inputStream != null) {// 關讀Util.inputStreamClose(inputStream);}if (fileOutputStream != null) {// 寫文件try {fileOutputStream.write(outputStream.toByteArray());} catch (IOException e) {e.printStackTrace();}finally {// 關寫Util.outStreamClose(fileOutputStream);Util.outStreamClose(outputStream);}}}}

2.解密·.class文件: 自定義的類加載器類。
:取反,解密成功,返回明文class字節數組
:類加載器的方法

/*** 解密類文件** @param name 類名* @return* @throws Exception*/private byte[] deCryptClass(String name) {//字節寫(緩沖32字節)ByteArrayOutputStream outputStream = new ByteArrayOutputStream();// 類文件路徑String path = ROOT_DIR + name.replace('.', '/') + ".class";int temp = 0;FileInputStream inputStream = null;// 結果byte[] data = null;try {inputStream = new FileInputStream(path);while ((temp = inputStream.read()) != -1) {// 取反// 寫入字節outputStream.write(temp^0XFF);}data = outputStream.toByteArray();} catch (Exception e) {e.printStackTrace();} finally {if (inputStream != null) {Util.inputStreamClose(inputStream);}Util.outStreamClose(outputStream);return data;}}

3.加載.class文件到JVM:自定義的類加載器類。(主要部分)
:重寫findClass
:根據解密的字節數組,初始化類

/**自定義類加載器*/ public class CryptClassLoader extends ClassLoader {//variablepublic CryptClassLoader(String root_dir) {this.ROOT_DIR = System.getProperty("user.dir") + root_dir+"/";}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {Class<?> c = null;// 解密classbyte[] classData = deCryptClass(name);if (classData == null) {throw new ClassNotFoundException();} else {// 定義加載classtry {// 初始化c = defineClass(name.replace('/','.'), classData, 0, classData.length);}catch (ClassFormatError e){e.printStackTrace();}}if (c==null){throw new ClassNotFoundException();}return c;}}

4.驗證加載成功:測試類。
:先加密檢查,再解密檢查
:測試代碼
:注意類名的確定

CryptClassLoader cryptClassLoader = new CryptClassLoader("/target/classes");// // 加密cryptClassLoader.enCryptClass("com/j/main/sign/TestClass");// // 解密// try {// Class c = cryptClassLoader.findClass("com/j/main/sign/TestClass");// System.out.println(c);// System.out.println(c.newInstance().getClass().getClassLoader());// System.out.println(c.newInstance().getClass().getName());// } catch (Exception e) {// e.printStackTrace();// }

加密效果:
用idea打開.class后,沒有傳入的類的明文,但類確實不是0kb.

解密效果:

如果對類加載器的實現不清楚的,可以去看一看MLet的findClass。

總結

以上是生活随笔為你收集整理的java通过对.class文件字节码加密,不被轻易反编译出源代码,分析及其实现。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。