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

时间:2010-10-28 21:46:03

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

大家好!

经过几个小时的穿透谷歌,我最终到了这里。我将直言不讳:我即将“刷新”我的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库并尝试了Google给了我很多“解决方案”;我放弃了。

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

真诚的,你的, Nefarius

2 个答案:

答案 0 :(得分:4)

好的,首先,你在dll入口点函数中做得太多了。一方面 - 这是直接来自MSDN - “在DLL入口点你可以做的事情有严重的限制”。此外,在dll入口点中,加载器锁被保持,因此不能加载/卸载其他库。因此,当你在DLL入口点运行你的消息循环(通过调用 InstallHook())时,你真的在​​自行车辐条上扔了一根棍子,所以说话。

现在开始使用它非常简单。加载DLL时,在 InstallHook 创建一个新线程,你应该好好去。现在你的消息循环将在它自己的线程中,它有自己的消息队列(或者至少它应该,Windows消息仍然有点让我困惑)。

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

答案 1 :(得分:0)

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