Java Agent 内存马攻防
💡
原文中文,约34500字,阅读约需82分钟。
📝
内容提要
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 的加载,防止检测机制被绕过。
🏷️
标签
➡️