Использование рычага всего процесса SetWindowsHookEx

Я должен ввести dll в один или несколько внешних процессов, от которых я также хочу прервать keybord события. Вот почему использование SetWindowsHookEx с WH_KEYBOARD похоже на простой способ достигнуть обеих вещей в одноэтапном.

Теперь я действительно не хочу устанавливать глобальный рычаг, когда я только интересуюсь несколькими выбранными процессами, но рычаги Windows, кажется, или глобальны или только для потока.

Мой вопрос состоит теперь в том, как я правильно пошел бы об установке рычага всего процесса.

Я предполагаю, что один путь состоял бы в том, чтобы настроить рычаг на основном потоке целевого процесса из моего приложения и затем выполнение того же из моего dll на DLL_PROCESS_ATTACH для всех других рабочих потоков (плюс на DLL_THREAD_ATTACH для потоков, запущенных позже). Но это - действительно хороший путь? И более важный, не там никакие более простые способы установить рычаги всего процесса? Моя идея выглядит довольно громоздкой und ужасный, но я не смог найти любую информацию о выполнении этого где угодно.

1
задан mfya 11 June 2010 в 01:55
поделиться

1 ответ

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

Редактировать:

В ответ на комментарий Бена о том, как можно было бы внедрить перехватчик в конкретный процесс для наблюдения за конкретными потоками:

  • Убедитесь, что ваш процесс инжектора работает с правами администратора.
  • Выполните OpenProcess для кода инжектора и получите SeDebugPrivilege приват.
  • Используйте OpenProcess на своей цели с PROCESS_CREATE_THREAD, VM_READ / НАПИШИТЕ прив.
  • VirtualAlloc немного памяти в вашем целевом процессе, сделайте это PAGE_EXECUTE_READWRITE.
  • Запишите путь и имя вашей DLL-перехватчика в эту память.
  • Получить дескриптор модуля для kernel32.
  • Получить адрес процесса LoadLibraryW в kernel32.
  • Вызовите CreateRemoteThread для своей цели, указав ей адрес LoadLibraryW с адресом выделенной вами строки DLL-ловушки.
  • WaitForSingleObject в удаленном потоке для завершения загрузки
  • Очистить

Не забудьте повторить для каждого процесса, который вы хотите перехватить. Кроме того, убедитесь, что ваш код ловушки обрабатывает создание / удаление потоков для ваших подключенных процессов, чтобы вы могли также подключать эти потоки.

Если вы прочитали, что глобальный перехватчик WH_KEYBOARD был плохой идеей, вы можете начать понимать, почему этот подход может быть еще хуже.

2
ответ дан 2 September 2019 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: