|
|
| Посл.отвђт | Сообщен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 |