`
chinrui
  • 浏览: 97358 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

自定义加密的类加载器

    博客分类:
  • Java
阅读更多
自定义加密的类加载器

1、加载器初识
JVM有有三种类加载器:
*BootStrap加载JRE\lib\rt.jar
*ExtClassLoader加载JRE/lib/ext/*.jar
*AppClassLoader加载classpath指定目录下的类
2、自定义加载器
1)被加载的类
public class ClassAttachment {

	public ClassAttachment() {
		System.out.println("Hello,World");
	}

}


2)加密class的加密器
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Cypher {
	
	public static void main(String[] args) throws IOException {
		String srcPath =
              "D:\\Android\\reflect\\bin\\classloader\\ClassAttachment.class";
		String destPath = "cypherClass";
		String fileName = srcPath.substring(srcPath.lastIndexOf('\\') + 1);
		String destFilePath = destPath + "\\" + fileName;
		FileInputStream fis = new FileInputStream(srcPath);
		FileOutputStream fos = new FileOutputStream(destFilePath);
		cypher(fis, fos);
		fis.close();
		fos.close();
	}

	// 进行简单加密
	public static void cypher(InputStream is, OutputStream os) {
		int b;
		try {
			while ((b = is.read()) != -1) {
				os.write(b ^ 0xff);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


3)自定义的加载器
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class MyClassLoader extends ClassLoader {
	
	// 指定存放加密的class的目录
	private String classDir;
	
	public MyClassLoader() {
	}
	
	public MyClassLoader(String classDir) {
		this.classDir = classDir;
	}

	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		// 生成加密class文件信息
		String classFileName =
      classDir + "\\" + name.substring(name.lastIndexOf('.') + 1) + ".class";
		
		try {
			System.out.println("-----through MyClassLoader-----");
			FileInputStream fis = new FileInputStream(classFileName);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			// 解密
			Cypher.cypher(fis, baos);
			byte[] classByte = baos.toByteArray();
			fis.close();
			baos.close();
			
			// 根据byte[]生成Class
			return defineClass(null, classByte, 0, classByte.length);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return super.findClass(name);
	}
}

4)测试自定义的加载器
public class MyClassLoaderTest {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

		Class clazz =
   new MyClassLoader("cypherClass").loadClass("classloader.ClassAttachment");
		clazz.newInstance();
	}
}

测试方法:
新建一个cypherClass目录,通过加密器加密自动编译的ClassAttachment.class,用它覆盖掉原来的.class文件,由于,类加载的过程中,会先让上一级的加载器进行加载,如果,上一级的加载器没有找到要加载的class文件,才会让下一级的类加载器进行加载,由于AppClassLoader现在可以找到加密后的ClassAttachment.class文件,所以,会出现如下错误:
[color=red]
java.lang.ClassFormatError: Incompatible magic value 889275713 in class file classloader/ClassAttachment
[/color]
如果将原目录下的ClassAttachment.class文件删除掉,即让AppClassLoader找不到ClassAttachment.class文件,让下一级的类加载器进行加载,即自定义的加载器加载,程序运行成功:
运行结果:
-----through MyClassLoader-----
Hello,World
分享到:
评论

相关推荐

    自定义类加载器

    本文将深入探讨自定义类加载器的基本概念、工作原理以及如何创建一个简单的基于磁盘的自定义类加载器。 ### 类加载器的层次结构 Java中的类加载器通常形成一个树状的层次结构,其中Bootstrap ClassLoader是最顶层...

    java 类加载器 加密

    总结起来,Java 类加载器加密是一种增强程序安全性的技术,通过自定义类加载器和解密逻辑,可以在加载类之前对其进行加密,提高代码的保护性。同时,结合反射机制,即使类是加密状态,也能正常执行程序。这种技术常...

    Java加壳源码-自定义类加载器

    自定义类加载器允许开发者根据特定需求定制类的加载逻辑,例如在加载过程中进行加密、混淆等操作,以增加程序的保护层。 本文将深入探讨Java加壳源码和自定义类加载器的概念,以及如何利用它们来提升Java程序的安全...

    类加载器加载过程.rar

    开发人员可以根据需求自定义类加载器,这在实现动态加载、模块化系统或加密保护代码等方面非常有用。自定义类加载器需要继承java.lang.ClassLoader类,并重写findClass()方法,以便在需要的地方加载类的字节码。 五...

    黑马程序员------类加载器学习注意点

    在自定义类加载器时,需要重写`findClass()`方法,以实现自己的加载逻辑。 接着,类加载器与类的关系需要深入理解。每个类都有一个对应的类加载器,而类加载器之间存在父子关系,形成了层次结构。不同类加载器加载...

    深入探讨 Java 类加载器

    除了这三种系统类加载器,还可以自定义类加载器,满足特定的加载需求,例如加载网络上的类或加密后的类文件。 类加载器的代理模式体现在父子加载器的关系上。当一个类加载器尝试加载类时,它会先委托给父类加载器,...

    Java类加载器机制与模型.pdf

    自定义类加载器允许开发者根据特定需求编写自己的加载逻辑,比如加密类文件防止反编译,或者从网络、数据库等非传统源加载类。类加载器之间形成了一种层次结构,称为**类加载器层次体系**,每个类加载器都有明确的...

    java class loader(JAVA类加载器)

    理解类加载器的工作原理对于深入学习Java平台、优化应用程序性能以及实现自定义加载器至关重要。 1. **类加载器层次结构** Java中的类加载器分为三个主要层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载...

    JVM:类加载器子系统.pdf

    类加载器的分类包括引导类加载器(BootstrapClassLoader)和自定义类加载器(User-Defined ClassLoader)。引导类加载器是由Java虚拟机实现的,它负责加载Java的核心类库,例如 java.*开头的类。自定义类加载器是指...

    Java类加载器的详解

    4. **自定义类加载器(User-defined ClassLoader)**:用户可以根据需要创建自己的类加载器,用于加载特定位置的类,例如从网络、数据库或者加密文件中加载类。 类加载的过程遵循“双亲委派模型”: 1. **加载...

    深入java虚拟机(八)开发自己的类加载器 1

    通常,Java应用程序使用系统默认的类加载器已经能满足大部分需求,但在特定场景下,如动态加载类、加密类文件或从网络加载类等,开发者可能需要自定义类加载器。本篇文章将介绍如何开发自己的类加载器。 类加载器的...

    java类加载器和核心机制.pdf

    自定义类加载器也是Java灵活性的一个体现,例如可以通过网络、文件系统或加密方式加载类。线程上下文类加载器则允许在特定线程上下文中改变类加载器,以便加载特定的类。 服务器类加载原理则涉及到服务器如何管理类...

    java 类加载器学习笔记1

    Java的设计允许开发者创建自己的类加载器,实现如代码加密、热部署、从网络加载类等高级功能。 类加载机制遵循两个核心原则: 1. **委托代理加载机制**:当一个类加载器收到加载类的请求时,它首先将请求委托给其...

    深入研究Java的类加载机制.pdf

    自定义类加载器可以用来加载加密后的类文件、从数据库中加载类文件等。 Java类加载机制的应用: Java类加载机制有很多实际应用,例如: * 动态加载类文件:Java类加载机制可以在运行时刻动态地加载类文件,这使得...

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    例如,自定义类加载器可以用于实现热部署、类隔离、加密加载等高级功能。 总的来说,ClassLoader是Java平台的核心组件之一,它的设计和实现对于理解JVM的工作原理至关重要。深入学习ClassLoader不仅可以提高编程...

    CustomClassLoader:Java 自定义类加载器

    自定义类加载器允许开发者根据特定的需求定制类的加载过程,比如从非标准位置(如网络、数据库或自定义存储系统)加载类。下面我们将深入探讨自定义类加载器的概念及其创建方法。 首先,让我们理解一下Java中的类...

    Java类加载说明

    除了默认的类加载器,Java还允许我们自定义类加载器,这在实现模块化系统、插件系统或者加密类等场景下非常有用。自定义类加载器可以通过重写`loadClass()`方法来改变类的加载行为。 在实际应用中,Java的类加载...

    Java类加载器层次结构原理解析

    在实际应用中,开发者可以通过继承`ClassLoader`类创建自定义的类加载器,以满足特定的加载需求,例如加载非标准路径的类或者加密的类文件。通过自定义类加载器,可以实现动态加载、热部署等高级功能。 代码测试...

    j-classloader-ltr

    通过学习本教程,读者将能够了解类加载器的基本功能,并学会如何创建自定义的类加载器来扩展Java虚拟机(JVM)的功能。 #### 二、类加载器结构 类加载器在Java中扮演着极其重要的角色。它不仅负责加载类文件到内存中...

    Java动态类加载机制应用研究.pdf

    自定义类加载器可以扩展或替代默认的类加载器,实现一些特殊的加载策略,比如动态加载加密后的字节码文件,从而增强代码的安全性。 Java动态加载机制的原理是指类加载器按照需要加载类,这通常发生在类被首次引用时...

Global site tag (gtag.js) - Google Analytics