`
chinrui
  • 浏览: 94131 次
  • 性别: 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源代码

    加密Java源代码 ,使用自定义classloader加载器和加密解密技术实现

    service_classloader

    工程名为service_classloader,功能全部使用corejava实现,使用maven管理依赖,没有使用任何框架(junit除外)。 使用的技术主要包括:classlaoder,加密解密,...5.使用自定义类加载器加载经加密的字节码。 6.进行测试

    c# 加密和解密相关代码

    数据的加密与解密 文件的加密与解密 第 章 加密与解密技术 第19章 加密与解密技术 829 19.1 数据的加密与解密 实例571 异或算法对数字进行加密与解密 光盘位置:光盘\MR\19\571 中级 趣味指数: 实 例说明 在实现...

    Java代码保护工具全套源码(jShield)

    jShield是本人基于自定义类加载器技术开发的Java代码保护工具,可以加密保护Jar包或Class文件,适合需要保护Java程序的朋友使用和研究。 jShield是一款WinForm工具,通过图形化界面导入jar包或class文件后,即可...

    Unity3d C#加密、解密和加载文件(json、txt、xml等)(信息脱敏)功能源码工程

    工程包含了上述所有的功能和演示场景,包含了所有的编辑器扩展代码和测试功能源码,可以自由修改自定义功能,也可以通过 “Tools” &gt; “加密配置窗口”进行简单的加密配置后快速使用加密功能。\Assets\TestFiles为...

    多功能AES加密与解密软件(含帮助文档)

    用户可以通过在资源管理器的任意文件上单击鼠标右键,然后在快捷菜单中选择“加密文件”或“生成加密包”功能以进行文件的加密;在加密后文件(*.cryp)上单击鼠标右键,然后在快捷菜单中选择“解密文件”功能以进行...

    lockpicker:自动化Android引导加载程序unlockrelock以进行自定义ROM升级,备份等

    您已经安装了自定义的Android ROM并对设备进行了加密,但是现在物理攻击者可以使用未锁定的引导加载程序和开放式恢复功能来快速感染恶意软件或复制加密数据。 为减轻威胁,您可以从等工厂映像中恢复库存恢复,然后...

    TrueCrypt的国内延伸版本CnCrypt V1.11(单一文件绿色版)

    增加了与Windows资源管理器的集成(加载加密卷,保存至加密卷,粉碎选择文件) 去除了有关系统盘\系统驱动器部分(UEFI之后已无法支持之前实现方式) 增加加密卷擦除功能 增加密码生成器功能 增加了密码输入软键盘...

    TrueCrypt的国内延伸版本CnCrypt1.0

    增加了与Windows资源管理器的集成(加载加密卷,保存至加密卷,粉碎选择文件) 增加了悬浮框,支持拖放右键等功能 在子界面中增加了Banner 托盘菜单支持快速加载,支持加载历史记录,加载收藏卷等功能。 对加密卷...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    书中还深入讲述了其他ASP.NET图书遗漏的高级主题,如自定义控件的创建、图像处理、加密等。此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软...

    华为 java 安全 编码 规范 安全篇 2.0

    规则 5.5 编写自定义类加载器时应调用超类的getPermission()函数 规则 5.6 避免完全依赖URLClassLoader和java.util.jar提供的默认自动签名认证机制 规则 6.1 禁止给仅执行非特权操作的代码签名 规范 6.2 不要...

    vc++ 应用源码包_1

    操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个...

    WordPress响应式模块化通用企业网站主题ZingV2.2.1.zip

    代码无加密 支持对主题进行二次开发,代码没有任何加密 数据库优化清理 集成wp-clean-up插件,WordPress数据库优化 外链转内链 集成Simple Urls外链转内链插件,开启即可使用 站点地图(Sitemap) 自动生成xml...

    CE7.3源码.zip

    修复符号加载器完全崩溃在未知 pdb 符号数据 卢亚: 保存表不再要求在表上签名 如果省略按钮列表,消息对话将有效。(然后默认到 mbok) 添加更多自定义按钮 注册系统不再错误出整个脚本的失败。它现在覆盖现有符号...

    ASP.NET4高级程序设计(第4版) 3/3

    书中还深入讲述了其他ASP.NET图书遗漏的高级主题,如自定义控件的创建、图像处理、加密等。此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--布局加载器的获取 |--广播接收者之开机启动 |--广播接收者之获取管理员权限 |--广播接收者代码注册与卸载 |--广播接收者常用广播的获取 |--应用之分享(隐式意图) |--应用之卸载(隐式意图) |--应用之安装(隐式意图...

    Spring Boot中文文档.rar

    自定义重新启动类加载器 20.2.7.已知限制 20.3.LiveReload 20.4.全局设置 20.5.远程应用 20.5.1.运行远程客户端应用程序 20.5.2.远程更新 21.包装您的生产应用程序 22.接下来要阅读的内容 ...

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务

    支持数据库敏感配置信息 加密(可自定义) ENC()。支持每个数据库独立初始化表结构schema和数据库database。支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。支持 自定义注解 ,需继承DS(3.2.0+)。提供...

    Clever_Internet_Suite_v_9.2.0.0

    CertificateStore - 添加了为给定证书加载证书链的功能。 HTTP PATCH命令已实现。 SoapMessage - 改进了消息签名和验证性能。XmlCrlfEncode和XmlCrlfDecode方法已被替换。 SMIME - 增加了新的强加密和签名算法。 ...

Global site tag (gtag.js) - Google Analytics