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

Nef*_*ius 3 c c++ dll winapi code-injection

大家好!

经过几个小时的深入谷歌,我终于到了这里。我将直接切入正题:我将要“刷新”我的 C/C++ 技能并再次获得非托管世界的经验。作为一项“基本”任务,我开发了一个小键盘记录器(仅包含 Windows API 的几行代码),但现在我想使用“隐身”功能对其进行扩展。因此,我将代码放入 Win32 DLL 中,您可以在此处找到它的内容。您会注意到,其中有一个非常有问题的部分:

  MSG msg;
 BOOL bRet;

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

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

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

真诚的,奈法留斯

jay*_*lee 5

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

现在有了它,让它工作非常简单。加载 DLL 后,在InstallHook 上创建一个新线程,然后就可以开始了。现在你的消息循环将在它自己的线程中,它有自己的消息队列(或者至少应该,windows 消息传递仍然让我感到困惑)。

case DLL_PROCESS_ATTACH:
  CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)InstallHook, (void*)NULL, 0, NULL );
Run Code Online (Sandbox Code Playgroud)