Class Loader Fragen

Hallo liebe Gemeinde,

seit geraumer Zeit steht fest das wir in unserer Firma die Software von Grundauf neu entwickeln werden. Bisher geschrieben in C#.NET soll die neue Version natürlich plattformunabhängig, verteilt und modular sein. Nach nicht allzulanger Überlegung stand eigentlich gleich fest das wir, vorallem das Frontend, in Java schreiben wollen (Backend wird, aller vorraussicht nach in C/C++, geschrieben).

Jetzt stellt sich mir natürlich bei meinen ersten Planungen die eine oder andere wichtige Frage. Natürlich wollen wir unsere Software weiterhin verkaufen, d.h. in erster Linie die Software sollte möglichst Lizensiert werden und natürlich vor neugierigen Augen verschlossen (Obfuscator und Co.). Sicher gegenüber Veränderung erreicht man denk ich recht gut dank „signed jars“. Jetzt weiß ich von meiner früheren Firma wo ich gearbeitet habe das damals ebenfalls ein eigener Class-Loader geschrieben wurde. Geschrieben wurde er in C wo ich davon ausgehe das es sich dabei sogar um einen „Primordial Class Loader“ gehandelt hat? Genau weiß ich es nicht da ich mir diesen damals nicht genauer angesehen habe. (Eventuell kann Ebenius noch was dazu sagen denn er hat ja in selbiger FIrma gearbeitet) Jedenfalls war er dafür zuständig die Main-Class zu laden und auszuführen, den Rest übernahm dann die VM wie gehabt. Zumindestens denke ich mir das jetzt so. Gemacht wurde das ganze weil die jars damals zwar nicht signiert aber soweit ich weiß verschlüsselt waren und man nur mit seinem Lizenz-Key entschlüsseln konnte.

Jetzt eben meine Frage: Wie geht man da am besten vor? Macht es wirklich Sinn einen eigenen Primordial Class Loader zu schreiben und geht das überhaupt? Wenn nicht, wie wäre dann die beste hernagehensweise? Wie gesagt die jars möchte ich soweit es geht signieren und natürlich verschlüsseln, sodass man nur mit Lizenz-Key oder was auch immer die Anwendung starten kann. Wie es prinzipiel gehen würde kann ich mir gut vorstellen (rein in Java geschrieben: SecureClassLoader, etc.) aber ich wollte gern erstmal Eure Erfahrungen und Meinungen dazu hören :slight_smile:

Gut Schuß
VuuRWerK :wink:

P.S.: Sollte das jetzt nicht stimmen was ich mir da gedacht habe bzgl. meiner früheren Firma dann ist das ja net schlimm aber der Gedanke an sich gefällt mir das man seine Anwendung auf diese Weise Lizenztechnisch sichern kann.

Ich denk du kannst das mit einem 2. Classloader machen, aber ich weiß nicht ob sich der Aufwand lohnt.
Mit einem Obfuscator wirst du 90% aller Neugierigen abschrecken und die die sich da durchkämpfen, da ist es meiner Meinung nach fraglich ob du die mit irgend einer Verschlüsselung abschreckst.
Weil egal was du schreibst, auch C Code kann man irgendwie lesen :wink:

Aber beim Schreiben ist mir was eingefallen :smiley:
Wie wäre es mit dem üblichen Kram + eine verschlüsselte JAR, der Key müsste dann in der Lage sein die JAR zu entschlüsseln. Irgendwie nach dem PKI Prinzip.

Alternativ könnte man einen Java-Agent nutzen und die Klassen mit einem Class-Transformer “entschlüsseln”. Ansonsten bleiben nur Lösungen wie z.B. HaspHL (also Dongles, die das gewünschte in Hardware verrichten).

[QUOTE=EagleEye]Aber beim Schreiben ist mir was eingefallen :smiley:
Wie wäre es mit dem üblichen Kram + eine verschlüsselte JAR, der Key müsste dann in der Lage sein die JAR zu entschlüsseln. Irgendwie nach dem PKI Prinzip.[/QUOTE]

Genau sowas dacht ich mir eben auch, die Frage wäre nur ob es auch Laufzeittechnisch keine Einbußen bringt? Ok beim Startup wird sowieso vieles initialisiert da kann man sowas gleich mit abfackeln, nur gibt es dafür eventuell schon beispiele wie man da am besten ran geht? Zumal man zum Startup ja nicht alle Klassen mit einmal initialisiert (initialisieren muss) und wenn dann die Klassen die während der Programmlaufzeit verwendet werden vor der Benutzung erst noch entschlüsselt werden muss (auch wenn dies nur einmal geschieht) … Oder man „tippt“ einfach mal alle Klassen die man hat statisch an brrrr ^^

