EasyHook 不适用于其他线程

Posted

技术标签:

【中文标题】EasyHook 不适用于其他线程【英文标题】:EasyHook does not work for other threads 【发布时间】:2017-05-06 07:50:23 【问题描述】:

我目前正在尝试使用 EasyHook 在 user32.dll 中挂钩“MessageBeep”函数。如果我正在运行 [this example][1] 一切似乎都正常。但是,如果我将第 52 行和第 60 行中的线程 ID 替换为我的测试应用程序的线程 ID,则该钩子不适用于其他程序。

为什么 SetExclusiveACL-Method 不接受任何其他线程 ID?例如

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. EasyHook 开发人员提供的示例 2. 我在 vb.net 中的测试程序,上面显示的代码 在原始示例中,线程 ID 传递给 SetExclusiveACL(new int [] 0 ); ist 零(这意味着钩子适用于当前线程)。我想将钩子应用于任何线程 ID,但我无法让它工作 所以你的意思是你在应用程序 A 中为 MessageBeep 设置了钩子。你在应用程序 B 中调用 MessageBeep。你希望应用程序 A 中的钩子函数会被执行? 我认为你误解了钩子。您只能挂钩当前进程的功能。如果你想挂接到目标进程,你需要将你的 DLL 注入到目标进程中,EasyHook 已经提供了这样做的方法。在注入的 DLL 中,您可以为 MessageBeep 设置 LocalHook。 在下面查看我的答案。我已经提供了关于 codeproject 的教程 【参考方案1】:

如果你想hook到一个目标进程,你需要将你的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

【讨论】:

以上是关于EasyHook 不适用于其他线程的主要内容,如果未能解决你的问题,请参考以下文章

time.sleep 不适用于多线程

SetWindowsHookEx 不适用于线程 ID

ThreadPoolTask Scheduler不适用于线程池

Spring Batch分区不适用于复合项目处理器

多个摄像头馈送不适用于 PyQt5 线程:

cellForRowAtIndexPath:setNeedsDisplay 不适用于在后台下载的图像,即使在主线程上调用它也是如此