Вопросы о SetWindowsHookEx () и перехвате - PullRequest
4 голосов
/ 27 января 2012

Вот небольшая справочная информация. Я работаю над заменой dll, которая использовалась в технике dll-инъекции, через запись реестра AppInit_DLLs. Его целью было присутствие в каждом процессе и установка хуков в GDI32.dll для сбора информации о печати. Это довольно забавный способ получить то, что мы хотим. Самому .dll более 10 лет (написано в Visual Studio 97), и мы хотели бы заменить его чем-то менее инвазивным, чем внедренный dll.

Похоже SetWindowsHookEx() может быть то, что мы ищем. У меня были некоторые проблемы с этим, но у меня также были некоторые обсуждения с коллегами о том, стоит ли это дерево лаять. Вот некоторые вопросы, которые мы не смогли определить:

  1. Когда мы подключаем подпрограмму из dll, например, StartDoc() из GDI32.dll, мы действительно получаем уведомление каждый раз, когда какой-либо другой процесс использует этот ротуин из этой dll? Это своего рода функциональность, которую мы получили с нашим введенным .dll, и нам нужна та же функциональность в будущем.

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

  3. Если подпрограмма обработки перехвата написана с использованием управляемой среды .NET, сломается ли она, если подключиться к процессу, не использующему управляемую среду .NET? Нам бы очень хотелось переместиться от C ++ и использовать C #, но что произойдет, если наш хук будет вызван из процесса, который не управляется? Как было сказано ранее, я думаю , что наша процедура обработки перехвата будет выполняться в процессе, который первоначально вызывал перехваченную подпрограмму. Но если это так, то я бы подумал, что у нас возникнут проблемы, если этот процесс не использует среду времени выполнения .NET, а входящий перехваченный код обработки -

1 Ответ

3 голосов
/ 27 января 2012
  1. Да.

  2. Обычно это первое: оно выполняется в контексте процесса, событие которого оно перехватывает.

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

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

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

    Что касается других типов крючков, то ваши опасения, выраженные в этом вопросе, абсолютно верны.Вам нужно было бы написать эти подключаемые DLL на C или C ++.Конечно, rest частей вашего приложения все еще могут быть написаны на управляемом языке.Единственное, что имеет значение, это подключаемая DLL.

Вы можете рассмотреть вопрос либо о Microsoft Detours , либо EasyHook .

...