Si prega di non inviare una risposta che dice "non si deve fare questo." Non ho intenzione di usarlo nel codice di produzione, ma solo per un po 'di divertimento hacking.Esiste un modo per eseguire codice non sicuro (disabilitare il gestore della sicurezza) in Java?
Rispondendo allo this question, volevo eseguire un codice Java arbitrario e pericoloso per il divertimento. Il codice in questione consiste nel trovare solo i foglia nodi di una Java TreeMap
.
in corso i risultati di codice qui sotto in
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
Secondo this question, posso usare System.setSecurityManager(null)
per aggirare la maggior parte di queste restrizioni. Ma non posso farlo perché l'errore si apre quando viene caricata la mia classe.
Sono già consapevole del fatto che posso fare tutto quello che voglio utilizzando la riflessione dopo la disattivazione del responsabile della sicurezza. Ma questo renderebbe il codice molto più brutto. In che modo gli sviluppatori Java di base scrivono i loro test unitari, ad esempio, se non possono impacchettare le cose in java.util
?
Ho anche provato -Djava.security.manager=...
ma questo causa un errore di inizializzazione JVM quando ho impostato a null
, e non sono sicuro che altro posso impostarlo. Qualche idea?
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));
}
}
Direi che gli sviluppatori principali sono sia felice ponendo le loro prove in diversi pacchetti (dal momento che dovrebbero essere testando l'interfaccia pubblica) o di avere un accumulo JVM senza quelle restrizioni di sicurezza. Dopo tutto, Oracle è la società che scrive il codice JVM. –
forse prova ad ottenere la fonte (tè freddo o qualcosa del genere), introducendo di nascosto il tuo file nel pacchetto "corretto" e compilando il tutto? non so se questo potrebbe funzionare, ma potrebbe essere sufficiente per ingannare il sistema. questo è quello che proverei. –
È possibile utilizzare il percorso di classe bootstrap. Crea il tuo barattolo che contiene tutto da rt.jar più questa classe. Questo è un brutto trucco, ma hai detto che vuoi hackerare. –