Java Agent 技术

Java Agent 是一种可以在 JVM 启动时或运行时附加的工具,用于拦截和修改类文件字节码,常用于实现 AOP(面向切面编程)、性能监控、日志记录等功能。参考资料:钉钉文档

Java Agent 加载方式

1. Premain 使用

在 JVM 启动时通过命令行参数 -javaagent:path/to/xx.jar 指定 Agent。

构建和运行命令

mvn package
mvn clean package
java -cp . zero.overflow.Main
java -javaagent:D:\V2024-11\116\MyAgent\target\MyAgent-1.0-SNAPSHOT-jar-with-dependencies.jar -cp . zero.overflow.Main
 

2. Agentmain 使用

在 JVM 运行后,通过 Attach API 动态附加到正在运行的 JVM 进程上。

Agentmain 示例代码 (AgentMainTest.java):

public class AgentMainTest {
    public static void agentmain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new MyTransformer(), true);
        for (Class<?> clazz : inst.getAllLoadedClasses()) {
            if (clazz.getName().equals("zero.overflow.Fox")) {
                try {
                    inst.retransformClasses(clazz);
                } catch (UnmodifiableClassException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
 

动态注入代码:

public class Main {
    public static void main(String[] args) throws AgentLoadException, IOException, AgentInitializationException, AttachNotSupportedException {
        VirtualMachine attach = VirtualMachine.attach("37416");
        attach.loadAgent("D:\\V2024-11\\116\\MyAgent\\target\\MyAgent-1.0-SNAPSHOT-jar-with-dependencies.jar");
    }
}
 

POM 依赖 (pom.xml):

<dependency>
    <groupId>com.sun</groupId>
    <artifactId>tools</artifactId>
    <version>1.8</version>
    <scope>system</scope>
    <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
 

Agent 内存马注入

利用 Javassist 注入 Filter 内存马

通过 Javassist 动态修改字节码实现 Filter 内存马注入。

POM 依赖:

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.30.2-GA</version>
</dependency>
 

相关项目:

细节补充

  • 查看进程:针对Java,强烈建议使用”jps -l”