| if (parent == null) throw new IllegalArgumentException ("EncryptedClassLoader" + " requires a non-null delegation parent"); } /** * De/encrypts binary data in a given byte array. Calling the method again * reverses the encryption. */ private static void crypt (final byte [] data) { for (int i = 8; i < data.length; ++ i) data [i] ^= 0x5A; } ... more helper methods ... } // End of class |
这个累加载器(EncryptedClassLoader)有两个基本的操作,在给定的类路径下加密一系列Class文件并且运行一个先前加密的程序。加密后的文件很简单,有一些极讨厌的各个字节的位组成。(当然,XOR运算符不可能被加密,这只是一个范例,请多多包涵。)
通过EncryptedClassLoader来加载类需要注意一些问题,我实现的是继承自java.net.URLClassLoader并且重载了loadClass()和defineClass()两个方法来实现自己的两个功能。一个是专心于JAVA 2 类加载器的委托规则并且在系统类加载器做之前先加载一个经加密过的类;二是在执行defineClass()之前立即调用crypt()方法,否则会执行URLClassLoader.findClass()。
执行下面的语句:
| >javac -d bin src/*.java src/my/secret/code/*.java 我把Main.class和MySecretClass.class进行了.加密: >java -cp bin EncryptedClassLoader -encrypt bin Main my.secret.code.MySecretClass encrypted [Main.class] encrypted [my\secret\code\MySecretClass.class] |
现在原先编译的class文件已经被加密后的文件所替代了,如果我想运行原始类文件,需要使用EncryptedClassLoader来操作:
| >java -cp bin Main Exception in thread "main" java.lang.ClassFormatError: Main (Illegal constant pool type) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:502) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) at java.net.URLClassLoader.defineClass(URLClassLoader.java:250) at java.net.URLClassLoader.access$100(URLClassLoader.java:54) at java.net.URLClassLoader$1.run(URLClassLoader.java:193) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:186) at java.lang.ClassLoader.loadClass(ClassLoader.java:299) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265) at java.lang.ClassLoader.loadClass(ClassLoader.java:255) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315) >java -cp bin EncryptedClassLoader -run bin Main decrypted [Main] decrypted [my.secret.code.MySecretClass] secret result = 1362768201 |
现在可以确信,采用任何反编译工具对加密后的Class文件都不会起作用的。
现在添加一个可靠的密码保护机制,把它打包成本地可执行文件,并且使其对外收费。这样子可以吗?当然不能这样了。
浏览地址: http://www.qqrea
d.com/itlife/t912737010.html

更多内容请看
加密与解密技术、
常用软件加密宝典、
Java环境安装配置专题,或
进入讨论组讨论。
【深 度 阅 读】 相 关 文 章