、为什么要加密?
对于传统C或C的类语言来说要在Web上保护源代码是很容易只要不发布它就可以遗憾是Java源代码很容易被别人偷看只要有个反编译器任何人都可以分析别人代码Java灵活性使得源代码很容易被窃取但和此同时它也使通过加密保护代码变得相对容易我们唯需要了解就是JavaClassLoader对象当然在加密过程中有关Java Cryptography Extension(JCE)知识也是必不可少
有几种技术可以“模糊”Java类文件使得反编译器处理类文件效果大打折扣然而修改反编译器使的能够处理这些经过模糊处理类文件并不是什么难事所以不能简单地依赖模糊技术来保证源代码安全
我们可以用流行加密工具加密应用比如PGP(Pretty Good Privacy)或GPG(GNU Privacy Guard)这时最终用户在运行应用的前必须先进行解密但解密的后最终用户就有了份不加密类文件这和事先不进行加密没有什么差别
Java运行时装入字节码机制隐含地意味着可以对字节码进行修改JVM每次装入类文件时都需要个称为ClassLoader对象这个对象负责把新类装入正在运行JVMJVM给ClassLoader个包含了待装入类(比如java.lang.Object)名字串然后由ClassLoader负责找到类文件装入原始数据并把它转换成个Class对象
我们可以通过定制ClassLoader在类文件执行的前修改它这种技术应用非常广泛??在这里它用途是在类文件装入的时进行解密因此可以看成是种即时解密器由于解密后字节码文件永远不会保存到文件系统所以窃密者很难得到解密后代码
由于把原始字节码转换成Class对象过程完全由系统负责所以创建定制ClassLoader对象其实并不困难只需先获得原始数据接着就可以进行包含解密在内任何转换
Java 2在定程度上简化了定制ClassLoader构建在Java 2中loadClass缺省实现仍旧负责处理所有必需步骤但为了顾及各种定制类装入过程它还个新findClass思路方法
这为我们编写定制ClassLoader提供了条捷径减少了麻烦:只需覆盖findClass而不是覆盖loadClass这种思路方法避免了重复所有装入器必需执行公共步骤这切由loadClass负责
不过本文定制ClassLoader并不使用这种思路方法原因很简单如果由默认ClassLoader先寻找经过加密类文件它可以找到;但由于类文件已经加密所以它不会认可这个类文件装入过程将失败因此我们必须自己实现loadClass稍微增加了些工作量
最新评论