Global Keyboard Hook от службы Windows
Можно ли написать глобальный Keyboard Hook от службы Windows(XP и 7)? (использование SetWindowsHookEx не работает из системного сервиса)
2 ответа
Документация для SetWindowsHookEx
говорит:
или со всеми потоками на том же рабочем столе, что и вызывающий поток.
Таким образом, вы должны быть связаны с одним и тем же рабочим столом (и будет несколько рабочих столов даже без учета служб терминалов: обычный рабочий стол, защищенный рабочий стол (используется для контроля учетных записей и входа в систему) и экранная заставка).
Поскольку сервисы не связаны с интерактивным сеансом (а из Windows V6 этого не может быть), вам понадобится процесс в сеансе пользователя для выполнения перехвата и связи с бэкэнд-сервисом (например, через именованный канал). И не забудьте протестировать, когда никто не вошел в систему, а вошли несколько пользователей.
Подводя итог тому, что сказал Ричард (и добавив мой собственный комментарий): Вы не можете напрямую установить глобальный хук клавиатуры из службы Windows, начиная с Windows Vista. Однако все равно было бы логичным выбором использовать службу Windows, поскольку у вас будут все необходимые привилегии для установки глобальных хуков. Вы можете дублировать свои привилегии для дочерних процессов, которые вы создаете в каждом сеансе пользователя, вошедшего в систему, чтобы позволить вашим дочерним процессам устанавливать глобальные хуки в своем собственном рабочем столе / сеансе, даже если пользователь не обладает соответствующими привилегиями.
Лично (если вы пишете кейлоггер) вместо того, чтобы объединять все зарегистрированные нажатия клавиш в одном процессе и записывать их на диск, может иметь смысл, чтобы каждый отдельный процесс записывал отдельные файлы в соответствии со своим именем пользователя.