Создание крючка для приложения? - PullRequest
3 голосов
/ 11 июня 2009

Вот что мне нужно.

Я пытаюсь написать приложение, которое перехватит другое приложение и перехватит определенные вещи, которые в нем происходят. Идея состоит в том, чтобы контролировать приложение и предпринимать действия, когда что-то происходит.

После некоторых исследований я обнаружил, что Detours 2.1 от Ms Research, поможет мне, но мне трудно найти, как его использовать и интегрировать в мою область программирования, которая является .NET.

Кто-нибудь знает, как я могу это сделать, не копая книги на c \ c ++.

Спасибо всем

Ответы [ 3 ]

3 голосов
/ 11 июня 2009

Если вы пытаетесь подключить другое приложение .NET, вы можете попробовать .NET Hook Library .

Если вы говорите о перехвате системных вызовов, то на самом деле доступно множество инструментов / библиотек. Оформить заказ " Инструменты для ввода кода " в библиотеке инструментов RCE.

2 голосов
/ 11 июня 2009

Был добавлен API и слой, добавленный в Windows, чтобы помочь включить настольные приложения для пользователей с ограниченными возможностями. Я не уверен в текущем состоянии API, но уверен, что в .NET Framework есть эквиваленты. Проверьте эту ссылку и посмотрите, можете ли вы использовать ловушки, встроенные в этот слой, вместо того, чтобы использовать системные вызовы более низкого уровня. Информация предполагает, что Windows Automation API 3.0 является текущим стандартом для перехвата событий и манипулирования другим приложением.

1 голос
/ 29 июня 2012

Я рекомендую Deviare , двигатель крюка от нашей компании, где зацепление выполняется тривиально, инжекция и анализ параметров выполняется двигателем. Это, например, код в C # для перехвата PrcStartDocPrinterW в spoolsv.exe.

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.

...