![]() |
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? |
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! |
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? |
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:
![]() ![]() 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 ![]() Hier ein Beispiel, welches ich gefunden habe: ![]() (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: ![]() 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 " ![]() |
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? |
Re: bei neuem prozess ereignis aufrufen
Keine
Ich zitiere mich nochmal selbst: Zitat:
|
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: ![]() Funktioniert übrigens (entgegen dem MSDN) nicht nur auf XP sondern mindestens auch auf 2kProf (sonst würde es bei mir nicht funktionieren! ;) :mrgreen:)! |
Re: bei neuem prozess ereignis aufrufen
Zeig mal etwas Source Code. Denn das
Zitat:
|
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... |
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:
Vorraussetzung ist wie gesagt die importierte TypeLibrary "Microsoft WMI Scripting"...
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz