为什么对rt.jar进行简单更改会导致Java Runtime Environment无声崩溃?

时间:2010-03-13 21:12:49

标签: crash compilation reverse-engineering java

这就是我正在做的事情:

  1. 提取我的JRE的rt.jar
  2. 的内容
  3. 提取我的JDK(相同版本)的src.zip
  4. 现在,如果我从提取的src文件夹中复制Runtime.java并使用javac.exe进行编译而不进行任何修改,然后将其放入解压缩的rt文件夹中,最后使用jar.exe将所有内容放回到jar文件中,一切按预期工作。 JRE运行良好。

    但是,如果我对Runtime.java进行最轻微的更改并将其编译并将其放入rt.jar,那么只要我尝试启动它,JRE就会崩溃。这是导致无声崩溃的轻微变化的示例:

    /** Don't let anyone else instantiate this class */
        private Runtime() {
            System.out.println("This is a test.");
        }
    

    而不是:

    /** Don't let anyone else instantiate this class */
        private Runtime() {}
    

    有人能告诉我为什么这会导致我的JRE崩溃吗?

    提前致谢。

4 个答案:

答案 0 :(得分:7)

System.out构造函数运行时,Runtime()可能尚未初始化。通常控制台输出不被视为“轻微”改变,但在错误的时间它可以调用太多可能根本没有设置的东西。

答案 1 :(得分:2)

你这样做是错的。您无法在一开始就分发修改后的JRE,因此它仅在您的组织内部有用。安装SecurityManager并且不要向您的代码库授予您试图防范的任何RuntimePermissions。

答案 2 :(得分:2)

@Tom - 我建议你不要试图这样做:

  • 在不违反Sun二进制许可证的情况下,您无法分发修改后的rt.jar文件。

  • 即使你这样做,你也不会被称为Java。

  • 正如您所发现的,进行更改时会出现许多复杂情况,尤其是当这些更改可能会干扰JVM的幕后初始化时。当初始化过程中出现问题时,JVM通常无法以可理解的方式报告问题。

  • 如果您成功地为一个JRE修改了rt.jar,则无法保证相同的黑客适用于其他版本。

  • 在正确的思想中,任何人都不会故意在生产应用中使用经过修改的JVM(特别是由第三方修改过的JVM)。

编辑:根据您的其他问题判断,我猜您正在尝试使用自定义启动器对某些第三方Java应用程序进行逆向工程或修改。如果您提供了有关您真正想要做的事情的更多信息,我们可能会建议采用正确方式来做...而不是使用“绝望措施”,例如修改JRE。 / p>

答案 3 :(得分:1)

这很奇怪,因为我在过去的rt.jar中使用了很多类来做同样的技巧。

您能为我们提供崩溃的流程输出吗?