EasyHook不适用于其他线程

时间:2016-12-21 00:40:06

标签: c# vb.net hook user32 easyhook

我目前正在尝试使用EasyHook挂钩user32.dll中的“MessageBeep”功能。如果我正在运行[这个例子] [1]一切似乎工作正常。但是如果我将第52行和第60行中的线程ID替换为我的测试应用程序的线程ID,那么钩子不适用于ohter程序。

为什么SetExclusiveACL-Method不接受任何其他线程ID? e.g。

hook.ThreadACL.SetExclusiveACL(new int[] { 8788 });

我正在使用以下代码检索我的测试应用程序的线程ID,并验证钩子是否适用于MessageBeep函数:

Sub Main()
   While True
      Console.WriteLine(GetCurrentThreadId().ToString)
      MessageBeep(&H40)
      If Console.ReadKey().KeyChar = "c"c Then
          Console.Clear()
      End If
   End While
End Sub

1 个答案:

答案 0 :(得分:1)

如果要挂钩到目标进程,则需要将DLL注入目标进程,EasyHook已经提供了执行此操作的方法。在注入的DLL中,您可以为MessageBeep设置LocalHook。以下是使用RemoteHooking.Inject

进行注射的示例代码
//create channel to send text data and log
RemoteHooking.IpcCreateServer<LogChannel>(ref _logChannelName, WellKnownObjectMode.Singleton);

RemoteHooking.IpcCreateServer<TextDataChannel>(
     ref _textDataChannelName, WellKnownObjectMode.Singleton);

CommandChannel = new Common.IPC.CommandChannel();

string filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + INJECT_DLL_NAME;
RemoteHooking.Inject(processID,InjectionOptions.DoNotRequireStrongName,
               filePath,
               filePath,
                _logChannelName, _textDataChannelName, CommandChannel.PipeName, _pendingMsgType);

更新:您可以参考此链接https://www.codeproject.com/Articles/27637/EasyHook-The-reinvention-of-Windows-API-hooking