Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi bei neuem prozess ereignis aufrufen (https://www.delphipraxis.net/7760-bei-neuem-prozess-ereignis-aufrufen.html)

Illuminator-23-5 20. Aug 2003 20:57


bei neuem prozess ereignis aufrufen
 
frage: kann ich irgendwie (z.B. durch einen hook) eine prozedur aufrufen, wenn ein neuer Prozess erstellt/beendet wird?
z.B.: ein Programm wird gestartet, und in meinem Projekt wird ein Ereignis aufgerufen
geht das irgendwie?

Assarbad 20. Aug 2003 21:47

Re: bei neuem prozess ereignis aufrufen
 
Hook nicht, aber es gibt mehrere andere Möglichkeiten:

- Entweder ein echter API-Hook (per Treiber).
- oder auf Windows 2000 aufwärts gibt eine Funktion (mir fällt der Name leider nicht ein) die das leistet, was du willst. Benötigt aber wahrscheinlich bestimmte Privs.
- die Ldr* Native APIs hooken.

Auf 9x habe ich keinen Schimmer!

Illuminator-23-5 20. Aug 2003 22:06

Re: bei neuem prozess ereignis aufrufen
 
ich brauch das unter winXP und win2000
könntest du mir das mit dem api-hook genauer erklären?

Assarbad 20. Aug 2003 22:29

Re: bei neuem prozess ereignis aufrufen
 
Hiho, das ist etwas zu aufwendig (wie gesagt, mit Treiber um die Native APIs zu hooken - also nix mit Delphi). Such mal folgendes:
Bei Google suchenDetours
Bei Google suchenAPI Hook EliCZ

EliCZ' Beispiel könnte u.U. systemweit funktionieren. Ich weiß es aber nicht und befürchte, daß dem nicht so ist. Suche mal im Inet nach Bei Google suchenNT process notification o.ä.

Hier ein Beispiel, welches ich gefunden habe:
http://www.codeproject.com/threads/procmon.asp
(Funktioniert nur mit Treiber!
The control application register the kernel mode driver under HKLM\SYSTEM\CurrentControlSet\Services and dynamically loads it. The kernel driver then creates a named event object that is used to signal the user-mode application when new event has been fired (i.e. process starts or ends up). The control application opens the same event object and creates a listening thread that waits on this event. Next, the user mode application sends a request to the driver to start monitoring. The driver invokes PsSetCreateProcessNotifyRoutine(), which accepts two parameters. One of them specifies the entry point of a caller-supplied callback routine, responsible for receiving all notifications from Windows. Upon a notification, that takes place in the callback, the driver signals that event in order to inform the user-mode application that something has happened. The control application then gets the data for that particular event from the driver and stores it in a special queue container for further processing. If there is no need for detecting process execution anymore the user mode application sends a request to the driver to stop monitoring. The driver then deactivates the observing mechanism. Later the control mode application can unload the driver and un-register it.)

Und da ist auch der Name der API die ich nicht mehr gefunden habe:
Bei Google suchenPsSetCreateProcessNotifyRoutine

Das Problem dieser API ist, daß es eine Kernel Mode API ist (in NTOSKRNL.EXE implementiert - es muß also ein Treiber zur Kommunikation mit deinem Programm existieren. Du kannst allerdings den Treiber aus obiger Quelle mißbrauchen ;)

IN ALLEN FÄLLEN wird es nur mit Administrator-Privs funktionieren. Außer SYSTEM und Administratoren darf kein Benutzerkontext Treiber installieren. Oder schleich dich durch ein Loch wie MSBlast ein ;)

Nachtrag: Wenn schon Treiber, dann würde ich logischerweise auch die bereits bekannte API mißbrauchen, anstatt mit API-Hooking zu spielen.
Systemweites Hooking von APIs wird im Buch "Undocumented Windows 2000 Secrets - A Programmer's Cookbook" von Sven B. Schreiber sehr gut beschrieben. Auf der CD gibt es auch Beispiele (mit C-Source).

