如何在Windows中挂钩应用程序和进程启动?

时间:2011-11-16 19:34:38

标签: windows hook

我正在尝试编写一个程序,它将挂钩到应用程序启动并捕获命令行。不知道从哪里开始,因为我在Windows编程中非常环保。 非常感谢任何帮助 感谢

1 个答案:

答案 0 :(得分:4)

您没有提及您喜欢的编程语言,因此我将使用C#作为代码段。

您可以启动进程并捕获/写入其标准IO流。

以下代码段打开一个流程并捕获其 StdOut 流:

using (var process = Process.Start(new ProcessStartInfo(FileName = @"yourExecutablePath", UseShellExecute = false, RedirectStandardOutput = true)))
    using (var stdout = process.StandardOutput)
        Console.WriteLine(stdout.ReadToEnd());

编辑1

您希望挂钩Windows API,例如 CreateProcess

这样做的一种方法是编写内核驱动程序并使用诸如SSTD修补之类的挂钩技术。但编写内核驱动程序IMO很麻烦。

在某些情况下,您可以使用用户级挂钩。有一些图书馆可以帮助您,包括: EasyHook Deviare MS Detour


编辑2

您也可以使用 WMI 作为@David Heffernan建议,但它只会通知您 AFTER 该过程开始(而不是挂钩,这可以让您运行一些任意代码 BEFORE 调用钩子函数和/或覆盖函数调用):

using System.Management;

// Run this in another thread and make sure the event watcher gets disposed before exit

var start = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));    

start.EventArrived += new EventArrivedEventHandler(delegate (object sender, EventArrivedEventArgs e) {
    console.WriteLine("Name: {0}, Command Line: {1}", e.NewEvent.Properties["ProcessName"].Value, e.NewEvent.Properties["Commandline"].Value);
});

start.Start()