0

我正在为我的 java 防病毒软件开发沙盒功能,但我遇到了一个问题:类中的指定包对编译是否重要?

示例:我正在运行一个想要使用的程序Runtime.getRuntime().exec(),当类加载器尝试加载该程序以运行方法时,它是否检查文件中限定的包(如果存在)?我不希望尝试更改 JVM 中的文件,而只是从不同的包中加载文件。我可以完成加载等,但我唯一的困境是,它会崩溃和燃烧吗?在 java 中,它会被注册为 say, java.lang.Runtime,但是编译后的代码会说,例如pkg.pkg.Runtime,它是否需要扩展旧的运行时?我的猜测是扩展旧的运行时只会破坏它。有人对这个有了解吗?我正在制作一个可测试的例子,但我还有一点距离,想得到一些答案,这可能会使一些人受益。

4

1 回答 1

3

类上的指定包对编译是否重要?

是的,这很重要。调用的类pkg.pkg.Runtime()不能像加载一样加载java.lang.Runtime

此外,如果我的记忆是正确的,JVM 中还有一些额外的安全措施来防止正常的应用程序将类注入到核心包中,例如java.lang.

如果您需要更改java.lang.Runtime类的行为(出于实验目的!),那么我认为您需要将修改后的版本放在引导类路径上,在“rt.jar”文件之前。

然而:

  • 这种程度的修修补补很容易导致 JVM 不稳定;即难以诊断的硬JVM崩溃。

  • 如果您的目标是生产“生产质量”工具,那么您会发现涉及修补 JVM 的事情被认为是不可接受的。人们会非常怀疑安装说明,如“将其添加到已安装的 JVM 的引导类路径”之类的内容。

  • 分发“修补过的”JVM 可能会违反 Oracle 的 Java 许可协议。


我的建议是寻找一种不那么侵入性的方式来做你想做的事情。例如,如果您尝试进行病毒检查,请在 JVM 之外进行,或者在自定义应用程序类加载器中进行。


你评论说:

我有一个自定义类加载器,我的问题是:如果我编译一个标记为 pkg.pkg.Runtime 的类,我可以在我的类加载器中注册为 java.lang.Runtime 吗?

正如我上面所说,不,你不能。字节码文件中嵌入了类名。如果你试图通过加载一个不同名称的类来“拉一个 swifty”,JVM 将抛出一个Error.

和:

如果没有,那么我该如何替换课程?如果编译的包名称必须等于请求引用的命名,那么我可以修改 .class 文件以匹配,或者可以像在 java.lang 包中一样编译它?

这就是你必须做的。您需要在源代码中命名该类java.lang.Runtime并对其进行编译。

但是我上面的建议的 意思是你应该在类加载器中使用病毒检查。忘记尝试替换/修改Runtime. 由于我上面列出的原因,这是一个坏主意。

于 2013-08-17T05:42:37.730 回答