`
cloudtech
  • 浏览: 4610278 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

可以修改类结构的java HostSwap实现思想

 
阅读更多

前段时间做动态无侵入拦截的工作,对于“即时加载”新类有了一些较深入的理解,已经写出两篇文章在这里。

我们已经解决了“如何修改”的问题,但是另一个问题是“能修改成什么样子”。

利用Instrumentation来动态redefine的类,只能修改方法,即在原有的方法代码插入代码来实现我们需要的逻辑。

却无法增加,删除方法和字段,即修改类定义的结构。

目前真正能做到“即时”加载结构已经被修改的新的class的工具就是javarebel.但这个工具是一个收费的(免费的功能有限)

工具,其它还没见到有相同功能的工具,其实这种需求是很强烈的,特别是在开发阶段,新修改一个类的实现,特别是类的结构。

希望能在不重启的情况下能即时看到效果。而实际上只javarebel能做到,说明这个技术还是有些小难度的。

经过非人的折磨(看混淆过的反编译码还不如直接看字节码更明白),基本弄懂了某个工具的实现原理(传说为了研究目的进行

某些工作可以原谅的,也正是因为这个原因可能会引起不必要的麻烦,所以不写具体的代码,只做原理性的记录在这里)。

当然,对于从class读懂了它的字节码,crack是相当简单滴了。

首先,把JDK中几个基本类的源码拿过来修改。

ClassLoader,Class,Enum,Constructor,Field,Method,Proxy.这几个类,其实还有其它几个ObjectStreamClass,URLClassLoader,PropertyResourceBundle,ResourceBundle$Control这几个类都需要修改。但是

从原理上讲对于最小模型我们先动ClassLoader,Class,Enum,Constructor,Field,Method,Proxy.

现在假设有一个class:

class A{

int x = 0;

}

要加载这个类,一定不能被JRE的默认ClassLoader加载,因为类一旦在JVM中露头,你在redefin时只能修改它的方法体而不能

修改它的结构了。所以我们要修改ClassLoader,当加载类A的时候,我们利用字节码生成器生成一个A$$ver1.class,其中A的

所有方法都在A$$ver1中实现,并反回这个A$$ver1的Class引用。

这里我们就需要修改Class,Constructor,Field,Method这几个基础类了。比如Class的getName(),当A$$ver1.class.getName()时

在return name前需要

int index = name.indexOf("$$ver");

if(index != -1) name = name.subString(0,index);

而Class.forName(String name)时我们则需要

修改成name = name + "$$verx";//这个x可以用一个全局的map保存原始类和当前版本的对应表。

还有Constructor,Method,Field这些反射方法,都要修改,即load A时,我实际是动态生成了A$$ver1.class,所以这些类中对应的方法中

要修改成实际上找A$$ver1来对应A的逻辑。

这时如果我们修改了A:

class A{

int x = 0;

int y = 0;

}

当扫描发现类结构被修改后,被crack过的ClassLoader又动态生成一个A$$ver2.class,当然修改后的方法和字段都生成在A$$ver2.class中,这里映射表中把A的对应类换成A$$ver2,所以Class类,Constructor,Field,Method,Proxy这些基础类访问A.class时都知道直接去访问A$$ver2.class,原来的A$$ver1.class就放弃了。

这样实际上每次修改A时底层实际上是生成了不同版本的它的替身,然后通过被crack过的基础类ClassLoader,Class,Enum,Constructor,Field,Method,Proxy就能达到动态“加载”目的。

前提是这几个被crack过的基础类一定要在Boot-Classpath中,先于JRE的原始的基础类工作。

分享到:
评论

相关推荐

    JAVA链表实现类(数据结构学习)

    JAVA链表实现类(数据结构学习).chm

    文本分类java 实现

    java 代码实现的网络新闻文本自动分类,采用朴素贝叶斯和支持向量机两种方法实现!

    数据结构Java实现的

    找到了当初存的Java实现的数据结构ppt一份,分享给大家~!

    数据结构(Java)迷宫实现

    数据结构(Java)实践作业迷宫参考书本使用栈结构实现的

    全国交通咨询系统(数据结构课设 图的应用 java实现 内含课设报告)

    全国交通咨询系统(数据结构课设 图的应用 java实现 内含课设报告)全国交通咨询系统(数据结构课设 图的应用 java实现 内含课设报告)全国交通咨询系统(数据结构课设 图的应用 java实现 内含课设报告)全国交通...

    java版list-map实现 树结构 父子结构 通俗易懂

    此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!

    用java实现的二叉树结构

    包括 add delete find 等方法,适用于搞java/android开发的同学学习和了解二叉树的结构以及实现。

    java语言实现数据结构

    是用java语言实现的一些数据结构,众所周知,数据结构一直都是学习计算机专业的一门重要课程,它的难度和重要性可想而知,同时学好数据结构对自身也有很打的提高,大部分书的数据结构是都用C语言或是C++语言实现的,...

    数据结构JAVA实现

    JAVA实现链表 有序二叉树 队列的代码例子

    Quartz动态修改时间,java实现修改CronExpression方法

    下载导入就可以用,执行test类的main方法加载spring applicationContext.xml配置文件,启动Quartz定时器.修改spring配置文件的配置时间.详细看注释

    java-利用GUI实现窗口学生管理系统

    1、进入Eclipse环境,新建一个Java Project;  2、编写程序实现显示功能选项,创建GUI界面,显示所有...6、编写程序实现学生信息修改,从数组中读取学生信息显示在GUI界面中,通过界面修改信息,并将修改内容存放数组;

    数据结构-链表 JAVA语言实现

    数据结构-链表 JAVA语言实现,包含单向链表、双向链表、循环链表的遍历、删除和插入 详细介绍:http://blog.csdn.net/z740852294/article/details/77369439

    数据结构-从应用到实现 (java版)

    对于每一种数据结构的性质和用途,《计算机科学丛书·数据结构从应用到实现(Java版)》介绍了实现它的Java类的公有接口以及接口操作的估算运行时间。学生通过学习奉书可以使用Java类的公有接口编写和开发Java应用软件...

    用java实现的栈Stack类

    用java实现的栈Stack类,不继承任何集合类,用对象数组实现

    Java集合类层次结构

    Java集合类层次结构Java集合类层次结构Java集合类层次结构Java集合类层次结构Java集合类层次结构Java集合类层次结构

    用java读取修改xml文件的代码实现

    通过不同的库方法读取修改xml文件。通过java实现。代码易懂

    java导出excel树结构工具类

    该工具类实现java导出树形结构的方法,并未采用excel分组功能实现,而是根据树节点显示层级设置excel样式。针对easyUi,treeGrid开发的导出excel功能。方法简便实用、性强、通俗易懂。项目中亲测,no problem。

    Java树状结构实现BBS

    实现一个BBS可以采取多种方法,该项目采用树状结构来实现,用户可以很容易看出谁回复了谁,自己要回复谁也很方便.对于管理员来说,登陆管理员页面可以进行数据的增、删、查、改,项目中使用了多种分页的写法.

    Java队列实现,数据结构

    队列实现,数据结构作业练习参考,Java实现,环境eclipes1.8

    数据结构 用Java语言实现矩阵 可视代码

    数据结构 用Java语言实现矩阵 可视代码数据结构 用Java语言实现矩阵 可视代码数据结构 用Java语言实现矩阵 可视代码数据结构 用Java语言实现矩阵 可视代码

Global site tag (gtag.js) - Google Analytics