Oto 2 sposoby, których na codzień używam:
1. HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
AppInit_DLLs = "myappinit.dll"
W tym kluczu dodajemy nazwę własnego pliku dll (bez spacji). Jeżeli jest tam już coś, do oddzielamy nowy wpis spacją lub przecinkiem.
Jak to działa: każda uruchamiana aplikacja, która ładuje user32.dll (np. otwiera jakieś okna), załaduje nasz dll, w którym należy sprawdzić, co za program właśnie się uruchamia - funkcja GetModuleFileName. Jeżeli to jakiś nieznany program, to z DllMain, podczas obsługi DLL_PROCESS_ATTACH, można od razu zwrócić FALSE, by wyładować dll. W przeciwnym razie (gdy to program który mamy zamiar monitorować) tworzymy nowy wątek (funkcją CreateThread) i zwracamy TRUE.
Funkcja uruchamiana w nowym wątku powinna wykonać jakąś swoją pracę i zakończyć (return 0), zawiesić się (Sleep -1), bądź ciągle siedzieć w pętli.
Gdy aplikacja przestanie działać, ale jeszcze będzie istnieć (podczas wywołania funkcji ExitProcess), dll zostanie o tym powiadomiony poprzez funkcję DllMain z argumentem DLL_PROCESS_DETACH. Tutaj nie można zbyt wiele zrobić, większość funkcji api będzie działać wadliwie, jedynie proste operacje, jak zapis do pliku, będą działać poprawnie.
Nowo dodane dllki do tego klucza mogą być ignorowane aż do następnego restartu systemu.
2. HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
Tutaj tworzymy podklucz o nazwie identycznej jak monitorowany program, razem z końcówką .exe, a w tym podkluczu tworzymy wartość "debugger" typu string, ze ścieżką do programu, który zostanie uruchomiony zamiast programu monitorowanego, jako debugger.
Przykład:
HKLM\ ... \Image File Execution Options\notepad.exe
debugger = winlogon.exe
Efekt: uruchomienie notatnika spowoduje uruchomienie natywnego programu winlogon, który po pierwsze nie uruchomi się wcale (inna budowa programu), a po drugie, notatnik też się nie uruchomi, chyba że zmienisz mu nazwę.
Praktyczniejszy przykład:
HKLM\ ...\ Image File Execution Options\notepad.exe
debugger = c:\moje_programy\app_monitor.exe
Podczas uruchamiania notatnika, program app_monitor.exe zostanie uruchomiony z parametrem "c:\windows\notepad.exe", lub gdziekolwiek indziej notepad.exe się znajduje - katalog będzie inny. Notatnik nie zostanie uruchomiony, to app_monitor.exe ma o to zadbać.
UWAGA! jeżeli spróbujesz uruchomić notatnik (z programu app_monitor.exe) ot tak po prostu, to ponownie uruchomisz sam siebie. Musisz albo najpierw usunąć cały string "debugger" z rejestru, albo uruchomić notatnik w trybie debugowania - CreateProcess z flagą DEBUG_PROCESS.
Oba sposoby są dobre, pierwszego używam do naprawiania błędów w programach, lub dodawania do nich czegoś nowego, a drugi sposób służy mi głównie do blokowania aplikacji - nie chcę, by niektóre się uruchamiały.
Trzeci sposób - powiązany z WMI, z takim oto zapytaniem:
SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'
Sporo przykładów znajdziesz w google.