Вопрос по Inject Code
От: CyberDemon Россия  
Дата: 16.11.08 09:54
Оценка:
Задача — перехватить (inject) код некоторых .dll, использующихся в заранее неизвестном приложении.
В простом варианте делаю через WindowsHook CBT (по активации и по получению фокуса). Далее я вызываю GetModuleHandle для нужного имени .dll и если модуль загружен, делаю инжект.
Однако, если приложение загружает библиотеку не сразу, а позже, такой способ не прокатывает (переключение юзером приложения в неактивное состояние и обратно не считается).
Делаю сейчас как — по CBT хуку запускаю поток, который периодически "пасет", а не появилась ли .dll в списке загруженных. И если появилась, то делает inject.
Понимаю, что это неправильно, ибо при некоторых условиях можно все "уронить". Однако других вариантов я не знаю.

Подскажите, как это делается по уму?
Re: Вопрос по Inject Code
От: Sergey Chadov Россия  
Дата: 16.11.08 10:08
Оценка: +1
Здравствуйте, CyberDemon, Вы писали:

CD>Подскажите, как это делается по уму?


Перехватом LoadLibrary и/или GetProcAddress
У Рихтера есть готовый класс, который сам обо всем этом заботится
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
по уму делается так
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 18.11.08 10:35
Оценка: 6 (1)
Здравствуйте, 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>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.