tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
468
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    PsychedelicSpark PsychedelicSpark ist offline Mitglied
    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..
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    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ß
     

  3. #3
    PsychedelicSpark PsychedelicSpark ist offline Mitglied
    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:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
        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?
     

  4. #4
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,
    das ist wohl eine Frage, die du eher im C/C++ Forum stellen solltest.

    Gruß

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

  5. #5
    SE 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)
     

  6. #6
    Avatar von mccae
    mccae mccae ist offline Senfdazugeber
    Registriert seit
    Dec 2007
    Ort
    Wien
    Beiträge
    226
    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.
     

  7. #7
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  8. #8
    PsychedelicSpark PsychedelicSpark ist offline Mitglied
    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...
     

  9. #9
    SE 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.
     

  10. #10
    PsychedelicSpark PsychedelicSpark ist offline Mitglied
    Registriert seit
    Feb 2011
    Beiträge
    14
    Zitat Zitat von SPiKEe Beitrag anzeigen
    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:
    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)
     

  11. #11
    SE 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.
     

  12. #12
    socke77 socke77 ist offline Rookie
    Registriert seit
    Nov 2010
    Beiträge
    9
    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.
     

  13. #13
    PsychedelicSpark PsychedelicSpark ist offline Mitglied
    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

  1. Perl: Prozess nach 1 Stunde kontrolliert beenden und neustarten: alarm() geht nicht
    Von Marius Heil im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 1
    Letzter Beitrag: 19.03.08, 17:07
  2. Antworten: 0
    Letzter Beitrag: 08.12.05, 20:01
  3. MDI Anwendung: Speichern beim Beenden
    Von LieberNet im Forum .NET Archiv
    Antworten: 3
    Letzter Beitrag: 01.06.05, 11:20
  4. [C] beenden der anwendung verhindern
    Von daleIlowmo im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 23.08.03, 14:30
  5. beenden der anwendung
    Von thecooper im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 26.07.03, 16:04