2009-06-11 6 views
3

Voici ce dont j'ai besoin.Création d'un hook pour une application?

J'essaye d'écrire une application qui va prendre en charge une autre application et intercepter certaines choses qui s'y passent. L'idée est de surveiller l'application et de prendre des mesures lorsque des choses se produisent. Après quelques recherches, j'ai trouvé que Detours 2.1 de Ms Research, m'aidera, mais j'ai du mal à trouver comment l'utiliser et l'intégrer dans mon domaine de programmation qui est .NET.

Quelqu'un at-il une idée de comment je peux le faire sans avoir à creuser c \ C++ livres.

Merci à tous

Répondre

2

Il y avait une API et une couche supplémentaire dans Windows pour aider à permettre des applications de bureau pour les utilisateurs handicapés. Je ne suis pas si sûr de l'état actuel de l'API, mais je suis sûr que les équivalents existent dans le .NET Framework. Découvrez this link et voir si vous pouvez exploiter les crochets intégrés dans cette couche plutôt que d'aller pour les appels système de niveau inférieur. Les informations suggèrent que Windows Automation API 3.0 est la norme actuelle pour l'interception d'événements et la manipulation d'une autre application.

3

Si vous essayez de connecter une autre application .NET, vous pouvez essayer .NET Hook Library.

Si vous parlez des appels du système d'accrochage, alors il y a beaucoup d'outils/bibliothèques disponibles. Checkout "Code Injection Tools" dans la bibliothèque d'outils RCE.

1

Je recommande Deviare, le moteur à crochet de notre société où l'accrochage est fait de manière triviale, l'injection et l'analyse des paramètres est effectuée par le moteur. C'est par exemple un code en C# pour intercepter PrcStartDocPrinterW sur 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); 
     } 
    } 
} 

Il existe plusieurs alternatives à Deviare, Microsoft Detours en fait partie. Le but principal de Deviare est de rendre l'accrochage extrêmement facile et étant un objet COM, il peut être utilisé dans .NET aussi via un interop créé automatiquement. Il est également trivial de l'utiliser sur tous les langages de script tels que VBScript ou PowerShell.

Questions connexes