Fremden Programmstart erkennen



  • Hallo,
    Ich suche wie gesagt eine Möglichkeit, zu erkenne ob ein neuer Prozess in Windows gestartet wurde.

    Die einzige Möglichkeit, die ich bis jetzt aber gefunden habe, wäre über Toolhelp32Snapshot und dann die Liste zu vergleichen.

    Ich suche aber, wenn es möglich ist eine Methode den Programmstart am besten noch bevor das Programm zu erkennen, noch bevor es ausgeführt wird.

    m.f.g.
    DenzelWolf



  • du kannst dich für ein Event registrieren, das in so einem Fall ausgelöst wird, leider weiß ich gerade den Namen davon nicht 😞

    greetz KN4CK3R



  • Das Stichwort klingt schon einmal vielversprechend. Danke ich werde mal danach suchen.

    m.f.g.
    DenzelWolf


  • Mod

    Über WMI ist so etwas möglich
    Siehe __InstanceCreationEvent
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa394649(v=vs.85).aspx



  • Du kannst eine DLL schreiben und sie in den "AppInit_DLLs" Zweig der Registry eintragen. Sie wird dann von jedem Prozess, der die DLL "user32.dll" benutzt, beim Start geladen. In der Initialisierungsfunktion musst du dann irgendwie deinem Zielprozess kommunizieren, dass ein neuer Prozess gestartet wurde. Vermutlich bist du da aber etwas eingeschränkt, weil du lediglich Funktionen aus der kernel32.dll benutzen kannst, aber shared memory und Mutex sollten reichen.



  • Vielleicht wäre es ja vom Vorteil, zu erwähnen was ich im groben vorhabe.

    Ich versuche ein Programm zu schreiben, welches Autostarts und wichtige Programme auf meinem PC prüft. (soll also eine Art Virenschutz werden)

    Direkt hinter der Frage steht eigentlich, dass ich Programme die sich quasi selbst starten erst einmal pausiere und dann per Benutzereingabe oder Einstellungen entscheide, ob das Programm gestartet werden darf. (soll vorfallen helfen, falls sich ein Virus Beispielsweise in AppData einnisten will und sich dann selbst ausführen will).

    Wichtig ist also vorfallen, dass es das so schnell wie möglich erkennt (stoppt) und auch alle Programme.

    Deswegen klingt für mich gerade vor allen das „AppInit_DLLs“ sehr gut. Nur, da du gerade das „user32.dll“ noch einmal betonnt hast. Funktioniert das mit allen Programmen oder gibt es welche, die das nicht betreffen würde?



  • ein "richtiger" Virus wird zu der Zeit, wenn du mit deinem "Schutz" kommst sicherlich schon längst laufen...

    Wenn der Virus keine Funktionen aus der user32.dll benutzt, wird die DLL auch nicht geladen sondern eventuell später dynamisch nachgeladen.

    Das ganze System könnte aber recht aufwendig für dich werden, da ein Programm ja viele Hilfsprogramme haben kann bei denen du nicht auf den ersten Blick erkennen kannst, ob es gut oder böse ist.

    greetz KN4CK3R



  • Ja klar, soll eigentlich auch in erster Linie eine Warnfunktion haben.

    Ich versuche ja kein Virenscanner zu machen. Das Programm soll ja in erster Linie auf Veränderungen vom normalen Betrieb reagieren. Und eine der Funktionen (von mehreren) soll halt sein, dass es mich hinweist, wenn eine Anwendung gestartet wird, die vorher noch nie gestartet wurde bzw. nicht standesgemäß von mir verwendet wird. Ich versuche eigentlich das so zu machen, dass es so ziemlich jede Veränderung von dem Normalen merkt. (Soll auch ehr gegen Spionage sein.)

    Das hier ist eigentlich hauptsächlich gegen Programme gerichtet, die sich selbst an einen anderen Ort kopieren und von dort ausführen oder gegen solche, die sich mehrfach starten und sich gegenseitig neustarten wenn man sie beendet(Habe ich mal bei wme anders miterlebt, das kann ganz schön nervig sein).

    Aber ich habe halt nicht herausgefunden, wie man einen Prozess der gestartet wird sofort anhält, bevor er anfängt sich auszuführen. (wie gesagt, das ist nur Nebenbei und es ist auch nicht schlimm, wenn nicht sofort ist, aber ich dachte vielleicht weiß jemand Zufällig, wie man das verzögerungsfrei hinbekommt)



  • Direkt hinter der Frage steht eigentlich, dass ich Programme die sich quasi selbst starten erst einmal pausiere und dann per Benutzereingabe oder Einstellungen entscheide, ob das Programm gestartet werden darf. (soll vorfallen helfen, falls sich ein Virus Beispielsweise in AppData einnisten will und sich dann selbst ausführen will).

    Wie soll sich ein Programm von alleine ausführen nur weil es im AppData Ordner liegt 😕

    Du könntest allerdings mal nach Opensource Virenscannern gucken vielleicht gibt es da ja was.



  • naja, ich habe das selbst mal aus purer Dummheit geschafft mir einen Virus einzufangen. Der hat dann ein zweites Programm in AppData kopiert und diese dann gestartet. (So ist das gemeint).

    Ironischerweise hat auch da mein Mist Antivirensystem nix gemerkt. (habe es dann an meiner Firewall erkannt, dass da was war).



  • 1. Methode

    Einen Hook in die Windows API Funktion CreateProcess zu platzieren, sodass der Prozess-Filter vor jedem Prozessstart die Berechtigung prüft. Die CreateProcess Funktion läuft im User Mode. Der Nachteil dieser Methode ist, dass nicht alle Programme über die Windows API CreateProcess gestartet werden. Ein Entwickler kann direkt auf die Kernel Schnittstelle zugreifen, wenn er die entsprechenden Befehle kennt.

    2. Methode

    Ein weiterer Ansatz basiert darauf, dass der Hook in der Kernel Funktion NTCreateProcess platziert wird. Diese Funktion muss bei allen Prozessstarts durchlaufen werden und bietet daher den idealen Ort für den Prozess-Filter.

    Kernel Hook

    Windows bietet standardmässig keine Möglichkeit, einen Hook in die NTCreateProcess einzufügen. Es gibt jedoch eine Benachrichtigungsmöglichkeit
    der NTCreateProcess-Funktion. Die Benachrichtigung erfolgt jedoch erst nach dem Start, und wie vorhin beschrieben ist dies für den Prozess-Filter zu spät. Aus diesem Grunde muss die NTCreateProcess Funktion im Kernel verändert werden. Das heisst, sobald die Funktion aufgerufen wird, muss der Prozess-Filter die Kontrolle bekommen. Der Prozess-Filter prüft dann die Liste der berechtigten Prozesse. Falls das Programm gestartet werden darf, übergibt der Prozess-Filter die Kontrolle wieder der NTCreate-Process Kernel Funktionen. Ansonsten verweigert der Prozess-Filter den Zugriff auf die Datei und die NTCreateProcess Funktion kann das Programm nicht in den Prozess laden. Damit Veränderungen im Kernel vorgenommen werden können, muss der Prozess-Filter als System-Treiber installiert werden. Ein System-Treiber wird durch dessen Installation ein Teil des Betriebssystems.

    Wenn Du dass machen möchtest überschreibt Dein Prozess-Filter-Treiber den Anfang der Funktion NTCreateProcess mit einem Befehl, welche den Programmfluss
    zum Prozess-Filter umleitet. Gleichzeit merkt er sich die Stelle in der NTCreateProcess, wo er nach seiner Arbeit wieder hinspringen muss. Damit ist
    der Kernel Hook platziert.

    Alles andere ist garbage...

    Viel Spass 💡 🕶



  • Martin Richter schrieb:

    Über WMI ist so etwas möglich
    Siehe __InstanceCreationEvent
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa394649(v=vs.85).aspx

    Scheidet leider aus Martin... zu spät. Aber ich glaube das weisst Du selber. Doch immer noch besser als all den anderen Schwachsinn den ich bisher hier gehört habe.



  • Das mit dem NTCreateProcess ist genau das was ich gesucht habe. Ist zwar etwas Neuland für mich, aber ich werde es schon irgendwie hinbekommen.

    Vielen Dank -lowbyte-.

    m.f.g.
    DenzelWolf


Anmelden zum Antworten