Задача — перехватить (inject) код некоторых .dll, использующихся в заранее неизвестном приложении.
В простом варианте делаю через WindowsHook CBT (по активации и по получению фокуса). Далее я вызываю GetModuleHandle для нужного имени .dll и если модуль загружен, делаю инжект.
Однако, если приложение загружает библиотеку не сразу, а позже, такой способ не прокатывает (переключение юзером приложения в неактивное состояние и обратно не считается).
Делаю сейчас как — по CBT хуку запускаю поток, который периодически "пасет", а не появилась ли .dll в списке загруженных. И если появилась, то делает inject.
Понимаю, что это неправильно, ибо при некоторых условиях можно все "уронить". Однако других вариантов я не знаю.
Подскажите, как это делается по уму?
Здравствуйте, CyberDemon, Вы писали:
CD>Подскажите, как это делается по уму?
Перехватом LoadLibrary и/или GetProcAddress
У Рихтера есть готовый класс, который сам обо всем этом заботится
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Здравствуйте, CyberDemon, Вы писали:
CD>Задача — перехватить (inject) код некоторых .dll, использующихся в заранее неизвестном приложении.
CD>В простом варианте делаю через WindowsHook CBT (по активации и по получению фокуса). Далее я вызываю GetModuleHandle для нужного имени .dll и если модуль загружен, делаю инжект.
CD>Однако, если приложение загружает библиотеку не сразу, а позже, такой способ не прокатывает (переключение юзером приложения в неактивное состояние и обратно не считается).
CD>Делаю сейчас как — по CBT хуку запускаю поток, который периодически "пасет", а не появилась ли .dll в списке загруженных. И если появилась, то делает inject.
CD>Понимаю, что это неправильно, ибо при некоторых условиях можно все "уронить". Однако других вариантов я не знаю.
CD>Подскажите, как это делается по уму?
если не касаться вопроса инжекта в процесс (на сайте
есть статья "как правильно"Автор: Сторожевых Сергей
Дата: 14.11.07
), а отвечать на вопрос что делать дальше, уже внедрившись — то вот мой вариант:
зацепляйте
ZwMapViewOfSection ZwUnmapViewOfSection.
соотв. при маппинге\размаппинге модулей на адр пространство с помощью
ZwQueryVirtualMemory выясняем, когда нужно вмешиваться (hint: если MEM_IMAGE флажок есть — выясням как фамилия модуля) — и снять\засандалить свои хуки внутрь (у нас уже есть базовый адрес — это параметр в ф-х выше).
Удобно делать код со своей логикой для перехвата с параметром базовый адрес, от которого и пляшем — тогда его можно дернуть как из ф-ий выше, так и при инжекте в своей либе (как в статье) — при DLL_PROCESS_ATTACH \ DLL_PROCESS_DEATTACH, получая базовый адрес для уже загруженных модулей через
GetModuleHandle.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>