知识点:
Java攻防-Agent技术-JVM&启动加载&运行附加&内存马应用

演示案例-Java攻防-Agent技术-JVM&启动加载&运行附加&内存马应用
Java Agent是一种可以在JVM启动时或运行时附加的工具,它可以拦截并修改类文件字节码。Java Agent通常用于实现AOP(面向切面编程)、性能监控、日志记录等功能。
文章参考:docs.dingtalk.com/i/nodes/QPGYqjpJYrPrKaQ5UE6eZkY38akx1Z5N








一、Java Agent有两种加载方式:
1、Premain使用
bash
在JVM启动时通过命令行参数-javaagent:path/to/xx.jar来指定。
就是使用java运行一个1.jar文件并指定这个命令参数指向2.jar后,可以使用2.jar的代码影响到1.jar的代码正常运行。
















bash
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使用
bash
在JVM已经启动后,通过Attach API动态地附加到正在运行的JVM进程上。
添加依赖类pom.xml:
bash
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>


改变PremainTest.java
bash
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);
}
}
}
}
}







动态注入:
bash
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");
}
}




二、Agent内存马注入:
利用javassist注入Filter内存马
添加依赖类pom.xml:
bash
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.30.2-GA</version>
</dependency>









冰蝎内存马项目
只支持tomcat:https://github.com/rebeyond/memShell


