2012-03-26 6 views
1

Ich versuche, JPF zu verwenden, um meinen Bytecode zu überprüfen, der während der Laufzeit mit javassist generiert wird.Java Path Finder für Bytecode Verifikation in einem bestehenden Projekt, Bytecode Verifikation

Der Code, den ich versuche zu überprüfen, wird vom Benutzer während der Ausführung meines Programms bereitgestellt. Da ich nicht alle OOP-Modelle und solche Sachen überprüfen kann, brauche ich einen Überprüfungsprozess, bevor ich seinen Code ausführe.

Im Moment erzeuge ich einfach Bytecode mit javassist aus seinen Klassen.

Mein Problem ist jetzt, dass ich manchmal Ausnahmen bekomme, weil der Benutzer einige Vererbungsfehler und so Sachen gemacht hat und meine Anwendung mit einer Ausnahme heruntergefahren ist, weil ich versucht habe, seine Klassen zu laden und auszuführen.

Daher möchte ich diesen generierten Bytecode in Laufzeit überprüfen, um solche Ausnahmen zu vermeiden und früher zu wissen, ob die vom Benutzer bereitgestellten Klassen fehlerhaft sind (oder ein Problem enthalten).

Ist dies mit JPF während der Laufzeit möglich?

Irgendwelche anderen Lösungen auf diesem?

Danke!

+0

versuchen, einen Hash auf den Byte-Code zu machen; Vielleicht wählen Sie Bytes an verschiedenen/zufälligen Orten und sehen, ob sie übereinstimmen; es sollte viel schneller sein, als die gesamte Datei zu überprüfen – Adrian

+0

Ein Hash wäre nur mit den Dingen zu vergleichen oder liege ich falsch? Ich muss überprüfen, ob der Code gültig ist und ohne eine Ausnahme ausgeführt werden kann oder nicht! – Evils

+0

Mein Eindruck war, dass Sie Gleichheit auf allen Bytes machten ... nicht, dass die Bytes gültiger Code sind. Habe ich missinterpretiert? – Adrian

Antwort

1

Es gibt viele Punkte zu überprüfen, fangen: selbst

aus meiner Sicht ein ClassLoader hat das alles Schritte, aber Es lädt im Allgemeinen eine Klasse zu einer Zeit und nur auf Anfrage.

In Ihrem Kontext schlage ich Ihnen vor, eine ClassLoader schreiben, die in Reihenfolge alle Klassen von generierten Bytecodes lädt und jeden fehlerhaften Klassennamen mit gefangenen Ausnahmen meldet. Der ClassLoader wird mit dem Verweis auf den relevanten übergeordneten ClassLoader instanziiert und nach dem Test verworfen. Der generierte Bytecode wird dann vom ursprünglichen ClassLoader des Laufzeitkontexts geladen.

Wahrscheinlich kann diese Klassenladeprüfung dank OSGi implementiert werden, erfordert aber mehr Aufwand als ein eigenständiger ClassLoader.

2

Als JPF verwendet BCEL Stand-alone Bytecode Verifier kann hilfreich sein. Rufen Sie die Verifier-Klasse programmgesteuert auf oder tauchen Sie in die Details dieser Klasse ein. hth

+0

Ich bin nicht 100% sicher, aber einige Tests zeigten mir, was ich lesen wollte: "Insbesondere werden wir nicht die Sicherheitseinschränkungen behandeln, die die Java Virtual Machine zur Laufzeit überprüfen muss, dh den Bytecode-Verifier . " So sieht es für mich aus, da der von BCEL (oder Javassist) verwendete Bytecode-Verifizierer keine 100% saubere Überprüfung ist, deshalb versuche ich, JPF – Evils

+0

Mein Fehler zu verwenden. Ich stolperte auf eine alte Version von JPF, die von BCEL abhing, aber ich sah gerade, dass neue Versionen nicht sind. Also vergiss meinen Kommentar ... –

0

Wenn Sie nicht unbedingt JPF verwenden müssen, enthält die ASM-Bibliothek CheckClassAdapter, der Bytecode verifizieren kann. Es ist nur eine Plausibilitätsprüfung aber - ich glaube es nicht Probleme mit Vererbung usw.

+0

Das ist das Problem, wie ich sagte, ich brauche 100% korrekte Überprüfung, die OOP-Modelle überprüft und die sicher ist, auf dem JVM ohne Ausnahmen zu laufen. Zusätzlich dazu muss ich korrekte und gute Fehlermeldungen vom Verifizierer bekommen, die ASM nicht zur Verfügung stellt – Evils