Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Загрузка DLL с определённым процессом

7
22 марта 2010 года
@pixo $oft
3.4K / / 20.09.2006
Как реализовать сабж?Я бы сделал через AppInitDLL,по пути проверяя,является ли вызывающий процесс нужным мне.Но возникает вопрос,как произвести выгрузку DLL из памяти,если процесс оказался не тем,который нужен?Если возвращать 0 в DLLMain,то это приведёт к незапуску процесса,а не выгрузке DLL из памяти.Как быть?

Возможно,следует добавить,что процесс,с которым я хочу загрузить свою DLL–Explorer.Возможно,есть какие-то ключи реестра,которые отвечают за загрузку библиотек с ним
Тем не менее,вдобавок хотелось бы для любой DLL узнать,как выгрузить её при инициализации приложения,если в ней нет необходимости
8.2K
23 марта 2010 года
bagie2
299 / / 26.10.2008
наверное проще всего прописаться в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon параметр Shell и затем загружать настойщий explorer.exe и инжектить в него свой код.
7
23 марта 2010 года
@pixo $oft
3.4K / / 20.09.2006
Это немного не то…Как минимум потому,что я не умею инжектить:) Я ж не вирусы пишу
Вот если бы у Explorer'а была командная строка,в которой можно было бы передать список загружаемых модулей…Есть ключ HKLM\Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad,но там,как я понял,грузятся сервера автоматизации,а не обычные DLL…=(
8.2K
23 марта 2010 года
bagie2
299 / / 26.10.2008
а еще вопрос. чем плохо, что DLL будет в каждом процессе?
7
23 марта 2010 года
@pixo $oft
3.4K / / 20.09.2006
Ну как бы занимает лишнюю память.Это у меня,положим,только 20 процессов,а ведь у кого-то может быть и больше!
11
23 марта 2010 года
oxotnik333
2.9K / / 03.08.2007
немного не в тему, но может это http://rsdn.ru/summary/390.xml поможет
8.2K
23 марта 2010 года
bagie2
299 / / 26.10.2008
Хммм. библиотеки всего лишь отображаются на адресное пространство процесса. Если не было изменений (только для чтения), то страница в физической памяти хранится только один раз. Если пишем по адресу, то работает Copy-On-Write и система дублирует страницу в физической памяти и отображает на соотв. процесс. Для секции кода это точно работает (и для всех секций только для чтения), а вот секции с данными вроде отображаются на каждый процесс свои.

http://support.microsoft.com/kb/103858
http://support.microsoft.com/kb/100635

Также можно попробовать вызывать в DllMain функцию DisableThreadLibraryCalls в некоторых случаях может пригодиться.

а заинжектить ведь самое простое будет. запустить процесс с флагом suspended, выделить память (VirtualAllocEx), записать к него нужный код (WriteProcessMemory) и установить контекст (SetThreadContext) и отпустить поток, который уже подгрузит DLL-ку а потом прыгнет на EP. ну или через VirtualAllocEx\WriteProcessMemory\CreateRemoteThread который тоже подгрузит DLL-ку.

или поглядеть в сторону http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx
7
23 марта 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: oxotnik333
немного не в тему, но может это http://rsdn.ru/summary/390.xml поможет

[QUOTE=RSDN]Расширение оболочки (shell extension) - это COM объект[/QUOTE]Вот поэтому они мне и не подходят…

bagie2:спасибо,почитал.Жаль,что на английском,отсюда могут быть небольшие непонятки(хоть у меня с ним и не так плохо).Например,ведь в секции кода есть ссылки на данные,так как же 1 и тот же код для разных процессов ссылается на одни и те же данные?
Я так понял,фишка в "Fixups are made for the virtual memory mapping of the writing process",т.е. физические адреса для каждого экземпляра преобразуются в нужные виртуальные путём означенного механизма.Я прав?

DisableThreadLibraryCalls–это немного не то;она ж работает для одного приложения.Впрочем,она тоже пригодится по описанным в статье причинам.Спасибо,я бы про это забыл(хотя про функцию знал)
Но тогда возникает вопрос,как получить дескриптор модуля,ибо[QUOTE=MSDN]Note that you cannot call GetModuleHandle with NULL because this returns the base address of the executable image, not the DLL image[/QUOTE]ЕМНИП,надо передавать hinstDLL из DLLMain

