自定义classload加载自定义的class文件
2015-03-14 16:00
288 查看
大家知道,编译后的class文件如果不经过特殊处理,很容易被人反编译。
本文只是一个简单的例子。对class文件进行简单的加密。通过自定义的classload解密该class文件,
自定义一个classload:
上面的 getClassData 返回的就标准的class字节码的数组,这个函数里面你可以做很多东西。例如:可以在这个里面对自己定义的一些class文件进行解密,但是如果把解密方法写在这个里面由于该文件很容易被反编译,你的解密算法很易容被人知晓, 如果想在复杂的话,可以将该方法定义成native方法,把解密放到native方法中去实现,那样难度就变大了,一般的反编译软件就无能为力了,再强一点,可以把native方法所在的库进行加密加壳处理,当然这是后话。今天的例子很简单。
测试的类文件;
下面来测试下,看该类能否正常的加载到jvm中。
相关的知识可以参考以下链接:
http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#download
http://blog.csdn.net/aspdao/article/details/5309350
本文只是一个简单的例子。对class文件进行简单的加密。通过自定义的classload解密该class文件,
自定义一个classload:
import java.io.File; public class FileSystemClassLoader extends ClassLoader{ private String rootDir; public FileSystemClassLoader(String string){ this.rootDir=string; } protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] classData = getClassData(name); if (classData == null) { throw new ClassNotFoundException(); } else { return defineClass(name, classData, 0, classData.length); } } private byte[] getClassData(String className) { String path = classNameToPath(className); try { InputStream ins = new FileInputStream(path); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; int bytesNumRead = 0; while ((bytesNumRead = ins.read(buffer)) != -1) { baos.write(buffer, 0, bytesNumRead); } return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; } private String classNameToPath(String className){ System.out.println("OK!"); return rootDir+File.separatorChar+className.replace('.',File.separatorChar)+".class"; } }
上面的 getClassData 返回的就标准的class字节码的数组,这个函数里面你可以做很多东西。例如:可以在这个里面对自己定义的一些class文件进行解密,但是如果把解密方法写在这个里面由于该文件很容易被反编译,你的解密算法很易容被人知晓, 如果想在复杂的话,可以将该方法定义成native方法,把解密放到native方法中去实现,那样难度就变大了,一般的反编译软件就无能为力了,再强一点,可以把native方法所在的库进行加密加壳处理,当然这是后话。今天的例子很简单。
测试的类文件;
public class myLoadClassTest { private String names; private String addrs; public String getName() { return names; } public void setName(String name) { this.names = name; } public String getAddr() { return addrs; } public void setAddr(String addr) { this.addrs = addr; } @Override public String toString() { return "myLoadClassTest{" + "name='" + names + '\'' + ", addr='" + addrs + '\'' + '}'; } }
下面来测试下,看该类能否正常的加载到jvm中。
import java.lang.reflect.Field; public class myTest { public static void main(String[] args) { // TODO Auto-generated method stub FileSystemClassLoader fileSystemClassLoader=new FileSystemClassLoader("url"); try { Class<?> clazz= fileSystemClassLoader.loadClass("com.xxx.xxx.xxx.myLoadClassTest"); fileSystemClassLoader.clearAssertionStatus(); Field[] files=clazz.getDeclaredFields(); System.out.println(files[0].getName()); System.out.println(clazz); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
相关的知识可以参考以下链接:
http://www.ibm.com/developerworks/cn/java/j-lo-classloader/#download
http://blog.csdn.net/aspdao/article/details/5309350
相关文章推荐
- java加载jar包和自定义class文件加载
- java自定义ClassLoader加载指定的class文件
- mybatis-spring不能加载属性文件内容报:Cannot load JDBC driver class ${jdbc.driverClassName}'
- [无异常,才正常] 加载属性文件内容报:Cannot load JDBC driver class ${jdbc.driverClassName}'
- Eclipse开发过程中,加载类时候找不到class文件的解决方法
- jar文件运行时:Failed to load Main-Class manifest attribute from ......
- PHP - Smarty模板引擎 - Manual手册 - Chapter 7. Built-in Functions第7章 内建函数 - {config_load}用于从一个配置文件加载配置变量到模板中
- JVM加载class文件的原理机制
- jar文件运行时:Failed to load Main-Class manifest attribute from ......解决办法
- 异常详细信息: System.IO.FileLoadException: 未能加载文件或程序集
- 如何从EXCEL文件加载Hierarchy到BW (How to Load Hierarchy From Flat File)
- JVM加载class文件的原理机制
- classloader加载class的流程及自定义ClassLoader
- “class”类型重定义 || 防止头文件重复加载 || 两个类之间互相引用
- 【转】JVM加载class文件的原理机制
- JVM加载class文件的原理机制?
- 如何加载自定义的资源文件(pro.properties)
- 0day-java load dynamic library from any path(java加载任意目录库文件)
- 稳扎稳打Silverlight(31) - 2.0Tip/Trick之加载XAP, 加载XAML, 加载DLL, AppManifest.xaml文件说明, 自定义鼠标指针
- 通过 HTTP 加载 XML 文件时 Load 方法失败