2013-03-22 12 views
7

Vui lòng không đăng câu trả lời cho biết "bạn không nên làm điều này". Tôi không có kế hoạch sử dụng điều này trong mã sản xuất, nhưng chỉ cho một số niềm vui hacking.Có cách nào để thực thi mã không an toàn (vô hiệu hóa trình quản lý bảo mật) trong Java không?

Khi trả lời this question, tôi muốn chạy một số mã Java không an toàn tùy ý để giải trí. Mã trong câu hỏi liên quan đến việc tìm kiếm các nút của Java TreeMap.

Chạy kết quả mã dưới đây trong

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

Theo this question, tôi có thể sử dụng System.setSecurityManager(null) để có được xung quanh hầu hết những hạn chế này. Nhưng tôi không thể làm điều này vì lỗi xuất hiện khi lớp của tôi được tải.

Tôi đã biết rằng tôi có thể làm mọi thứ tôi muốn sử dụng phản chiếu sau khi tắt trình quản lý bảo mật. Nhưng điều đó sẽ làm cho mã xấu hơn nhiều. Làm thế nào để các nhà phát triển Java lõi viết các bài kiểm tra đơn vị của họ, ví dụ, nếu họ không thể đóng gói những thứ trong java.util?

Tôi cũng đã thử -Djava.security.manager=... nhưng điều này gây ra lỗi khởi tạo JVM khi tôi đặt thành null và tôi không chắc chắn những gì khác tôi có thể đặt. Bất kỳ ý tưởng?

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

Tôi đoán rằng các nhà phát triển cốt lõi hoặc là hạnh phúc đặt các bài kiểm tra của họ trong các gói khác nhau (vì họ nên thử nghiệm giao diện công khai) hoặc có JVM xây dựng mà không có những hạn chế bảo mật. Xét cho cùng, Oracle là công ty viết mã JVM. –

+0

có thể thử lấy nguồn (trà đá hoặc thứ gì đó giống như nó), lén tệp của bạn vào gói "đúng" và biên dịch toàn bộ? Tôi không biết nếu điều đó sẽ làm việc nhưng nó có thể là đủ để lừa hệ thống. đó là những gì tôi muốn thử. –

+0

Bạn có thể sử dụng đường dẫn lớp khởi động. Tạo jar của riêng bạn có chứa mọi thứ từ rt.jar cộng với lớp này. Đây là một hack xấu xí, nhưng bạn nói rằng bạn muốn hack. –

Trả lời

2

chỉ đơn giản là trả lời câu hỏi của bạn, không có cách thông thường

các lớp trong java. * Bị hạn chế không phải do quản lý bảo mật, họ bị hạn chế bởi các bộ nạp lớp.

cần làm những gì bạn muốn, bằng cách nào đó bạn cần tìm cách để hack jvm. hoặc chỉ làm như bạn đã đề cập, làm điều đó với sự phản ánh. hoặc chỉ tạo bản sao (bản sao nguồn) của sơ đồ trang web trong gói của riêng bạn.

0

Nếu bạn tạo java.lang.SecurityManager tùy chỉnh với tất cả các logic bảo mật được phân tích và biên dịch thành một JVM tùy chỉnh, bạn có thể tham chiếu nó sau đó bằng cách đặt thuộc tính "java.security.manager" cho trình quản lý tùy chỉnh của bạn.

Vì thuộc tính được đọc bởi Launcher trước khi chương trình của bạn bắt đầu, bạn phải có SecurityManager tùy chỉnh trong đường dẫn lớp được JVM xác nhận thay vì chương trình của riêng bạn (ví dụ: gói trong tệp rt.jar lõi).

Để trả lời câu hỏi của bạn về cách các nhà phát triển cốt lõi đối phó với điều này: các loại kiểm tra này có thể sẽ chạy trên JVM tùy chỉnh vì chúng không tuân thủ bảo mật truyền thống của JVM sản xuất. Một ví dụ về bài khai như vậy có thể được tìm thấy here.

0

Tôi nghĩ bạn có thể thử tạo jar cho gói Java tùy chỉnh của bạn và đặt nó vào $ JRE_HOME/lib/ext và xem phép thuật !!

Các vấn đề liên quan