【问题标题】:Interfere Win32 message loop with injected DLL code (SetWindowsHookEx)使用注入的 DLL 代码干扰 Win32 消息循环 (SetWindowsHookEx)
【发布时间】:2010-10-28 21:46:02
【问题描述】:

大家好!

在深入 Google 数小时后,我终于来到了这里。我会直截了当:我即将“刷新”我的 C/C++ 技能并再次获得与非托管世界的经验。作为一项“基本”任务,我开发了一个小键盘记录器(仅包含 Windows API 的几行代码),但现在我想使用“隐形”功能对其进行扩展。因此,我将代码放入 Win32 DLL it's content you find here。您会注意到,其中有一个非常有问题的部分:

  MSG msg;
 BOOL bRet;

 while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
 { 
  if (bRet == -1)
  {
   return FALSE;
  }
  else
  {
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
  }
 }

是的,这是一个普通的消息循环 - 在我的情况下会造成麻烦。我将此 DLL 注入“受害者”可执行文件(例如 VLC 媒体播放器)以欺骗 AV/应用程序防火墙,并且到目前为止它工作正常,注入本身完美地通过。现在来了大但是:当然,无休止的while循环现在冻结了整个目标应用程序(没有它,我的钩子回调永远不会被执行)这并不是真正的计划......在潜入MSDN库的一半并尝试了一个谷歌给了我很多“解决方案”;我放弃了。

是否有可能评估“受害者”进程的消息循环而不阻塞它自己的业务但提供我的键盘挂钩回调工作?

此致, 奈法瑞斯

【问题讨论】:

  • 这样做会针对所有目标还是仅针对 VLC?
  • 我收到“未知的粘贴 ID,它可能已过期或已被删除!”尝试查看 pastebin 代码时。
  • 刚刚尝试使用 PuTTY、Thunderbird、无法注入 Windows 计算器、WinRAR 也崩溃、Notepad++ 崩溃……但它们都记录到指定文件,直到我用进程/任务杀死它们-经理。
  • 对不起,我的错。我更正了 pastebin 链接。
  • “将代码注入另一个进程的三种方法”codeproject.com/KB/threads/winspy.aspx

标签: c++ c dll winapi code-injection


【解决方案1】:

好的,首先,您在 dll 入口点函数中做的太多了。一方面——这直接来自 MSDN——“在 DLL 入口点中可以执行的操作存在严重限制”。此外,在 dll 入口点中,加载程序锁被持有,因此不能加载/卸载其他库。因此,当您在 DLL 入口点中运行消息循环(通过调用 InstallHook())时,您实际上是在向自行车辐条扔一根棍子,这么说吧。

现在解决了这个问题,让它工作变得非常简单。加载 DLL 后,在 InstallHook 处创建一个新线程,一切顺利。现在你的消息循环将在它自己的线程和它自己的消息队列中(或者至少应该是,Windows 消息传递仍然让我感到困惑)。

case DLL_PROCESS_ATTACH:
  CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)InstallHook, (void*)NULL, 0, NULL );

【讨论】:

  • 啊,你知道吗?我已经尝试过使用单独的线程,但我只将消息循环放入其中,并将 SetWindowsHookEx() 留在 DllMain 函数调用中。非常感谢,我在这个小细节上浪费了几个小时。
【解决方案2】:

那里不应该有消息循环。您注入的应用程序已经有一个消息循环(除非它是一个控制台应用程序,它无论如何都不处理消息)。当主机的消息循环像往常一样处理它的消息时,让你的钩子做它的事情。

【讨论】:

  • 我已经在没有循环的情况下尝试过,但是我遇到的问题是我的回调函数永远不会被执行。
  • 我也有同样的问题。 SetWindowsHookEx() 返回 0,但回调函数根本不会执行。有什么理由吗?
猜你喜欢
  • 2014-10-17
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2016-04-10
相关资源
最近更新 更多