# Signatur von Main-Methoden?



## Ice-Tea (12. Mrz 2009)

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-ectron-X (12. Mrz 2009)

???:L In Java ist die eindeutig, weil einzigartig...

[HIGHLIGHT="Java"]public static void main(String[] args)[/HIGHLIGHT]


----------



## Ice-Tea (12. Mrz 2009)

Ja, nur ich bräuchte eine art Hash-Wert vom Bytecode. (Änlich zu standart Virenscannern)


----------



## maki (12. Mrz 2009)

ähhhh... was?


----------



## L-ectron-X (12. Mrz 2009)

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.


----------



## Ice-Tea (12. Mrz 2009)

Ich kann ja schlecht nach "public static void main(String[] args)" im Bytecode bzw. in clasfiles suchen


----------



## Ice-Tea (12. Mrz 2009)

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


----------



## hdi (12. Mrz 2009)

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.


----------



## thE_29 (12. Mrz 2009)

Du willst sowas hier machen?

http://www.java-forum.org/493340-post6.html


----------



## Ice-Tea (12. Mrz 2009)

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).


----------



## Ice-Tea (12. Mrz 2009)

thE_29 hat gesagt.:


> Du willst sowas hier machen?
> 
> http://www.java-forum.org/493340-post6.html



Sieht ganz nett aus. Ich werd mir mal ansehen


----------



## tuxedo (12. Mrz 2009)

Ä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


----------



## thE_29 (12. Mrz 2009)

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..


----------



## hdi (12. Mrz 2009)

> 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...


----------



## Ice-Tea (12. Mrz 2009)

thE_29 hat gesagt.:


> Nachteil ist halt, dass die Klasse dann halt geladen ist. Ob man das will oder nicht ist ja ne andere Frage..



Genau das ist es was ich nicht will 

@HDI: Villeicht solltest du AVG mal deine "dangerous.jar" schicken


----------



## hdi (12. Mrz 2009)

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?


----------



## Ice-Tea (12. Mrz 2009)

Ein Jar ist ein Zip, damit kann jeder Scanner umgehen...


----------



## hdi (12. Mrz 2009)

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?


----------



## Ice-Tea (12. Mrz 2009)

http://www.java-forum.org/493340-post6.html

So ungefähr


----------



## Ice-Tea (12. Mrz 2009)

@thE_29:
nur mal so als Rückmeldung. bisher trifft es auf alle zu!
Great Job!


----------



## thE_29 (13. Mrz 2009)

Na super 
Sollte sich ja hoffentlich nicht ändern


----------



## The_S (13. Mrz 2009)

L-ectron-X hat gesagt.:


> ???:L In Java ist die eindeutig, weil einzigartig...
> 
> [HIGHLIGHT="Java"]public static void main(String[] args)[/HIGHLIGHT]



Kleiner Hinweis:

Java Blog Buch : 04.03.05 Sonderfall main

Die Main-Methode kann auch geringfügig manipuliert werden, muss also nicht immer zwingend so aussehen.


----------



## thE_29 (13. Mrz 2009)

Najo, du kannst ne Exception dazuhauen, dass wars aber auch schon!


----------



## Ice-Tea (13. Mrz 2009)

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.


----------



## The_S (13. Mrz 2009)

thE_29 hat gesagt.:


> 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.



Ice-Tea hat gesagt.:


> 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.


----------



## Illuvatar (13. Mrz 2009)

Ice-Tea hat gesagt.:


> 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.


----------



## Ice-Tea (13. Mrz 2009)

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


----------



## The_S (13. Mrz 2009)

Ice-Tea hat gesagt.:


> Ich hab grad noch mal ein wenog rumgehext
> 
> public strictfp synchronized final static void main(String args[]) { ...
> ==
> ...



Interessant. Evtl. nehme ich das mit ins Java-Blog-Buch auf. Und wie schauts aus, wenn zusätzlich eine Exception geworfen werden könnte?


----------



## Ice-Tea (13. Mrz 2009)

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

stimmt ebenfalls überein


----------



## thE_29 (13. Mrz 2009)

Tjo, hab ich die ultimative Signatur entdeckt 

Weiß gar nicht wie ich die eigentlich gefunden habe.. Hrhr


----------

