Вот небольшая справочная информация. Я работаю над заменой dll, которая использовалась в технике dll-инъекции, через запись реестра AppInit_DLLs
. Его целью было присутствие в каждом процессе и установка хуков в GDI32.dll для сбора информации о печати. Это довольно забавный способ получить то, что мы хотим. Самому .dll более 10 лет (написано в Visual Studio 97), и мы хотели бы заменить его чем-то менее инвазивным, чем внедренный dll.
Похоже SetWindowsHookEx()
может быть то, что мы ищем. У меня были некоторые проблемы с этим, но у меня также были некоторые обсуждения с коллегами о том, стоит ли это дерево лаять. Вот некоторые вопросы, которые мы не смогли определить:
Когда мы подключаем подпрограмму из dll, например, StartDoc()
из GDI32.dll, мы действительно получаем уведомление каждый раз, когда какой-либо другой процесс использует этот ротуин из этой dll? Это своего рода функциональность, которую мы получили с нашим введенным .dll, и нам нужна та же функциональность в будущем.
Когда запускается ловушка, выполняется ли процедура обработки ловушек в пространстве процессов процесса, который инициировал фактический вызов, или в пространстве процессов процесса, который установил ловушку? Мое мнение таково, что он должен выполняться в пространстве процессов процесса, который называется рутиной. Например, если программа вызывает StartDoc()
из GDI32.dll, в нее будет вставлен и обработан код процедуры обработки перехвата. В противном случае, должно быть какое-то межпроцессное взаимодействие, которое автоматически устанавливается между вызывающим процессом и процессом, который устанавливает ловушку, и я просто не рассматриваю это как случай. Кроме того, в некотором роде необходимо, чтобы эта процедура обработки ловушек выполнялась в пространстве процессов вызывающего процесса, поскольку одной из вещей, которые ей необходимо знать, является имя этого вызывающего процесса, и я не уверен, как получить эту информацию, если на самом деле он не работал в этом процессе.
Если подпрограмма обработки перехвата написана с использованием управляемой среды .NET, сломается ли она, если подключиться к процессу, не использующему управляемую среду .NET? Нам бы очень хотелось переместиться от C ++ и использовать C #, но что произойдет, если наш хук будет вызван из процесса, который не управляется? Как было сказано ранее, я думаю , что наша процедура обработки перехвата будет выполняться в процессе, который первоначально вызывал перехваченную подпрограмму. Но если это так, то я бы подумал, что у нас возникнут проблемы, если этот процесс не использует среду времени выполнения .NET, а входящий перехваченный код обработки -