Signatur von Main-Methoden?

Status
Nicht offen für weitere Antworten.

Ice-Tea

Bekanntes Mitglied
Kurz zum Gebrauchszweck:
Ich bastel grad ein Programm, welches Java-Jar Dateien aufnimmt und diese starten kann. Da das ganze später P2P läuft, möchte ich sicherstellen das nur Ausführbare Jar-Files 'hochgeladen' werden. Mir reicht da ein einfach Dateierweiterungsprüfung nicht.

Gibt es eine eindeutige Signatur von der Main-Methode?
 
???:L In Java ist die eindeutig, weil einzigartig...

[HIGHLIGHT="Java"]public static void main(String[] args)[/HIGHLIGHT]
 
Warum guckst du nicht in der Manifest-Datei nach der Main-Class?
Wenn's eine gibt, hast du es mit einem ausführbaren Jar zu tun.
 
Ich kann ja schlecht nach "public static void main(String[] args)" im Bytecode bzw. in clasfiles suchen
 
Reicht mir nicht.
Dann bräuchte man nur ein Textfile erstellen und in ein umbenanntes Zipfile stecken und schon ist die sache 'gehackt'.

Ich dachte mir das so:
Im Manifestnachsehen wo die Mainmethode liegen soll und daraufhin prüfen ob es in dieser klasse tatsächlich eine Mainmethode gibt
 
Eine Manifest Datei alleine ist auch keine Garantie dafür, dass es ein ausführbares
Programm ist.

Ich kann ja als .jar zusamannezippen worauf ich Lust hab.

Du kannst natürlich

1) nach einem src-zip im jar suchen, und dort in allen Dateien nach der main
2) einen De-Obfuscator nutzen falls du nur die classfiles hast.

Die main-Methode sollte er dir so wie sie im Original ist rausparsen können.

Dann hast du eigentlich auch einigermassen die Gewissheit, dass das Programm
erfolgreich kompilieren konnte und wirklich etwas macht.

edit: Das "anstarten" würde ich mal schön lassen. P2P? Have fun, ein Java-Programm
dass dir 95% aller Daten auf der Platte löscht ist ein 3-Zeiler.

edit2:
Die main Methode lässt sich übrigens nur mit RegEx finden, was ja nich so schwer
ist, aber ich sag's nur. Der Parameter-Name kann beliebig sein, und statt
String[] args könnte String args[] stehen, bzw. String... args.
 
Zuletzt bearbeitet:
Viel zu kompliziert.

@hdi: sollche 3 Zeiler haben aber auch eine Signatur, die lässt sich recht schnell rausfiltern. Aber dafür ist mein Virenscanner verantwortlich 😉

Ich werd mal sehen ob in verschiedenen Main-Klassen einen eindeutigen ansatz finde(bis auf den Klartext).
 
Ähm, lässt sich nicht mit Reflection in Klassen reinschauen und nachsehen ob es eine Methode die gibt "main" heisst, "public" und "static" und "void" ist und ein String-Array als Argument hat?

Wäre jetzt mein erster Ansatz ohne auch nur 5sek nachgedacht zu haben :autsch:

- Alex
 
Jo, auch das wäre eine Möglichkeit gewesen!

Mein Programmcode geht sowieso her und schaut zuerst in der Manifest nach!
Danach suche ich halt die main Signatur. Obwohl es mit loaden und nachgucken auch gehen würde.

Nachteil ist halt, dass die Klasse dann halt geladen ist. Ob man das will oder nicht ist ja ne andere Frage..
 
Aber dafür ist mein Virenscanner verantwortlich

Hm was haste denn für einen? Also ich denke nicht dass herkömmlich Scanner
jar-Archive abscannen können auf sowas, oder?
Also Norton, McAffee und der ganze Mist 😉

Mein AVG zB sieht eine "dangerous.jar", die alle Dateien auf der Platte löscht
als absolut ungefährlich an...
 
Ne mal ernsthaft Ice-Tea...
Ich denke Virenscanner können nicht sonderlich gut mit jar's umgehen.
Erekennt deiner sowas? Falls ja, was für einen hast du?
 
Ja ich meine Java, das ist wohl das typische für jar's oder 😉
Sach ma an.. mich interessiert das wirklich. Wie stellst du dir sowas vor?
Oder hab ich den beschisstensten Scanner auf der Welt?
 
Also das mit dem static ohne Main funktioniert bei mir nicht. Zumindest nicht als ausführbares Jar.
Ich wüsste auch nicht wo das Manifest in solch einem Fall hinzeigen sollte/müsste/könnte.
 
Najo, du kannst ne Exception dazuhauen, dass wars aber auch schon!

Du kannst noch varargs verwenden (was aber intern ja ohnehin wieder ein array ist), und die Methode um strictfp, final und synchronized erweitern. Und halt die Exception werfen.

Also das mit dem static ohne Main funktioniert bei mir nicht. Zumindest nicht als ausführbares Jar.

Im Manifest wird ja explizit eine Klasse als Main angegeben. Ich vermute, wenn die Klasse dort keine Main-Methode hat, wird auch nichts ausgeführt. Ohne JAR funktionierts auf jedenfall.
 
Also das mit dem static ohne Main funktioniert bei mir nicht. Zumindest nicht als ausführbares Jar.
Ich wüsste auch nicht wo das Manifest in solch einem Fall hinzeigen sollte/müsste/könnte.

Naja, du kannst trotzdem auf die Klasse verweisen, die den static-Block enthält. Dann ist es eben so: Klasse wird geladen => static-Block wird ausgeführt => main-Methode wird gesucht => nicht gefunden => Error
Wenn der static-Block System.exit enthält (Beispiel im Blog-Buch), wird der Fehler natürlich sozusagen unterdrückt. Wenn man z.B. eine UI starten will, kann man im static-Block vielleicht auch wait() aufrufen, dann kommt der Fehler auch nie, und die UI läuft in einem anderen Thread.
Sinn macht das alles natürlich keinen.
 
Ich hab grad noch mal ein wenog rumgehext 🙂

public strictfp synchronized final static void main(String args[]) { ...
==
public static void main(String args[]) { ...

Beide haben die gleiche Signatur

01 00 04 6d 61 69 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00
01 00 04 6D 61 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 01 00
 
Ich hab grad noch mal ein wenog rumgehext 🙂

public strictfp synchronized final static void main(String args[]) { ...
==
public static void main(String args[]) { ...

Beide haben die gleiche Signatur

01 00 04 6d 61 69 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00
01 00 04 6D 61 69 6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 01 00

Interessant. Evtl. nehme ich das mit ins Java-Blog-Buch auf. Und wie schauts aus, wenn zusätzlich eine Exception geworfen werden könnte?
 
public strictfp synchronized final static void main(String args[]) throws Exception{ ...

stimmt ebenfalls überein
 
Tjo, hab ich die ultimative Signatur entdeckt 😀

Weiß gar nicht wie ich die eigentlich gefunden habe.. Hrhr 😉
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben