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>
相关项目:
- 冰蝎内存马项目:memShell
细节补充
- 查看进程:针对Java,强烈建议使用”jps -l”