最近在学习IAST技术,IAST的核心其实就是插桩,在java语言下,用到的技术就是javaagent,由于之前没有接触过javaaent,正好整理一下。
在介绍javaagent之前,我想有必要向大家介绍一下JVMTI,因为javaagent是基于这个技术实现的
JVMTI
JVMTI(JVM Tool Interface)是 Java 虚拟机所提供的 native 编程接口,JVMTI可以用来开发并监控JVM,可以查看JVM的内部状态,并控制JVM应用程序的执行。
JVMTI只是一套接口,我们要开发JVM工具就需要写一个Agent程序来使用这些接口。Agent程序其实就是一个C/C++语言编写的动态链接库。
注:这里提到的agent程序和javaagent不是同一概念
我们通过JVMTI开发好agent程序后,把程序编译成动态链接库,之后可以在jvm启动时指定加载运行该agent。
-agentlib:<agent-lib-name>=<options>
之后JVM启动后该agent程序就会开始工作。
而接下来要提到的Instrumention机制,也是通过实现了一个JVMTI的agent来完成的,这个agent的实现代码在libinstrument.so里(在BSD系统中叫做libinstrument.dylib),由于libinstrument.so是java内置的,所以不需要我们手动通过 -agentlib 参数指定就可以使用它。
这个动态链接库可以在{JAVA_HOME}/jre/lib 下找到ÿ