Illuminator-23-5 21. Aug 2003 08:14

Re: bei neuem prozess ereignis aufrufen
 
das sieht mir ziemlich kompliziert aus,
welche wär die einfachste Möglichkeit, die auch unter Standard-Benutzerrechten funktioniert?

Assarbad 21. Aug 2003 09:55

Re: bei neuem prozess ereignis aufrufen
 
Keine

Ich zitiere mich nochmal selbst:
Zitat:

Zitat von Assarbad
IN ALLEN FÄLLEN wird es nur mit Administrator-Privs funktionieren. Außer SYSTEM und Administratoren darf kein Benutzerkontext Treiber installieren. Oder schleich dich durch ein Loch wie MSBlast ein


Motzi 26. Sep 2003 10:43

Re: bei neuem prozess ereignis aufrufen
 
Ist zwar schon ein weilchen her, dass dieser Thread aktuell war, aber ich will euch meinen Fund nicht vorenthalten! ;)

Das ganze funktioniert über die WMI Event Cass "Win32_ProcessStartTrace"
MSDN-Link: http://msdn.microsoft.com/library/de...starttrace.asp

Funktioniert übrigens (entgegen dem MSDN) nicht nur auf XP sondern mindestens auch auf 2kProf (sonst würde es bei mir nicht funktionieren! ;) :mrgreen:)!

Luckie 26. Sep 2003 10:59

Re: bei neuem prozess ereignis aufrufen
 
Zeig mal etwas Source Code. Denn das
Zitat:

Header: Declared in Krnlprov.mof.
Namespace: Included in \root\cimv2.
verwirrt mich etwas.

Motzi 26. Sep 2003 11:22

Re: bei neuem prozess ereignis aufrufen
 
Das Problem ist, dass das ganze WMI-Zeug ziemlich kompliziert ist, und ich noch keine Delphi-Übersetzung der Header-Files der ganzen WMI-Interfaces gefunden hab. Daher hab ich mich bis jetzt mit den Scripting-APIs abfinden müssen. Um diese verwenden zu können muss man die TypeLibrary "Microsoft WMI Scripting" importieren.

Ich selbst hab noch nichts mit diesem Event implementiert, hab aber eine funktionierende Implementierung hier. Aber ich werd mich nochmal melden, sobald ich einen funktionieren Delphi-Code zusammengeflickt hab...

Motzi 26. Sep 2003 15:55

Re: bei neuem prozess ereignis aufrufen
 
Ich muss mich korrigieren... Win32_ProcessStartTrace gibt es doch erst ab XP, aber es gibt eine andere Möglichkeit (ebenfalls per WMI):

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    aSink    : TSWbemSink;
    aLocator : TSWbemLocator;
    aServices : SWbemServices;
    procedure ProcessCreated(Sender: TObject; var objWbemObject, objWbemAsyncContext: OleVariant);
  end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  aLocator := TSWbemLocator.Create(Self);
  aServices := aLocator.ConnectServer('', 'root\cimv2', '', '', '', '', 0, nil); // connect to the local computer

  aSink := TSWbemSink.Create(Self); // sink-objects are used for asynchronous method-calls
  aSink.OnObjectReady := ProcessCreated;

  aServices.ExecNotificationQueryAsync(aSink.DefaultInterface,
      'SELECT * FROM __InstanceCreationEvent within 0.1 WHERE TargetInstance ISA "Win32_Process"',
      'WQL', 0, nil, nil); // every creation of a Win32_Proces-Object should be notified
end;

procedure TForm1.ProcessCreated(Sender: TObject; var objWbemObject, objWbemAsyncContext: OleVariant);
begin
  ShowMessage('ProcessCreated');
end;
Vorraussetzung ist wie gesagt die importierte TypeLibrary "Microsoft WMI Scripting"...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz