Java Agent 内存马攻防
内容提要
Java Agent 是一种通过 java.lang.instrument 包实现的工具,可以在不影响编译的情况下动态修改字节码。它有两种加载方式:premain(JVM 启动前加载)和 agentmain(启动后加载)。通过 Instrumentation 接口,Java Agent 能获取已加载类的信息并进行字节码修改,常用于性能监控和问题诊断。
关键要点
-
Java Agent 是一种通过 java.lang.instrument 包实现的工具,可以动态修改字节码。
-
Java Agent 有两种加载方式:premain(JVM 启动前加载)和 agentmain(启动后加载)。
-
Instrumentation 接口允许 Java Agent 获取已加载类的信息并进行字节码修改。
-
premain 方法在 JVM 启动时执行,主要拦截用户类的加载。
-
agentmain 方法在 JVM 启动后执行,使用 Attach API 进行连接和加载。
-
Instrumentation 提供了 addTransformer 方法用于注册字节码转换器。
-
ClassFileTransformer 接口用于定义字节码转换的逻辑。
-
Javassist 是一种简化字节码修改的工具,可以直接用 Java 代码实现增强。
-
通过 Instrumentation 的 getAllLoadedClasses 方法可以获取目标 JVM 中所有已加载的类。
-
可以通过动态修改类的方法体来实现注入恶意代码的功能。
-
RASP 技术利用 Instrumentation 在关键类的特定方法处进行 hook,以实时检测内存马。
-
内存马的检测与注入过程相似,需分析可疑特征并进行反编译。
-
ProtectTransformer 类可以检测并阻止其他 Agent 的加载,防止检测机制被绕过。