如何在 class 加载 JVM 无参数时修改字节码

How to modify bytecode on class load JVM no args

我有一个 exe 正在启动 JVM 并将 java classes 加载到内存中。通过将 classes 附加到进程并重新转换 classes,我成功地使用 运行 JVM 中的 -javaagent 转储了这些 classes。现在我试图在加载时修改 classes。我的问题是我的 java 代理无法处理 premain,因为我无法在不修改加载程序可执行文件的情况下添加命令行选项,加载程序可执行文件与 Themida 一起打包。当我的 java 代理被附加时,要修改的 classes 已经加载。我在想我可以使用 JVMTI class 加载挂钩来捕获 class 文件并将其传输到单独的 JVM 并使用 javassist 或 ASM 修改它然后 return 它通过 JVMTI 代理到原始 JVM。如果我使用 JVMTI,我需要使用 -agentlib 加载我的代理,这让我又回到了必须修改可执行文件的问题。你能想到我可以执行此修改的任何其他方法吗?我可以修改 JVM 本身以始终在启动时加载 java 代理吗?还有其他方法可以强制 JVM 始终加载 java 代理吗?为了查看该软件是否在 JRE 中调用任何类型的 exe,我从 j64\bin 中删除了所有 exe。该程序仍然加载没有错误。当我删除 java.dll 时,程序无法完全加载,而程序仍在加载但在删除其他 dll 时抛出错误。如果我发现哪个 JRE dll 从加载程序接收命令行参数,我可以实现一个 dll 代理吗? java.dll 是我要代理的 dll 吗?

我真的无法谈论代理 jvm.dll 的想法。听起来很精致 error-prone 工作。对 Themida 也不太了解,但从一些粗略的浏览来看,你会故意破坏 Themida 的安全意图。

如果不能更改 JVM 命令行参数,您实际上没有太多选择。 (修辞:如果您需要更改堆大小等,您会怎么做?)

但是,如果您可以在 JVM 启动后追加执行,则可以使用 JVM Attach execution to connect to the running JVM and and load your JVMTI agent via loadAgent。这是一个真正的 race-condition 威胁,因为当您安装工具时,您的应用很可能 under-way,但正如我所说,您的选择是有限的。

我会研究如何使用 Themida 来 re-package 应用程序并引入适当的 javaagent 命令行参数。另外,如果您不这样做,您可能会发现 Themida 可能会检测到您的解决方法并禁用它们,或者完全禁用 JVM。