SetWindowsHookEx мне вряд ли нужна,ибо тогда я много чего лишнего захукаю и DLL загрузится куда не надо:)

[COLOR="Gray"]P.S.Наткнулся по ссылкам на ShellProc,так вот,там есть интересное сообщение HSHELL_TASKMAN.Это что ж получается,что диспетчер задач можно перехватить? (=[/COLOR]

535
23 марта 2010 года
Нездешний
537 / / 17.01.2008
есть вариант с помощью CreateRemoteThread

как использовать - см. Рихтер "Создание эффективных WIN32-приложений"
Внедрение DLL с помощью удаленных потоков

например, здесь

upd:
[QUOTE="@pixo $oft"]SetWindowsHookEx мне вряд ли нужна,ибо тогда я много чего лишнего захукаю и DLL загрузится куда не надо[/QUOTE]
при внедрении с помощью хуков можешь проверить в DllMain при DLL_PROCESS_ATTACH куда ты попал - и принять решение, цепляться или нет
5
23 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Нездешний
есть вариант с помощью CreateRemoteThread


Начиная с Висты так просто уже не отделаться. Ибо UAC.

А вообще для работы с шэллом надо юзать COM-сервера. DLL - не айс.

253
23 марта 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: @pixo $oft
Но возникает вопрос,как произвести выгрузку DLL из памяти,если процесс оказался не тем,который нужен?Если возвращать 0 в DLLMain,то это приведёт к незапуску процесса,а не выгрузке DLL из памяти.Как быть?


Точно 0 приведёт к незапуску процесса? В гугле встретил, что это заставит LoadLibrary вернуть NIL, но процесс-то запустится.

Ну, или такой вариант можно попробовать: т.к. первый параметр DllMain - handle библиоеки, можно попробовать вызвать FreeLibrary на нём в конце функции. Не уверен правда, не будет ли ошибок на выходе.

Для explorer-а, как сказал hardcase, лучше юзать его средства COM, если, конечно, нет задачи похозяйничать через DLL в нём самому.

11
23 марта 2010 года
oxotnik333
2.9K / / 03.08.2007
Цитата: hardcase

А вообще для работы с шэллом надо юзать COM-сервера. DLL - не айс.


как говорится, русский человек славится умением находить выход из сложных ситуаций, но еще больше он славится находить туда вход :)

7
23 марта 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Proger_XP
Точно 0 приведёт к незапуску процесса? В гугле встретил, что это заставит LoadLibrary вернуть NIL, но процесс-то запустится

Точно приведёт,я гарантирую это.Я ж не в уже запущенном процессе вызываю LoadLibrary,а это происходит при создании процесса.Читни MSDN'ца:)

Цитата: Proger_XP
Ну, или такой вариант можно попробовать: т.к. первый параметр DllMain - handle библиоеки, можно попробовать вызвать FreeLibrary на нём в конце функции. Не уверен правда, не будет ли ошибок на выходе

Вот так,пожалуй,и попробую.Видимо,это единственный выход

А вот COM-сервера я не могу использовать.Хотя бы потому,что мне надо уметь их писать:)

8.2K
23 марта 2010 года
bagie2
299 / / 26.10.2008
можно попробовать еще связку AppInitDlls + Shareable секции с данными, чтобы память не расходовать
11
23 марта 2010 года
oxotnik333
2.9K / / 03.08.2007
Цитата: @pixo $oft

Хотя бы потому,что мне надо уметь их писать:)


Че там их уметь... по сцылке все доступно расписано что да как,тем более Вижуал и даже вроде которая бесплатная, создает шаблон СОМ объекта на раз.

7
23 марта 2010 года
@pixo $oft
3.4K / / 20.09.2006
Ах,уважаемый оксотник…Если вы про ту ссылку на RSDN,то поспешу вас огорчить–в Visual studio я не работаю(но не помешало бы уже освоить,к тому же,все предпосылки уже есть)
Посему–сначала хоть опробую то,что здесь было написано
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог