3

これが私が必要なものです。

別のアプリケーションを引き継ぎ、そこで発生する特定のことを傍受するアプリケーションを作成しようとしています。アイデアは、アプリケーションを監視し、何かが起こったときにアクションを実行することです。

いくつかの調査の結果、MsResearchのDetours2.1が役立つことがわかりましたが、それを使用してプログラミングのドメインである.NETに統合する方法を見つけるのに苦労しています。

c \ c ++の本を掘り下げることなく、これをどのように行うことができるか、誰かが知っていますか。

皆さんありがとう

4

3 に答える 3

3

別の .NET アプリケーションをフックしようとしている場合は、 .NET Hook Libraryを試すことができます。

システムコールのフックについて話している場合、実際には多くのツール/ライブラリが利用可能です。RCE ツール ライブラリで「コード インジェクション ツール」をチェックアウトします。

于 2009-06-11T05:14:36.030 に答える
2

Windows には、障碍のあるユーザー向けのデスクトップ アプリケーションの有効化を支援する API とレイヤーが追加されました。API の現在の状態についてはよくわかりませんが、同等の API が .NET Framework に存在することは確かです。このリンクをチェックして、低レベルのシステム コールではなく、このレイヤーに組み込まれているフックを利用できるかどうかを確認してください。この情報は、Windows Automation API 3.0 が、イベントをインターセプトして別のアプリケーションを操作するための現在の標準であることを示唆しています。

于 2009-06-11T05:07:02.710 に答える
1

当社のフックエンジンであるDeviareをお勧めします。フックは簡単に行われ、インジェクションとパラメーターの解析はエンジンによって行われます。これは、たとえば、spoolsv.exe で PrcStartDocPrinterW をインターセプトする C# のコードです。

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 はその 1 つです。Deviare の主な範囲は、非常に簡単にフックできることと、自動的に作成された相互運用機能を介して .NET でも使用できる COM オブジェクトであることです。また、VBScript や PowerShell などのすべてのスクリプト言語で使用するのも簡単です。

于 2012-06-29T16:51:39.117 に答える