Monitorare l’avvio del processo nel sistema

C’è un modo per monitorare i processi che iniziano nel sistema prima che inizino?

Esempio:
Su programmi come ZoneAlarm o Antivirus, quando esegui un programma ti chiede se autorizzi l’esecuzione di questo programma o meno prima dell’esecuzione …

Ci sono alcuni modi per farlo. Se devi solo tracciare la creazione del processo proveniente da un programma specifico (o alcuni programmi), il metodo EasyHook / Detours menzionato qui funzionerà abbastanza bene, ma è effettivamente necessario installare un hook su CreateProcess in ogni programma, quindi non è un ottima soluzione se si desidera tenere traccia di tutta la creazione del processo nel sistema.

Esiste un’API specifica per questo nelle varianti di Windows basate su NT (NT / 2000 / XP / Vista) denominate PsSetCreateProcessNotifyRoutine (). Sfortunatamente, puoi chiamare questa funzione solo da ring0, quindi è necessario farlo in un driver. C’è una spiegazione pratica (e codice) in questo articolo CodeProject: http://www.codeproject.com/KB/threads/procmon.aspx .

AFAIK, questa è solo una notifica e di per sé non ti consente di dire al sistema se il processo debba essere creato o meno. Tuttavia, se dovessi farlo, potresti sospendere il processo (ad esempio collegandoti ad esso come un debugger) mentre il tuo codice decide se ucciderlo o meno.

Dovresti controllare il progetto easyhook-continuous-devours , che è una porta .NET del progetto Microsoft Detours . Ti permetterà di agganciare API non gestite (come CreateProcess). Scopri esempi di codice per un semplice programma simile a FileMon qui .

Puoi scoprire quando i processi iniziano usando un consumatore ETW in tempo reale, tuttavia, per poter intraprendere qualche azione che potrebbe annullare il processo dall’inizio, dovrai fare qualcosa di losco / non documentato, come l’hooking di CreateProcess, o utilizzando un driver di filtro del kernel per bloccare le letture sull’EXE.

Basta usare le notifiche per la creazione del processo. È incluso in Windows. Non devi agganciare nulla.