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 的加载,防止检测机制被绕过。
➡️

继续阅读