如何挂钩到 Windows 中的应用程序和进程启动?
Posted
技术标签:
【中文标题】如何挂钩到 Windows 中的应用程序和进程启动?【英文标题】:How to hook into application and process startup in windows? 【发布时间】:2011-12-30 17:58:23 【问题描述】:我正在尝试编写一个程序来挂钩应用程序启动并捕获命令行。不知道从哪里开始,因为我在 Windows 编程方面很年轻。 将不胜感激任何帮助 谢谢
【问题讨论】:
“挂钩到应用程序启动”是什么意思?您希望您的应用在进程启动时发送通知? 请给我们一些解释你为什么要尝试这样的事情。我们可能会建议更简单的方法和替代技术。这也有助于消除疑虑,因为挂钩技术通常用于恶意目的,而我们真的不想提供帮助。无论如何,在尝试编写系统挂钩之前,首先要真正了解 Windows 系统编程,这不是入门类型的任务。 远非恶意——如果我的目的是这样的话,我将有更简单的方法来实现这一点,而不是在这里提出一个关于堆栈溢出的非常基本的问题!但是要回答您的问题-我希望能够跟踪我在计算机上所做的所有事情,我倾向于深入研究某事,然后几个月就忘记了。我想为我的活动创建一个巨大的数据库,我可以搜索和访问它,并且希望以最少的干扰来完成这项工作。因此,监视我的行为的服务会很有用...我使用 XP 和 Windows 7。 【参考方案1】:您没有提到您喜欢的编程语言,所以我将使用 C#,例如 sn-ps。
您可以启动一个进程并捕获/写入其标准 IO 流。
以下 sn-p,打开一个进程并捕获其 StdOut 流:
using (var process = Process.Start(new ProcessStartInfo(FileName = @"yourExecutablePath", UseShellExecute = false, RedirectStandardOutput = true)))
using (var stdout = process.StandardOutput)
Console.WriteLine(stdout.ReadToEnd());
编辑 1
您似乎想挂接 CreateProcess 等 Windows API。
这样做的一种方法是编写内核驱动程序并使用挂钩技术,例如 SSTD 补丁。但是编写内核驱动IMO很麻烦。
在某些情况下,您可以使用用户级挂钩。有几个库可以帮助您解决这个问题,包括:EasyHook、Deviare 和 MS Detour。
编辑 2
您也可以按照@David Heffernan
的建议使用 WMI,但它只会在进程开始之后通知您(而不是挂钩,它允许您运行一些任意代码在挂钩函数被调用和/或覆盖函数调用):
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()
【讨论】:
我认为 WMI 可以向您发送通知。 @DavidHeffernan 是的,您可以在 WMI 中创建查询并在进程启动/停止时收到通知并获取进程命令行参数,但它不能用于挂钩任务。 Wmi 听起来很有趣。你是对的,我猜它归结为我想得到进程启动的通知,实际上更具体地说,是用户主动启动的进程。我想当 CreateProcess API 被调用时,windows 本身会发送一个 WMI 事件。我将如何做到这一点? @treefrog 编辑了答案。试试看。 非常感谢!对投反对票的人嘘声。也许是一个巨魔。以上是关于如何挂钩到 Windows 中的应用程序和进程启动?的主要内容,如果未能解决你的问题,请参考以下文章