我们正在尝试开发一个小型应用程序,可以监控在Windows机器上执行的程序/进程。
如果程序/进程不应该运行,它应该被阻止。它的工作原理类似于防病毒软件。
这是基本的想法。
我想知道如何钩入操作系统,以便获得有关机器中每个程序/进程尝试运行的通知的方法。
我们正在尝试开发一个小型应用程序,可以监控在Windows机器上执行的程序/进程。
如果程序/进程不应该运行,它应该被阻止。它的工作原理类似于防病毒软件。
这是基本的想法。
我想知道如何钩入操作系统,以便获得有关机器中每个程序/进程尝试运行的通知的方法。
最简单的方法是使用WMI。特别是监视Win32_ProcessStartTrace。这比Win32_Process更好,因为它设置为使用事件,而Win32_Process需要轮询,这更加耗费CPU资源。以下是在C#中执行此操作的方法。首先确保将System.Management设置为项目的引用。
public System.Management.ManagementEventWatcher mgmtWtch;
public Form1()
{
InitializeComponent();
mgmtWtch = new System.Management.ManagementEventWatcher("Select * From Win32_ProcessStartTrace");
mgmtWtch.EventArrived += new System.Management.EventArrivedEventHandler(mgmtWtch_EventArrived);
mgmtWtch.Start();
}
void mgmtWtch_EventArrived(object sender, System.Management.EventArrivedEventArgs e)
{
MessageBox.Show((string)e.NewEvent["ProcessName"]);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
mgmtWtch.Stop();
}
每次启动新进程,该代码将生成一个消息框。 从那里,您可以检查白名单/黑名单并采取适当的行动。
我还没有尝试获得实时通知。无论如何,这是如何在C#中获取正在运行的进程。
using System.Diagnostics;
//Somewhere in your method
Process[] runningList = Process.GetProcesses();
foreach(Process p in runningList){
Console.WriteLine("Process: {0} ID: {1}", p.ProcessName, p.Id);
}
您还可以使用以下流程属性的道具。
我会检查Win32-api中的SetWindowsHookEx常量WH_GETMESSAGE,以在新窗口创建时向您的程序添加回调。
将此翻译为中文:http://pinvoke.net/default.aspx/user32.SetWindowsHookEx http://pinvoke.net/default.aspx/user32.SetWindowsHookEx
谷歌API和WH_GETMESSAGE来了解更多信息。
Also check out the following articles/code librarys: http://www.vbaccelerator.com/home/Vb/Code/Libraries/Hooks/vbAccelerator_Hook_Library/article.asp