【问题标题】:Can I modify the byte code of a Java method in the runtime?我可以在运行时修改 Java 方法的字节码吗?
【发布时间】:2013-10-09 09:26:34
【问题描述】:

我正在写另一个大型java程序的插件。

我想在运行时修改java程序的一些java方法的一些字节码,以便拦截方法调用(即在方法中注入一些hook代码)。

有什么办法可以做到这一点?

PS:

我检查了以下方法:

1.更改java程序的类加载器。 (我们无法更改)
2.使用java代理。 (我们不能使用 java 代理,因为 java 代理会创建一个新的代理对象。我们不使用代理对象。我们需要挂钩 java 程序的对象,并使用该对象)
3. 使用 -javaagent 选项(我们不能为 java 程序添加命令行选项。)

PS 更多 [再次编辑]:
我的类是由 ext 类加载器加载的(我将 jar 文件放在 JAVA_HOME\lib\ext 文件夹中)。 大型java程序是Browser加载的applet程序。当浏览器启动小程序时,它也会加载我的类。

PS 更多 [再次编辑]:
虽然它在 Applet 中运行。我可以得到完全的许可。因为我可以修改java.policy和java.security文件。

谢谢,
卡尔文

【问题讨论】:

  • 如果您遇到安全限制,他们可能不希望您这样做。
  • 嗨锑,我有完全的权限。我可以修改 JAVA_HOME\lib\security 中的策略文件
  • 那么为什么不直接离线修改课程呢?

标签: java proxy hook bytecode javassist


【解决方案1】:

只需使用-javaagent opiton,它用于在运行时修改字节码。您可以从 This LinkThis Link 找到更多关于 -javaagent 的信息

【讨论】:

  • 嗨,Anish,我正在编写小程序。因此,出于安全原因, -javaagent 选项在 1.7u25 及更高版本中被禁止。还有其他方法吗?
【解决方案2】:

您可以使用几个库。参见例如here。 但是,一旦 VM 已经加载/初始化了一个类,就无法对其进行操作。

顺便说一句,原则上你也可以用你自己的代理类文件替换要“挂钩”的类。只要类的可见界面没有改变,这可能会起作用。 (虽然类的子类在运行时可能会严重失败。)这种替换可以像更改类路径一样简单,以便首先找到同名的类,然后再找到原始类。在这种情况下,委托给同名的原始类可能会稍微复杂一些。

【讨论】:

  • 嗨 Hanno,我想在类加载器加载后修改字节码。我应该使用哪个库?
  • 我建议您查看Javassist,看看它是否对您有用。它“使 Java 程序能够在运行时定义一个新类,并在 JVM 加载它时修改一个类文件。”
  • 嗨 Hanno,这是“之前”,但我需要的是“之后”:“使 Java 程序能够在运行时定义新类并修改类文件之前 JVM 加载它”
  • 这有区别吗?
【解决方案3】:

是的,你可以,但这个过程会有点棘手,因为你会直接使用内存进行操作。为此,您将查看有关 sun.misc 包及其 Unsafe 类的非官方文档。

  • 警告 1:根据官方消息,将在 JDK 9 中删除 Unsafe 类。
  • 警告 2:Sun 公司不会对您的代码正常工作负责,因为此类根本不应该使用,并且仅供系统使用。

【讨论】:

    【解决方案4】:

    抱歉,这是不可能的。首先,字节码在类加载后是不可变的。 JVM 提供了几个 API 可用于执行此类操作,但它们显然具有很高的特权。

    如果您在浏览器 Applet 之类的低权限环境中运行,那么您显然不会被允许这样做,并且您可以使用的任何方法都应该被视为安全漏洞。

    但问题是您为什么首先使用小程序,以及为什么要在加载后修改代码。几乎可以肯定,有更好的方法来做你想做的事。

    【讨论】:

    • 您好 Antimony,我可以修改 java.policy 文件,所以我可以拥有所有权限。您提到“JVM 提供了几个 API ......”。您能否指出这些 API 是什么?
    • Java 代理是主要的,但你已经拒绝了。
    • "首先,字节码在类加载后是不可变的。" 不是,代理不能在没有任何参数的情况下在运行时加载到 JVM,但这需要很少的技巧和 JDK JVM,甚至更多的技巧普通的JVM。
    • @GotoFinal - 您也可以添加动态代理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多