一个ClassPool对象是包含CtClass对象的容器。一旦一个CtClass对象被创建后,就会被记录到一个ClassPool中。这是因为编译器在编译源码时会引用代表CtClass的类,可能会访问CtClass对象。
Javassist是一个处理字节码的类库。Java字节码存储在一个叫做*.class的二进制文件中。每个class文件包含一个java类或者接口。
1.创建了一个非默认的classpool,加入当前线程的上下文类加载器作为额外的类搜索路径
Javassist 是一个开源的分析、编辑和创建Java字节码的类库. 其主要优点在于简单快速. 直接使用 java 编码的形式, 而不需要了解虚拟机指令, 就能动态改变类的结构, 或者动态生成类.
Spring Cloud 项目中,很多功能都是用 aop去实现的,或者直接使用Java Agent。
1.fastjson简单使用 User: package com.naihe; public class User { private String name; private int age; public User() {} public User(String name, int age) { this.name = name; this.age = age; } public String getNam
fastjson简单使用 User: package com.naihe; public class User { private String name; private int age; public User() {} public User(String name, int age) { this.name = name; this.age = age; } public String getName()
http://www.javassist.org/tutorial/tutorial.html
CommonsCollections1 的变体,它使用 InstantiateTransformer 而不是 InvokerTransformer。
getDecalaredField是java.lang.Class中的一个方法,该方法返回一个Field对象,它反映此Class对象所表示的类或接口的指定已声明字段。 name参数是一个字符串,指定所需字段的简单名称。
Javassist (Java Programming Assistant) makes Java bytecode manipulation simple. It is a class library for editing bytecodes in Java; it enables Java programs to define a new class at runtime and to modify a class file when the JVM loads it. Unlike other similar bytecode editors, Javassist provides two levels of API: source level and bytecode level. If the users use the source-level API, they can edit a class file without knowledge of the specifications of the Java bytecode. The whole API is designed with only the vocabulary of the Java language. You can even specify inserted bytecode in the form of source text; Javassist compiles it on the fly. On the other hand, the bytecode-level API allows the users to directly edit a class file as other editors.
CC1分析 POC: import org.apache.commons.collections.Transformer; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTran
CC1分析 POC: import org.apache.commons.collections.Transformer; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTrans
在上一期讲解java的动态性的时候,我们主要提到了java中的反射机制,可以在java代码运行的时候,改变类的结构,属性等信息,而这一节我们通过另一种实现方式来讲解java的动态性,主要就是java的字节码操作。
如果类是否被修改是在加载时确定的,用户必须让javassist与类加载器协作。 javassist可以与类加载器一起使用,以便在加载时修改字节码。 用户可以使用自定义版本的类加载器,也可以使用javassist提供的类加载器。
由于Charles是使用java这种弱语言编写的,即使加了各种混淆,但是也难逃被破解的命运! 官网上下载的只能免费使用30天
前面学习的cc链都是基于commons-collections:commons-collections的3.1-3.2.1这几个版本的,但后面有了新的分支org.apache.commons:commons-collections4的4.0版本。可以发现groupId和artifactId都发生了改变,也就是形成了两个分支。这是因为commons-collections4不是用来替换commons-collections的一个新版本,而是修复旧的commons-collections的⼀些架构和API设计上的问题的一个拓展。两者的命名空间并不冲突,都可以放在同一个项目中。
在排查项目中的代码垃圾时,处理无引用类是最简单直接的,因为没有其他代码引用到它,直接删除也不会影响到项目。但靠人肉去检索项目中所有的类是否有引用又显得是重复低效的,所以在这里提供一个方案,做成gradle插件供大家参考。
•JDK动态代理:运行期动态的创建代理类,只支持接口;•ASM:一个 Java 字节码操控框架。它能够以二进制形式修改已有类或者动态生成类。不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解;•javassist:一个开源的分析、编辑和创建Java字节码的类库(源码级别的类库)。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类;•bytebuddy:一个更高层次操作字节码的工具包。
字节码编程在实际的业务开发(CRUD)中并不常用,但是随着网络编程,RPC、动态字节码增强技术和自动化测试以及零侵入APM监控的不断发展与大量使用,越来越多的技术需要使用到字节码编程。
前面文章介绍的 ASM 入门门槛还是挺高的,需要跟底层的字节码指令打交道,优点是小巧、性能好。Javassist 是一个性能比 ASM 稍差但是使用起来简单很多的字节码操作库,不需要了解字节码指令,由东京工业大学的数学和计算机科学系的教授 Shigeru Chiba 开发.
简单来说, javaagent 是在class 被装在到ClassLoader之前对其拦截,插入自定义的监听字节码,可实现零侵入的监控,是APM的核心技术
https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4
在实际工作过程中,我们可以通过对Java的字节码进行插桩,以便拦截我们需要拦截的类和方法,对这些类和方法进行改造或者直接动态生成相应的类来实现拦截的逻辑。
执行以后我们可以在E:\IOC\target\classes\com\guanjian\assist中看见这个.class文件
commons-beanutils 是 Apache 提供的一个用于操作 JAVA bean 的工具包。里面提供了各种各样的工具类,让我们可以很方便的对bean对象的属性进行各种操作。
之前有一篇文章讲了Java的Gson、FastJson等解析json常用类,与Python的json模块比较,繁琐之处是要定义各种实体类。那么,Java中有没有自动定义实体类的方法呢?
CC4分析 import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; import javassist.*; import org.apache.commons.collections4.Transformer; import org.apache.commons.collections4.comparators.TransformingComparator; import org.apache.commons.collections4
AOP的实现一般使用了动态代理和字节码修改,本文介绍使用javassist实现类的创建和修改 添加依赖 <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.28.0-GA</version> </dependency> 使用字节码创建一个类 初始化ClassPool ClassPool pool = ClassPool.getDefault();
在 jdk 1.5 之后引入了 java.lang.instrument 包,该包提供了检测 java 程序的 Api,可以让我们动态修改已加载或者未加载的类,包括类的属性和方法。
import java.lang.reflect.Method; import java.util.Arrays; import java.util.stream.Collectors; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifier; import javassist.bytecode.CodeAttribute; import javass
CC4分析 import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter; import javassist.*; import org.apache.commons.collections4.Transformer; import org.apache.commons.collections4.comparators.TransformingComparator; import org.apache.commons.collections
会写这篇文章的起因是在最近的一场ctf中碰见的一道很有意思的题,题目本身是一道很简单的ROME链的反序列化漏洞,但是在传入payload的地方限制了能传入的长度,所以就有了这么一篇文章。
在处理OPTIONS请求时候,更是uri都不看,直接返回200,并且在后面会加上Allow: OPTIONS,GET,HEAD,POST
很多人都会问HikariCP为什么那么快?之前的两篇文章【追光者系列】HikariCP源码分析之FastList 和 【追光者系列】HikariCP源码分析之ConcurrentBag 是第一第二弹,本文就是第三弹。
其实前面的CommonsBeanutilsShiro已经使用了一遍了, 但是想了想CB链还是值得拥有自己的一篇的文章的所以就再分析了一遍。
上面两节虽然手把手教你实现了一个 hello world 版 agent,然而实际上对 java agent 依然是一脸茫然,所以我们得先补齐一下基础知识
最近帮助同事解决了一个比较棘手的问题,一路采坑的过程比较有意思。在此记录下来。(PS:主要原因是项目比较大,我们只有整个Android项目部分业务侧代码的开发权限。所以解决问题的一些解决问题的常规手段无法使用。)
代理:即为访问对象添加一层控制层,使其间接化,控制层可以为对象访问添加操作属性。 一、cglib:Code Generation library 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cglib不需要实现接口。 实例: import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.Me
JDK7u21原生gadget链的构造十分经典,在对于其构造及思想学习后,写下本文作为笔记。
ROME 是用于 RSS 和 Atom 订阅的 Java 框架。 并根据 Apache 2.0 许可证开源。ROME 包括一组用于各种形式的联合供稿的解析器和生成器,以及用于从一种格式转换为另一种格式的转换器。 解析器可以为您提供特定于您要使用的格式的 Java 对象,或者为您提供通用的规范化 SyndFeed 类,该类使您可以处理数据而不必担心传入或传出的提要类型。
Hessian是一个基于HTTP协议采用二进制格式传输的RPC服务框架,相对传统的SOAP web service,更轻捷。Hessian是Apache Dubbo在Java语言的实现,该框架还提供了Golang、Rust、Node.js 等多语言实现。Hessian 是一种动态类型、二进制序列化和 Web 服务协议,专为面向对象的传输而设计。
在字节码编程方面有三个比较常见的框架;ASM、byte-buddy、Javassist,他们都可以对这字节码进行操作,只是操作方式和控制粒度不同。
我开发的这个框架,有一个注解,当用户输入变量名,类名的时候,我这个框架可以为其自动生成一个对象,并加载到内存中供以后使用。
领取专属 10元无门槛券
手把手带您无忧上云