· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› DLL

Посл.отвђт Сообщенiе


Дата: Апр 3, 2004 15:27:36

Интересный вопрос - как выгрузить ДЛЛ из самой ДЛЛ? т.е. мы приклеились к какому-то приложению (может и ко всем) через SetWindowsHookEx. Как из длл взять себя и выгрузить?


Дата: Апр 3, 2004 18:57:26

Когда ты снимешь хук, система сама тебя выгрузит. Если хочешь не дожидаясь, то нужно снять хук, создать поток и из него звать FreeLibraryAndExitThread. Но, IMHO, и может какой-нить косяк выйти.


Дата: Апр 3, 2004 19:47:38

А можно поподробнее. Это не хук. Я может не так выразился. Это длл цепляется к приложению. Без хука. Отработала - надо себя выгрузить.


Дата: Апр 4, 2004 01:32:33

Ну если не хук тогда вообще просто. Ты как свою длл в процесс инжектишь? Через CreateRemoteThread? Если да, то просто когда ты все сделаешь, что надо вызываешь FreeLibraryAndExitThread.

Если как-то по другому и своего потока у тя нет, то создай поток и из него вызывай FreeLibraryAndExitThread.

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


Дата: Апр 4, 2004 01:47:58 · Поправил: Sk. Inc.

А, в принципе, вариант через хуки тоже хороший, т.к. система сама подгружает DLL в другой процесс, а после закрытия хука - сама выгружает. Не обязательно действия DLL должны ограничиваться рамками установенного хука, иногда он используется именно для загрузки библиотеки в другой процесс.


Дата: Апр 4, 2004 08:30:45

Цепляется она вообще-то к експлореру при загрузке винды. Без CreateRemoteThread - на все винды. Задача - периодически ее обновлять. т.е. при каком-либо флаге в реестре она должна выгрузится. Для того, чтоб ее заменить можно было.


Дата: Апр 4, 2004 08:59:27

Что за функйия FreeLibraryAndExitThread?


Дата: Апр 4, 2004 09:36:59

Может есть варианты выгрузки ее из внешнего приложения? Так даже было б лучше. Желательно с исходниками на любом языке.


Дата: Апр 5, 2004 12:20:34

[ masm_user777: Задача - периодически ее обновлять. т.е. при каком-либо флаге в реестре она должна выгрузится. ]

Если длл цепляется при загрузке процесса, то не уверен, что её можно выгрузить через FreeLibrary. Я никогда такого не делал, но начал бы с такого варианта: длл которая цепляется при загрузке делает только то, что создает поток, который динамически загружает рабочую длл и периодически опрашивает флаг в реестре (если те именно через реестр нужно). Если флаг установлен, то выгружаем рабочую длл и загружаем её снова.


[ comrade: Что за функйия FreeLibraryAndExitThread? ]

Представь, что ты проинжектил в чужой процесс свою длл, создав там поток, который эту длл выполняет. И вот потребовалось тебе этот поток тарминировать и выгрузить длл. Как ты будешь это делать? Если вызовешь FreeLibrary из самой же этой длл, то она вернется уже на пустое место и будет кирдык. Если вызовешь ExitThread, то кто будет выгружать длл. Вот тут ты сразу и поймешь всю прелесть FreeLibraryAndExitThread.


Дата: Апр 5, 2004 18:49:07

masm_user777
> Может есть варианты выгрузки ее из внешнего приложения? Так даже было б лучше. Желательно с исходниками на любом языке.

Если ты загрузил свою ДЛЛ в удалённый процесс, например через CreateRemoteThread & LoadLibrary, то имеешь хэндл, который можешь использовать при выгрузке, т.е. опять CreateRemoteThread & FreeLibrary и никаких проблем или я не понимаю тогда в чём суть этого топика..


Дата: Апр 5, 2004 19:44:05

Да нету хендла. Она грузится как системная с експлорером.


Дата: Апр 6, 2004 01:29:23 · Поправил: Asterix

Значит идея такая:

Пусть твоя искомая загружаемая через реестр ДЛЛ экспортирует такую функцию:
GethModule proc
  mov eax, hInstance
  ret
GethModule endp


Соответственно код на DllMain искомой ДЛЛ должен быть приблизительно такой
DllEntry proc hInst:DWORD, reason:DWORD, reserved1:DWORD
   .IF reason == DLL_PROCESS_ATTACH     ; When the dll is loaded
       push hInst
       pop hInstance
       .............


Чтобы теперь её выгрузить нужно создать удалённый поток и подгрузить свою
другую ДЛЛ через CreateRemoteThread & LoadLibrary, она должна вызвать
GethModule и получить hModule искомой DLL, теперь можно вызвать FreeLibrary
для искомой загруженной через реестр ДЛЛ, далее если нужно можно загрузить
другую ДЛЛ, ну и в конце вызвать CreateRemoteThread & FreeLibrary для этой
вспомогательной DLL. Вот.

По идее можно ещё вытащить hModule через Toolhelp32 API.

Если я где-то прогнал поправляйте ;-)


Дата: Апр 6, 2004 04:26:59 · Поправил: comrade

Four-F

Такого API не существует. Если вы имеете ввиду:
push 0
push [ExitThread]
push moi
push [ExitThread]
jmp  [FreeLibrary]


То говорите сразу


Дата: Апр 6, 2004 04:31:17

Ну блин... Существует... Сорри


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.048