jvm 如何转储加载到内存中的类?Java

ffscu2ro  于 2022-11-07  发布在  Java
关注(0)|答案(2)|浏览(199)

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

imzjd6km

imzjd6km1#

没有支持的Java SE机制来读取/检索已由类加载器加载的“.class”。因此,您的选项将是:

  • 在类加载器调用defineClass之前(或之后),修改您用来捕获“.class”的自定义类加载器。
  • 深入到JVM数据结构中,尝试确定是否在某个地方捕获了整个.class流,然后检索它。
  • 修改JVM...

这些都是可行的。所有的都是相对困难的。

cuxqih21

cuxqih212#

可以使用Dynamic AttachInstrumentation API在运行时获取加载的类。
其思想是将Java代理注入到正在运行的应用程序中。
代理使用Instrumentation.getAllLoadedClasses方法获取所有已加载类的数组,然后使用Instrumentation.retransformClasses获取它们的字节码。
可以在class-file-extractor项目中找到工作实现。
用法:

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

其中

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

相关问题