小智 7
有几种方法可以做到这一点.如果你只需要跟踪来自特定程序(或几个程序)的进程创建,这里提到的EasyHook/Detours方法可以很好地工作,但你实际上需要在每个程序中安装CreateProcess的钩子,所以它不是一个如果要跟踪系统中的所有流程创建,这是一个很好的解决方案.
在基于NT的Windows变体(NT/2000/XP/Vista)中有一个特定的API,称为PsSetCreateProcessNotifyRoutine().不幸的是,你只能从ring0调用这个函数,所以需要在驱动程序中完成.这个CodeProject文章中有一个方便的解释(和代码):http://www.codeproject.com/KB/threads/procmon.aspx.
AFAIK,这只是一个通知,它本身不允许您告诉系统是否应该创建该进程.但是,如果您需要这样做,您可以暂停该过程(例如,通过将其作为调试器附加),同时您的代码决定是否要将其终止.
您应该查看easyhook-continued-detours项目,它是Microsoft Detours项目的.NET端口.它将允许您挂钩非托管API(例如CreateProcess).检查出一个简单的FileMon般的程序代码的例子在这里.
您可以通过使用实时 ETW 使用者来了解进程何时启动 - 但是,为了能够采取一些可能取消进程启动的操作,您必须做一些阴暗/未记录的事情,例如挂钩 CreateProcess,或者使用内核过滤驱动程序来阻止对 EXE 的读取。