动态代理(3)-javaAgent、ASM、javassist、ByteBuddy是什么? java agent 说起javaAgent必须先了解Java1.5开始提供的Instrumentation API[1]。Instrumentation API就像是JVM预先放置的后门(给你破解I???用),它可以拦截在JVM上运行的程序,修改字节码。 Agent技术本身是一种开发思维模式,或者说是代理模式,不止java有,pytho...
ASM Tree API可以类比解析XML文件中的DOM方式,把整个类的结构读取到内存中,缺点是消耗内存多,但是编程比较简单。TreeApi不同于CoreAPI,TreeAPI通过各种Node类来映射字节码的各个区域,类比DOM节点,就可以很好地理解这种编程方式。 利用ASM实现AOP 下面我们通过实践看下如何通过ASM实现增加方法,运行时修改方法: 例子 假设...
接口中的transform()方法会在类文件被加载时调用,而在transform方法里,我们可以利用上文中的ASM或Javassist对传入的字节码进行改写或替换,生成新的字节码数组后返回。 首先可以定义如下的类转换器: public class TestTransformer implements ClassFileTransformer { //目标类名称, .分隔 private String targetClassName; //...
在JDK1.5版本开始,Java增加了Instrumentation(Java Agent API)和JVMTI(JVM Tool Interface)功能,该功能可以实现JVM再加载某个class文件对其字节码进行修改,也可以对已经加载的字节码进行一个重新的加载。 利用该机制能够实现许多技术,如RASP、内存马、IDEA破解。 Java Agent有两种运行模式: 启动Java程序时添加-javaagent...
{ return classfileBuffer; } ASMProxyAction proxyAction = new ASMProxyAction(); byte[] bytes = proxyAction.aop(classfileBuffer); //这里可以将bytes写入到文件,输出处理后的calss内容 return bytes; } public static void premain(String agentArgs, Instrumentation inst) throws ClassNotFoundException, ...
API有点混乱,因为这个项目多年来一直在发展。有关于该框架的文档,但不像ASM那样集中。
objectweb.asm.commons.AdviceAdapter; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; public class TimeAgentByJava { public static void premain(String args, Instrumentation instrumentation) { instrumentation.addTransformer(new ...
Byte Buddy: 这是一个强大的库,用于在运行时创建和修改Java类。Byte Buddy提供了一个简单易用的API,用于生成、修改和加载Java字节码。它支持Java 5及更高版本,并且与Java Agent技术非常配合。 ASM: ASM是一个Java字节码操控框架。它能直接生成或以二进制形式修改已有类或者核心类的字节码。ASM可以直接生成字节码...
JDK 1.5 开始,Java新增了Instrumentation( Java Agent API )和JVMTI( JVM Tool Interface )功能,允许JVM在加载某个 class 文件之前对其字节码进行修改,同时也支持对已加载的 class (类字节码)进行重新加载( Retransform )。 在1.6版本新增了attach(附加方式),可以对运行中的Java进程插入Agent,instrumentation包被赋予...
这里需要注意,解析-javaagent参数有一些特别之处,这个参数用来指定一个我们通过Java Instrumentation API来编写的Agent,Java Instrumentation API底层依赖的是JVMTI,对-JavaAgent的处理也说明了这一点,在调用add_init_agent函数时第一个参数是“instrument”,关于加载Agent这个问题在下一小节进行展开。到此,我们知道在启动...