首 页 用户登录 | ![]() |
|||
|
|||
按字母检索 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
按声母检索 | A | B | C | D | E | F | G | H | J | K | L | M | N | O | P | Q | R | S | T | W | X | Y | Z | 数字 | 符号 |
|
![]() |
您的位置: 5VAR论文频道 → 论文中心 → 计算机论文 → 计算机网络 |
|
|||||
JAVA 类文件保护分析与研究 | |||||
收集整理:佚名 来源:本站整理 时间:2009-01-10 10:09:23 点击数:[] ![]() |
|||||
Class 文件进行加密, key 为用来加密的密钥,classData 为所读到的待加密 Class 文件, 返回结果为加密后的 Class 文件,然后将其写回原来的 Class 中,保证结构的完整性。 在加载类后,系统的默认 findClass()并未对加载的类作任何处理,由于 Class 文件已被 加密过,此时若运用系统方法 findClass()则会抛出 ClassNotFoundException()的异常,所 以这里需要重构我自己的 findClass()方法: protected Class findClass(final String name) throws ClassNotFoundException { final String classResource = name.replace('.', '/') + ".class"; final URL classURL = getResource(classResource); InputStream in = null; File file = new File(classURL.getPath()); byte[] classBytes = new byte[(int)file.length()]; FileInputStream fin = new FileInputStream(file); fin.read(classBytes); …… classBytes = decrypt(classBytes); //解密 …… return defineClass(name, classBytes, 0, classBytes.length); } 在这个函数中,我运用 decrypt(classBytes);方法对所有的加密 Class 文件进行解密,并 在其中调用方法 public static byte[] symmetricEncrypto(byte[] key, byte[] byteSource){}将解密 后的 Class 文件保存直原文件处,保持文件目录级别不变, key 为解密密钥,byteSource 为待 解密的 byte 型文件。至此,已完成对类文件的加密和解密,经过测试,功能已实现,Class 文件无法被反编译。但为进一步加强程序的安全性,我做了如下的处理。 第三,对包 含有关键信 息的方法进 行代码混淆 处理 。在 上述内容中 ,方 法 symmetricEncrypt(byte[] key, byte[] classData) 包含有加密 所用到的 算法,自 定义的 ClassLoader 包含有关键信息,findClass(final String name)以及 decrypt(classBytes);中包含有解 密信息,由于它们本身不是被加密的,因此它可能成为黑客最先攻击的目标。如果相关的解密密钥和算法被攻克,那么被加密的类也很容易被解密。所以这里我对这些关键代码进行代 码混淆。代码混淆是对代码进行重新组织和处理,使得处理后的代码与处理前的代码完成相 同的功能,但是混淆后的代码很难被反编译。代码混淆有符号混淆、数据混淆、控制混淆和 预防性混淆。这里我采用数据混淆对关键代码进行处理。 public static byte[] symmetricEncrypt(byte[] key, byte[] classData) {…};处理如下: //rawKey,byteSource 为 symmetricEncrypt(byte[], byte[])的待传入参数 byte[] tempkey = null; tempkey [0] = 0x00; for (int i = 0; i < key.length; i++) tempkey [i+1] = key[i]; tempkey [key.length + 1] = 0x11;
source[0] = 0x00; for(int i = 0; i < classData.length; i++) source[i+1] = classData[i]; source[classData.length + 1] = 0x11; public static byte[] symmetricEncrypt(byte[]tempkey, byte[]source) { //取 tempkey 和 source 的除第一个和最后一个 byte 的值
} 对 public Class loadClass(final String tempname, final boolean resolve){}方法进行处理: String tempname = "abcdefg" + name ; //name:loadClass 的第一个待传入参数 public Class loadClass(final String tempname, final boolean resolve){ String name = tempname.substring(11,tempname.length()); ...... } 对 findClass(String name){}方法进行处理: //name 为 findClass(String name)待传入参数,先做如下处理 addname = name + "01357924680"; protected Class findClass(final String addname){ name = addname.substring(0,addname.length()-11); ...... //fingClass 其他工作 } int len; //len = 待传文件 file 的长度:file.length() byte[] classBytes = new byte[(int) len]; classBytes[len + 1] = 0x00; classBytes[len + 2] = 0x11; //classBytes 作为 decrypt(byte[] classBytes)的传入参数 private static byte[] decrypt(final byte[] classBytes){ byte[] data = new byte[(int)classByte.lengt - 2]; for(int i = 0; i < data.length; i++) data[i] = classBytes[i]; ...... //解密工作 } 5. 结论 Tags: |
提供人:佚名 | |
【返回上一页】【打 印】【关闭窗口】 |
![]() |
5VAR论文频道 |
![]() |
5VAR论文频道 |
最新热点 | 最新推荐 | 相关新闻 | ||
|
|
![]() |
关于本站 -
网站帮助 -
广告合作 -
下载声明 -
网站地图
Copyright © 2006-2033 5Var.Com. All Rights Reserved . |