Soweit ich weiß kann
ShChangeNotify nicht dazu verwendet werden um die Funktionalität zu implementieren, nach der hier gefragt wird. Generell ist die Implementation der Funktionalität nach der hier gefragt wird (er möchte über Programmstarts informiert werden und sie gegebenenfalls verhindern können), recht schwierig und es gibt nicht DIE Methode die bei jedem NT basierten System funktioniert.
Die jweils einfachste Methode hängt vom verwendeten Betriebssystem ab:
Windows vor Vista:
Pre Vista/2008 ist die einfachste Möglichkeit über eine Shell Extension die das
IShellExecuteHook Interface nutzt. Der Nachteil ist, das nur Programmstarts via ShellExecute abgefangen werden können. Das umfasst zwar eigentlich alles was man aus dem Browser heraus oder der Shell (sprich Explorer) heraus startet, umfasst aber nicht explizite Starts via CreateProcess bzw. WinExec. Das ganze funktioniert
unter Vista leider nicht mehr, weil das verwendete IShellExecuteHook Interface in Vista als überholt gilt und deshalb abgeschaltet wurde. Man kann die alte Funktionalität zwar per Registry wieder aktivieren, aber ich halt von solchen systemweiten Registry Hacks nicht wirklich viel, vor allem weil man schnell mal unvorhergesehende Effekte auslösen kann, da sich das System auch für andere Applikationen nicht mehr so verhält, wie von Microsoft definiert. Um 64bit Windows Varianten unterstützen zu können, muss man ausserdem auf eine andere Programmiersprache ausweichen, die Native 64bit Code erzeugen kann, da Delphi nur 32bit Code erzeugt und der vom 64bit Explorer nicht genutzt werden kann.
Windows nach Vista SP1:
Mit Vista SP1 (und 2008) hat Microsoft einen Kernel Mode Callback eingefügt, mit dem man über Programmstarts informiert werden und diese dann auch blockieren kann. Nachteil ist hier der Zwang zum Kernel Mode und entsprechend halt auch der Zwang zu C/C++. Ein Treiber der die Funktionalität nutzt, ist eigentlich recht trivial und auch wenn man kein C/C++ Crack ist bekommt man das mit bissi probieren hin. Die verwendete
API für den Callback heißt
PsSetCreateProcessNotifyEx. Funktioniert auch mit 64bit Varianten problemlos, sofern man halt die Möglichkeit besitzt den verwendeten Treiber zu signieren.
Windows Vista SP0:
Ja, das ist so ein wenig das Problemkind. Shell Extensions funktionieren nicht wirklich, der Kernel Mode Callback existiert noch nicht. Da hilft nur die User zum Upgrade auf SP1 zu bewegen.
Die komplizierteren Methoden:
Kernel Mode Hooks
Funktioniert prinzipiell auf allen 32bit Varianten von Windows NT ab Version 4.0. Generell ein wenig "unschön", weil (offiziell zumindest) komplett undokumentiert. Da Kernel Mode gibts hier den Zwang zu C/C++. Welche
API man hookt ist letztlich jedem selbst überlassen. Sowohl NtCreateProcess/NtCreateProcessEx als auch NtCreateSection wäre möglich. Gibt sicher noch andere APIs die gehookt werden können um die Funktionalität zu implementieren. Ohne
WIRKLICH üble Hacks um den Kernel Schutz in den 64bit Windows Varianten zu umgehen, ist 64bit Support nicht möglich.
User Mode Hooks
Funktioniert prinzipiell auf allen Varianten von Windows NT. User Mode Hooks sind allerdings unsicher und wenn Du eine sicherheitsrelevante Applikation schreiben willst, sind User Mode Hooks keine wirkliche Alternative. Dafür kannst Du zumindest alle 32bit Varianten von Windows mit dem selben Code abdecken und es gibt recht brauchbare Komponenten für User Mode Hooks in Delphi, die Open Source und somit frei erhältlich sind (
uallCollection z.B.). Hook SDKs für 64bit sind dagegen sehr teuer (
Detours in der 64bit Variante kostet z.B. 50.000 US Dollar) und erfordern einen Compiler der Native 64bit Code erzeugen kann (meist C/C++). Dafür benötigt man bei 64bit Varianten von Windows kein Code Zertifikat.
File System Mini Filter Driver
Funktioniert ab Windows 2000 SP4. Eigentlich ist es für eine einfache Überwachung von Programmstarts fast ein wenig "Overkill", da man nicht nur Programmstarts mitbekommt, sondern komplett alle Dateisystemaktionen überwachen und blockieren kann. Deshalb wird diese Methode eigentlich auch ausnahmslos von allen
AV Programmen mit On
Access Scannern eingesetzt. Es handelt sich hierbei um Treiber, also Zwang zu C/C++ und bei 64bit Windows Zwang zum Code Zertifikat.
Ja, das sind die Methoden die mir auf die Schnelle einfallen. Sind bei weitem nicht alle, aber ist zumindest ein Anfang.