目前基于插桩技术实现Java程序的动态交互安全监测已经有一些实现形式,如RASP,IAST。在Java中插桩通过Instrument以及字节码操作工具(如:ASM,Javassist,Byte Buddy等)实现 相关知识 Instrumentation简介 Java SE 5 引入了静态Instument的概念,利用它我们可以构建一个独立于应用程序的代理程序(Agent),用力啊检测和协助运行在JVM...
也就是说,这个方法是在 main 方法启动前拦截大部分类的加载活动,既然可以拦截类的加载,就可以结合第三方的字节码编译工具,比如ASM,javassist,cglib等等来改写实现类。 大致分为以下逻辑: 编写一个Agent类,其中定义premain方法并调用Instrumentation#addTransformer方法添加一个自定义的Transformer 自定义一个Transformer类,实...
API有点混乱,因为这个项目多年来一直在发展。有关于该框架的文档,但不像ASM那样集中。
2.1、ASM ASM可以直接生成字节码文件,也可以动态修改字节码文件,Spring的AOP的cglib就是基于ASM实现的。 由于字节码的格式是固定的,所以ASM可以根据字节码数据结构读取对应位置的数据,然后再修改对应位置的数据即可。 ASM框架涉及的方法都和字节码指令级相关,因此对于指令不熟悉的话很难适应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 ...
[1]publicstaticvoidpremain(String agentArgs, Instrumentation inst); [2]publicstaticvoidpremain(String agentArgs); JVM将首先寻找[1],如果没有发现[1],再寻找[2]。如果希望在目标JVM运行时加载Agent,则需要实现下面的方法: [1]publicstaticvoidagentmain(String agentArgs, Instrumentation inst); ...
除了javaassist还可以使用asm对字节码进行修改,后者使用难度相对来说更大一点,但是性能更好,asm入门:https://github.com/dengshiwei/asm-module/blob/master/doc/blog/AOP利器 ASM 基础入门.md 可以看到,原本的getName方法会打印tntaxin,而经过agent处理过后的getName应该会打印hello tntaxin, you are good!
A safe, dynamic tracing tool for the Java platform. BTrace是基于Java语言的一个安全的、可提供动态追踪服务的工具。BTrace基于ASM、Java Attach API、Instrument开发,为用户提供了很多注解。依靠这些注解,我们可以编写BTrace脚本(简单的Java代码)达到我们想要的效果,而不必深陷于ASM对字节码的操作中不可自拔。
我们想通过插桩,使得在打印test的前后打印start和end,且修改字节码部分通过ASM来实现。 新建一个Maven项目Enhancement01,自写适配器代码如下: import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import static org.objectweb.asm.Opcodes.*; public class Adapter extends ClassVisitor { pub...
Java Agent入门实战(二)-Instrumentation源码概述 Instrumentation接口设计初衷是为了收集Java程序运行时的数据,用于监控运行程序状态,记录日志,分析代码用的。接下来从源码的流程来介绍一下 实现类InstrumentationImpl的void addTransformer(ClassFileTransformer transformer, boolean canRetransform);...