2013-03-22 44 views
7

请不要发表回答“你不应该这样做”。我不打算在生产代码中使用它,但只是为了一些黑客的乐趣。有没有办法在Java中执行不安全的代码(禁用安全管理器)?

在回答this question时,我想运行一些任意的不安全的Java代码以获得乐趣。所涉及的代码涉及仅找到Java TreeMap叶节点

运行下面的代码导致

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util 

this question,我可以使用System.setSecurityManager(null)获得大部分这些限制左右。但我不能这样做,因为当我的类被加载时弹出错误。

我已经意识到,在禁用安全管理器后,我可以尽我所能地使用反射。但是这会使代码更加丑陋。 核心Java开发人员如何编写他们的单元测试,例如,如果他们不能在java.util中包装东西?

我也试过-Djava.security.manager=...但是这会导致JVM初始化错误,当我将它设置为null,我不知道还有什么我可以将其设置为。有任何想法吗?

package java.util; 

import java.util.TreeMap.Entry; 

public class TreeMapHax { 

    static <K,V> List<Entry<K, V>> getLeafEntries(TreeMap<K, V> map) {  
     Entry<K, V> root = map.getFirstEntry(); 
     while(root.parent != null) root = root.parent; 

     List<Entry<K,V>> l = new LinkedList<Entry<K,V>>(); 
     visitInOrderLeaves(root, l); 
     return l; 
    } 

    static <K,V> void visitInOrderLeaves(Entry<K, V> node, List<Entry<K, V>> accum) {  
     if(node.left != null) visitInOrderLeaves(node.left, accum);  
     if(node.left == null && node.right == null) accum.add(node);  
     if(node.right != null) visitInOrderLeaves(node.right, accum); 
    } 

    public static void main(String[] args) { 
     TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 

     for(int i = 0; i < 10; i++) 
      map.put(Integer.toString(i), i); 

     System.out.println(getLeafEntries(map)); 
    } 

} 
+1

我猜测核心开发人员不是很乐意将他们的测试放在不同的包中(因为他们应该测试公共接口),或者让JVM构建没有这些安全限制。毕竟,Oracle是编写JVM代码的公司。 – 2013-03-22 06:08:04

+0

也许尝试获取源代码(冰茶或类似的东西),偷偷把你的文件放到“正确”的包中,然后编译整个东西?我不知道这是否会起作用,但它可能足以欺骗系统。这就是我想要的。 – 2013-03-22 07:11:51

+0

您可以使用引导类路径。创建你自己的jar包含rt.jar和这个类的所有内容。这是一个丑陋的黑客,但你说你确实想要黑客入侵。 – 2013-03-22 07:53:33

回答

2

简单地回答你的问题,没有通常的方式

在Java中的类。*不受安全管理器限制, 它们是由类加载器的限制。

todo你想要什么,你不知何故需要找到一种方法来破解jvm。 或只是照你所说的做,用反射来做。 或者只是在你自己的包中创建一个treemap的副本(源克隆)。

0

如果您创建了一个自定义的java.lang.SecurityManager,并将所有安全逻辑截断并将其编译为自定义JVM,那么您应该可以通过将“java.security.manager”属性设置为自定义管理器来引用它。

由于属性由Launcher程序开始前阅读,你必须有你在JVM赞同类路径,而不是你自己的程序(例如,在核心rt.jar文件捆绑)的自定义安全管理器。

要回答你关于核心开发人员如何处理这个问题的问题:这些测试可能会针对自定义JVM运行,因为它们不符合生产JVM的传统安全性。这种存根的一个例子可以参见here

0

我想你可能会尝试为你的自定义Java包创建jar并把它放到$ JRE_HOME/lib/ext中,并且看到魔法!

相关问题