创build一个应用程序钩子?

这是我需要的。

我试图编写一个应用程序来接pipe另一个应用程序,并拦截发生在其中的某些事情。 这个想法是监视应用程序,并在发生某些事情时采取行动。

经过一番研究,我发现Ms Research的Detours 2.1能够帮助我,但是我很难find如何使用它并将它集成到我的.NET编程领域。

有没有人有任何想法,我怎么能做到这一点,而不必掏c \ c ++书籍。

谢谢大家

如果您试图挂钩另一个.NET应用程序,您可以尝试.NET钩子库 。

如果你谈论挂钩系统调用,那么实际上有很多工具/库可用。 在RCE工具库中签出“ 代码注入工具 ”。

在Windows中添加了一个API和一个图层,以帮助为残障用户启用桌面应用程序。 我不太确定API的当前状态,但我相当确定.NET框架中存在等价物。 看看这个链接 ,看看你是否可以利用这个层的内置钩子,而不是进行较低级别的系统调用。 这些信息表明Windows自动化API 3.0是拦截事件和操纵其他应用程序的当前标准。

我推荐Deviare ,我们公司的钩子引擎,钩子是平凡的,注入和参数解析是由引擎完成的。 这是例如C#中的代码来截取spoolsv.exe上的PrcStartDocPrinterW。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Nektra.Deviare2; namespace PrintLogger { public partial class PrintLogger : Form { private NktSpyMgr _spyMgr; private NktProcess _process; public PrintLogger() { InitializeComponent(); _spyMgr = new NktSpyMgr(); _spyMgr.Initialize(); _spyMgr.OnFunctionCalled += new DNktSpyMgrEvents_OnFunctionCalledEventHandler(OnFunctionCalled); GetProcess("spoolsv.exe"); if (_process == null) { MessageBox.Show("Please start \"spoolsv.exe\" before!", "Error"); Environment.Exit(0); } } private void PrintLogger_Load(object sender, EventArgs e) { NktHook hook = _spyMgr.CreateHook("spoolsv.exe!PrvStartDocPrinterW", (int)(eNktHookFlags.flgRestrictAutoHookToSameExecutable & eNktHookFlags.flgOnlyPreCall)); hook.Hook(true); hook.Attach(_process, true); } private bool GetProcess(string proccessName) { NktProcessesEnum enumProcess = _spyMgr.Processes(); NktProcess tempProcess = enumProcess.First(); while (tempProcess != null) { if (tempProcess.Name.Equals(proccessName, StringComparison.InvariantCultureIgnoreCase) && tempProcess.PlatformBits > 0 && tempProcess.PlatformBits <= IntPtr.Size * 8) { _process = tempProcess; return true; } tempProcess = enumProcess.Next(); } _process = null; return false; } private void OnFunctionCalled(NktHook hook, NktProcess process, NktHookCallInfo hookCallInfo) { string strDocument = "Document: "; INktParamsEnum paramsEnum = hookCallInfo.Params(); INktParam param = paramsEnum.First(); param = paramsEnum.Next(); param = paramsEnum.Next(); if (param.PointerVal != IntPtr.Zero) { INktParamsEnum paramsEnumStruct = param.Evaluate().Fields(); INktParam paramStruct = paramsEnumStruct.First(); strDocument += paramStruct.ReadString(); strDocument += "\n"; } Output(strDocument); } public delegate void OutputDelegate(string strOutput); private void Output(string strOutput) { if (InvokeRequired) BeginInvoke(new OutputDelegate(Output), strOutput); else textOutput.AppendText(strOutput); } } } 

Deviare有许多替代品,Microsoft Detours就是其中之一。 Deviare的主要范围是做非常容易的钩子,并且是一个COM对象,它也可以在.NET中通过自动创建的互操作。 在VBScript或PowerShell等任何脚本语言中使用它也是微不足道的。