2011-02-04 188 views
2

我正在创建一个启动JVM的应用程序(使用JRE的副本)。如果我编辑rt.jar,例如删除用户不应该访问的功能,它是否会以某种方式破坏JRE?可以修改rt.jar吗?

编辑:应用程序涉及下载代码到用户的机器上,所以它会限制代码而不是用户。我应该澄清一点。

回答

5

通常,删除功能的最好方法是使用SecurityManager。这允许您控制可以访问的内容或可以执行的关键操作。

1

完全取决于你“删除”。但它可能。只要你不打破任何东西,删除依赖等...

如果你想做一些安全明智的事情。你如何确保你只有你完全控制用户JRE?

如果是这样的话。你的做法会对你的应用程序无法做什么有什么好处?

但它的可能性和一个有效的想法出于某些原因。但他们主要是基准测试,开发,调试。例如转储未加密的字节码

也请注意授权问题。您可能无法合法销售或运送此物品。

0

如果你问这是否合法,我不知道,但有可能它不是。 (如果你打算出售你的产品,那就是说,对于研究或娱乐用途来说,它可能就是这样。)

技术上没关系吗?如果你知道你在做什么,它可以。

虽然它有意义吗?客户端安装另一个虚拟机有多困难,或者只是将黑客rt.jar替换为一个未被感染的虚拟机?

而在更抽象的层面上:将潜在的罪犯对待客户是个好主意吗?假设他们要尝试的第一件事是破解你的系统。 (请注意,我不知道你的客户,所以你也许是对的,但问题是值得问的。)

1

你为什么问,你可能会打破一些协议/许可证,除此之外没关系。

我不这样做这一点,但改变引导加载程序的类路径的rt.jar之前加载我的班,等等,这是合法的:)

到底:获得的NoClassDefFoundError AINT冷静,不管你如何看它。

+0

如果你有不想让用户访问的功能,你最好不要这样做 - 编写一个ClassLoader来将API列入黑名单(或者如果你愿意,可以将其列入白名单)。这部分是谷歌用Google App Engine做的。 – 2011-02-04 19:48:54

+0

@Chris Kaminski,我不这样做,以防止任何人访问任何东西。这是一个AppServer,它在某些库中有一些优化/修复。防止黑名单用户需要一个完整的SecurityModel。每个虚拟机运行多个单一用户应用程序也不起作用,因此也可以在操作系统级别切断功能。 – bestsss 2011-02-04 19:59:49

8

有一个很好的机会,你打破了一些东西,直到运行时才会明显。

但或许更重要的是发牌的问题:你的应用程序已经推出了自己的JRE,这你允许这样做的版本,除了你不能修改你分发JRE,按the J2SE license

[...] (一)将软件分发完整,未经修改的,只有 捆绑为您的applet和应用程序(“程序”)的一部分,

这也是值得商榷何谓“删除用户不应该拥有的功能接触到“。您的应用程序在用户帐户的上下文中执行,并且已经从JRE删除任何功能:

  • 如果操作系统允许该用户的会话的上下文特定的动作,则有另一种方式来做到这一点 - 因此,您处于与rt.jar混淆之前的相同位置。您的用户只能进行系统调用。

  • 如果操作系统不允许在用户会话的上下文中执行该操作,那么无论这些类是否存在,JVM都将无法执行该操作,因此整个问题都没有实际意义。