创建应用程序的钩子?

时间:2009-06-11 05:01:05

标签: c# .net c windows hook

这就是我需要的。

我尝试编写一个应用程序,它将接管另一个应用程序并拦截其中发生的某些事情。 我们的想法是监控应用程序并在发生某些事情时采取措施。

经过一些研究后,我发现Research Research的Detours 2.1对我很有帮助,但我很难找到如何使用它并将其集成到我的.NET编程领域。

有没有人知道如何在不必挖掘c \ c ++书籍的情况下做到这一点。

全部谢谢

3 个答案:

答案 0 :(得分:3)

如果您尝试挂钩另一个.NET应用程序,可以尝试.NET Hook Library

如果您谈论挂钩系统调用,那么实际上有很多工具/库可用。在RCE工具库中签出“Code Injection Tools”。

答案 1 :(得分:2)

Windows中添加了一个API和一个图层,以帮助为残障用户启用桌面应用程序。我不太确定API的当前状态,但我非常确定.NET Framework中存在等价物。查看this link并查看是否可以利用此层中内置的钩子而不是进行较低级别的系统调用。该信息表明,Windows Automation API 3.0是拦截事件和操纵其他应用程序的当前标准。

答案 2 :(得分:1)

我推荐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有很多替代方案,微软Detours就是其中之一。 Deviare的主要范围是非常容易挂钩并且是一个COM对象,它也可以通过自动创建的互操作在.NET中使用。在VBScript或PowerShell等每种脚本语言上使用它也很简单。