@Noctarius: Mit dem Java-Agent meinst Du so gesehen einen ähnlichen Mechanismus? Der Java-Agent würde in dem Fall das laden der Klassen übernehmen diese entschlüsseln und im classpath zur Verfügung setzen? Zum Java-Agent selbst findet man recht wenig, bisher nur Defintionen (inkl. der aus der Java-Api) aber keine Beispiele wie und vorallem für was man den Java-Agent so einsetzen kann.

Und weil wir grad so schön am plaudern sind :slight_smile: Was meint ihr: welches Build-Tools ist „besser“ Ant oder doch lieber Maven? Mit Ant hab ich selber shcon gearbeitet aber mit Maven noch nicht, jedoch soll dieses ebenfalls kein schlechtes Build-Tool sein. Was habt Ihr für Erfahrungen und Empfehlungen?

Gut Schuß
VuuRWerK :wink:

naja du könntest das ja so machen, 2 Jars
Jar 1 ist Splashscreen + die gesamte Umgebung zum entschlüsseln (Kann auch was natives sein). Die verschlüsselte JAR wird irgendwo versteckt entschlüsselt und zum Classpath hinzugefügt und schon kannst du normal arbeiten.

Also Ant mag ich nicht so, weil mehr als die Arbeit von eclipse abnehmen tuts nicht. Maven hab ich vor paar Monaten in alle meine großen Projekte reingepackt und ich bin davon begeistert, gerade wenn du auf mehrere Bibliotheken zugreifen musst ists geil, weil es einfach alles auflöst.
Mein eines Webprojekt benutzt “nur” 5 Libs oder so, aber wenn ich alles auflöse hab ich ~180 JARs drin und das macht alles Maven für mich.

Hm, das mit der extra Startup-Jar klingt interessant. D.h. dann das die 2. jar, und alle weiteren, verschlüsselt sind, von der Startup-Jar entschlüsselt werden und in den classpath geladen? Klingt plausibel und umsetzbar. Muss ich mich nur nochmal mit dem PKI-Verfahren auseinandersetzen aber das sollte kein Problem sein.

Was meinst Du mit auflösen? Ermittelt Maven Deine tatsächlichen Abhängigkeiten und läd nur noch diese in eine extra jar? Ich liebäugle schon eine weile mit Maven da ich sehe das es mittlerweile in immer mehr Projekten eingesetzt wird, hab nur bisher noch nie damit gearbeitet, aber das sollte denke ich kein Problem sein.

Gut Schuß
VuuRWerK :wink:

Ja wenn du z.B. sagst “Ich will Sping benutzen, dh ich brauch spring-core und spring-xxx”, dann lädt Maven dir die beiden Jars runter, ABER es sieht auch nach was brauchen die beiden Jars zum Arbeiten und lädt diese Abhängigkeiten runter usw.

Ok, das klingt vernünftig, das schau ich mir mal an. Vielen Dank für den Tipp :slight_smile:

Zum ClassLoader hab ich mir jetzt auch mal noch meine Gedanken gemacht, mal schauen ob das was wird :slight_smile:

Würde mich freuen wenn dennoch jemand den ein oder anderen Tipp bzw. Hinweis zum ClassLoader hat sodass ich mehrere Ideen und Ansätze mit einander korrelieren kann :slight_smile:

Gut Schuß
VuuRWerK :wink:

Ich würde für eine Kombination aus Java-Agent und HaspHL stimmen :smiley: Das ist ziemlich sicher (auch wenn es für den HaspHL ein paar Emulatoren gibt - bzw ka wie das mit der aktuellen Revision ist).

Buildtool: Maven :slight_smile:

Also zu Java-Agent find ich nur sehr wenige informationen. Bis jetzt weiß ich nur das man diesen dazu verwenden kann vor der main noch etwas auszuführen. Wegen HaspHL, das schau ich mir aufjedenfall nochmal genauer an. Danke für den Tipp!

Meine Ideen bisher sind jetzt wie folgt:
[ul]
[li] Binary als Starter (JNI_CreateJavaVM, …)
[/li][li] entschlüsselt die jars
[/li][li] setzt diese im classpath
[/li][li] und startet die App
[/li][/ul]
Soweit meine ersten Ideen, werden natürlich noch weiter ausgebaut und verfeinert.

Achso: Als Build-Management-Tool werden wir wahrscheinlich Team-City einsetzen. Was haltet Ihr von dem Tool?

Gut Schuß
VuuRWerK :wink:

Das Buildtool soll richtig gut sein, ich wollte es mal einsetzen aber mein Server hier zu Hause ist zu schwach dafür bzw. ich hatte damals zuviel um die Ohren und habs nicht weiter beachtet.
Nen ExKollege von mir benutzt das auch auf Arbeit.

Also ein sehr schönes “Tutorial” für einen Java-Agent ist in Spring enthalten. Die haben einen Agent gebaut für Instrumentation.