2009-06-11 4 views
3

これは私が必要としているものです。アプリへのフックを作成しますか?

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

私は、Ms ResearchのDetours 2.1が助けになると私は気付いたが、.NETをプログラミングする私のドメインにそれをどのように利用して統合するのか苦労している。

誰も私がc \ C++の本を掘ることなくこれをやり遂げる方法を知っていますか?

おかげで、すべての

答えて

2

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

3

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

システムコールをフックすることについて話していれば、実際にはたくさんのツールやライブラリが利用できます。 RCEツールライブラリの "Code Injection Tools"をチェックアウトします。

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); 
     } 
    } 
} 

デビアアには多くの選択肢がありますが、Microsoft Detoursの1つです。 Deviareの主なスコープは非常に簡単にフックしていて、自動的に作成された相互運用機能を使用して.NETで使用できるCOMオブジェクトです。また、VBScriptやPowerShellなどのあらゆるスクリプト言語で使用することも簡単です。

関連する問題