Хук всего процесса с использованием SetWindowsHookEx - PullRequest
1 голос
/ 10 июня 2010

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

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

Теперь у меня вопрос, как мне правильно настроить общесистемный хук.

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

1 Ответ

2 голосов
/ 10 июня 2010

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

Edit:

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

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

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

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

...