Помешать циклу сообщений Win32 введенным кодом DLL - PullRequest
2 голосов
/ 29 октября 2010

Привет всем!

После нескольких часов проникновения в Google я оказался здесь.Я сразу перейду к делу: я собираюсь «освежить» свои навыки 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); 
  }
 }

Да, это обычный цикл обработки сообщений - который вызывает проблемы в моем случае.Я внедряю эту DLL в исполняемый файл «жертвы» (например, медиаплеер VLC), чтобы обмануть брандмауэры AV / Application, и пока это работает, сама инъекция проходит без нареканий.Теперь приходит большое НО: конечно, бесконечный цикл while теперь замораживает все целевое приложение (без него мой обратный вызов хука никогда не будет выполнен), который на самом деле не планировался ... После погружения через половину библиотеки MSDN и попыткиGoogle дал мне много «решений»;Я сдаюсь.

Можно ли даже оценить цикл сообщений процесса "жертвы", не блокируя его собственное дело, но обеспечивая работу моего обратного вызова клавиатуры?

С уважением, Нефарий

Ответы [ 2 ]

4 голосов
/ 29 октября 2010

Хорошо, во-первых, вы слишком много делаете в своей функции точки входа dll. С одной стороны - и это прямо из MSDN - «Существуют серьезные ограничения на то, что вы можете делать в точке входа DLL». Кроме того, в то время как в точке входа dll блокировка загрузчика удерживается, поэтому другие библиотеки не могут быть загружены / выгружены. Итак, когда вы выполняете цикл обработки сообщений (вызывая InstallHook () ) в точке входа DLL, вы действительно бросаете палку в велосипедные спицы, так что говорите.

Теперь, когда это не так, заставить его работать довольно просто. Когда DLL будет загружена, создайте новый поток по адресу InstallHook , и все будет хорошо. Теперь ваш цикл обработки сообщений будет находиться в отдельном потоке с собственной очередью сообщений (или, по крайней мере, так и должно быть, обмен сообщениями в Windows все еще смущает меня).

case DLL_PROCESS_ATTACH:
  CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)InstallHook, (void*)NULL, 0, NULL );
0 голосов
/ 29 октября 2010

Там не должно быть цикла сообщений. Приложение, в которое вы вводите информацию, уже имеет цикл обработки сообщений (если это не консольное приложение, которое в любом случае не обрабатывает сообщения). Просто позвольте вашей ловушке делать свое дело, когда цикл сообщений хоста обрабатывает свои сообщения, как обычно.

...