如何将dump 类加载到内存中? Java

How to dump classes loaded into memory? Java

我正在尝试访问加载到内存中的 java 包并将其转储到文件中。以下是安全性的工作原理:Themida 包含一个 exe,其中包含要加载的 java 主要 class 代码。在运行时,Themida exe 将干净的主要 class java 代码加载到内存中。该软件的结构是将加载程序包含在 exe 中,但多个外部库可以访问 exe 中包含的包。因此,exe 包含 com.mysoft.mainloader。但是干净的 jar 库 Mylib.jar 可以调用 com.mysoft.mainloader 内的函数。如何将 com.mysoft.mainloader 转储到 jar 文件?我可以修改 Mylib.jar 以转储它,因为它在加载后也可以访问包吗?

不支持 Java SE 机制来读取/检索已由 classloader 加载的“.class”。所以你的选择是:

  • 修改您使用的自定义 classloader 以在 classloader 调用 [=10= 之前(或之后)捕获“.class” ].

  • 深入研究 JVM 数据结构,尝试找出整个“.class”流是否在某处被捕获,然后检索它。

  • 修改JVM ...

其中任何一个可行。所有都会比较难。

可以使用 Dynamic Attach and Instrumentation API 在运行时加载 类。

想法是将 Java 代理注入 运行 应用程序。
代理获取所有已加载 类 和 Instrumentation.getAllLoadedClasses method, then gets their bytecode using Instrumentation.retransformClasses.

的数组

工作实现可以在 class-file-extractor 项目中找到。

用法:

java -jar extractor.jar <pid> mainloader.jar com.mysoft.mainloader

哪里

  • <pid>是目标JVM应用程序的进程ID;
  • mainloader.jar为输出文件名;
  • com.mysoft.mainloader 是要提取的 类 的名称前缀。