возможно ли подменить виндовсовскую dll-ку без перезагрузки?

elena-kotenok75

собстно, сабж. и если да - то как?
Win2k

klyv

собстно, сабж. и если да - то как?
Win2k
выгрузить все приложения, которые её используют (найти их можно в Process Explorer'е заменить, запустить приложения обратно.

ALEX98

regsvr32 :confused:

klyv

regsvr32 :confused:
эт.то тут причём?

ALEX98

я потому и вставил сконфуженную рожу, т.к. постановка задачи неполна ИМХО

otets-mihail

замени-ка ntdll.dll )

klyv

надо будет выгрузить все приложения. втч винду :)

SPARTAK3959

Можно. Прямым доступом к диску. Получаешь с помощью API дефрагментатора кластеры в которых расположен файл и пишешь туда через устройство (или другая цифра). Что именно увидят приложения, которые используют эту длл'ку - сложный вопрос. Имеет смысл вначале изменить dll'ку в адресных пространствах всех процессов (можно для этого использовать CreateRemoteThread для создания потока, который загрузит вашу dll'ку, которая выполнит необходимую подмену).

Dasar

исходную dll-ку переименовать, записать новую.

klyv

исходную dll-ку переименовать
да кто бы дал бы :)

Dasar

да кто бы дал бы
и какую dll-ку нельзя переименовать?
переносить нельзя, а переименовать выполняемые файлы всю жизнь можно было - этим даже вирусняк пользуется.

klyv

переносить нельзя, а переименовать выполняемые файлы всю жизнь можно было
вахъ :)
а когда он подцепит новую dll? при след. загрузке её или после того, как выгрузит старую?

AlexV769

гм, в винде понятия "переместить" (move) и "переименовать" (rename) - 2 разных?!

Dasar

а когда он подцепит новую dll? при след. загрузке её или после того, как выгрузит старую?
он - это кто?
если речь про уже запущенный процесс, то реально - никогда (т.к. обычно преобразование имени в dll - проходит при старте если же углубляться в детали - то при следующей подгрузке по имени

Dasar

гм, в винде понятия "переместить" (move) и "переименовать" (rename) - 2 разных?!
rename более частный случай move, rename - это move внутри одной диры. в этом случае - только изменяется имя внутри диры.

AlexV769

и как из этого следует, что открытым файлом (суть хендл) rename можно сделать, а move - нельзя?
хендл же не привязан к дире.

Dasar

и как из этого следует, что открытым файлом (суть хендл) rename можно сделать, а move - нельзя?
хендл же не привязан к дире.
при move возможно: изменение прав, изменение шифрования/компрессии, изменение положения на диске, смена диска и т.д.
при rename всего этого нет.

klyv

он - это кто?
если речь про уже запущенный процесс, то реально - никогда (т.к. обычно преобразование имени в dll - проходит при старте если же углубляться в детали - то при следующей подгрузке по имени
Он - злобный ОС.
т.е. при каждом запросе на загрузку dll проверяется, соответствует ли уже загруженный образ тому, что на диске?

Dasar

т.е. при каждом запросе на загрузку dll проверяется, соответствует ли уже загруженный образ тому, что на диске?
все проще, никаких проверок нет.
просто загрузка dll-ек происходит обычно один раз: при старте процесса

klyv

при старте процесса
и при старте каждого нового процесса они заново загружаются?..

elenangel

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

pitrik2

мне кажется
слушьте, ну гляньте уже мсдн, как в отношении винды может чтото казаться? в винде порою очень странная логика

klyv

ну гляньте уже мсдн
уломал, чертяга.
К сожалению, нету полной версии MSDN под рукой (а в инет лезть лень - там медленно но очевиден один факт - dll, однажды загруженная в память, будет использоваться всеми, кто её будет запрашивать, пока она не станет ненужной, когда и будет выкинута из памяти, и только после этого при обращении будет подгружаться новая версия dll.

Dasar

и при старте каждого нового процесса они заново загружаются?..
да, заново загружаются.
но так как загрузка dll - это маппинг файловой системы на память, то если dll та же самая (по расположению на диске то как такой новой загрузки не происходит.

Dasar

мне кажется, что чтобы процесс подцепил измененную библиотеку надо создать другой процесс который выжрет всю память (ну потом вернет конечно). при этом данные других процессов выгрузятся в своп, а страницы дллек просто будут помечены как отсутствующие. соответственно при следующем к ним обращении они будут подгружены с образа. правда немного смущает то, что вроде как библиотеки кешируются осью, так что менять скорее всего придется 2 файла - исходный и тот, который лежит в кеше
мапинг идет по расположению на диске, а не по имени файла.
соответственно предложенный тобой способ не подойдет, т.к. при выгрузке все равно останется информация - какие именно файловые страницы были замаплены на память.
Оставить комментарий
Имя или ник:
Комментарий: