我正在尝试访问一个加载到内存中的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来转储它,因为它在加载包后也可以访问包?
2条答案
按热度按时间imzjd6km1#
没有支持的Java SE机制来读取/检索已由类加载器加载的“.class”。因此,您的选项将是:
defineClass
之前(或之后),修改您用来捕获“.class”的自定义类加载器。这些都是可行的。所有的都是相对困难的。
cuxqih212#
可以使用Dynamic Attach和Instrumentation API在运行时获取加载的类。
其思想是将Java代理注入到正在运行的应用程序中。
代理使用
Instrumentation.getAllLoadedClasses
方法获取所有已加载类的数组,然后使用Instrumentation.retransformClasses
获取它们的字节码。可以在class-file-extractor项目中找到工作实现。
用法:
其中
<pid>
是目标JVM应用程序的进程ID;mainloader.jar
是输出文件名;com.mysoft.mainloader
是要提取的类的名称前缀。