Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2008, 17:26   #1
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию Программно выгрузить DLL из памяти

Здравствуйте.
С помощью Delphi нужно выгрузить DLL.
Эта DLL вроде как hook - ловит нажатия клавишь, я знаю где находится и как называется DLL.
P.S. Перезагрузка и Выход из системы не подходят.
Заранее благодарю.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 29.04.2008, 17:44   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А FreeLibrary не подходит? А вызов DllMain этой библиотеки с DLL_THREAD_DETACH/DLL_PROCESS_DETACH раз эдак по 10? Если она есть в наличии, может её проще дизассемблировать и покурочить потом в рантайме или просто ret'ов понаставить на её функциях, условно говоря? Или даже LoadLibrary в "своей" kernel32.dll перехватить?
B_N вне форума Ответить с цитированием
Старый 30.04.2008, 15:42   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Если только "FreeLibrary" вызвать из самой DLL, если подействует, то как узнать HandleLibrary не используя LoadLibrary, потому что DLL загружает Windows, я могу в DLL написать процедуру выгрузки, но для этого надо знать HandleLibrary на момент её запуска.
P.S. нужно что-то вроде GetHandleLibrary.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 30.04.2008, 16:28   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
.........как узнать HandleLibrary не используя LoadLibrary, ..........
На этот вопрос ответ простой - GetModuleHandle. На все остальные - смотря, что за библиотека и как именно она грузится... Честно говоря, так и не понял, это библиотека Вашей разработки или нет?
B_N вне форума Ответить с цитированием
Старый 30.04.2008, 22:24   #5
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

"GetModuleHandle" как бы это сказать - не выгружает...
Вся проблема в том, что если DLL загружена, то её нельзя удалить.
Мне надо принудительно её выгрузить, что бы удалить.

Цитата:
это библиотека Вашей разработки или нет?
Так точно, моей.

Такой вопрос, DLL может сама себя выгрузить?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 30.04.2008, 22:56   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Сообщение

Если ваше, то таким способом попробывать:
Код:
function KillDll(aDllName: string): Boolean;
 var
   hDLL: THandle;
   aName: array[0..10] of char;
   FoundDLL: Boolean;
 begin
   StrPCopy(aName, aDllName);
   FoundDLL := False;
   repeat
     hDLL := GetModuleHandle(aName);
     if hDLL = 0 then
       Break;
     FoundDLL := True;
     FreeLibrary(hDLL);
   until False;
   if FoundDLL then
     MessageDlg('Success!', mtInformation, [mbOK], 0)
   else
     MessageDlg('DLL not found!', mtInformation, [mbOK], 0);
 end;
Alter вне форума Ответить с цитированием
Старый 30.04.2008, 23:07   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
"GetModuleHandle" как бы это сказать - не выгружает...
Разумеется. Вы же спрашивали как хэндл получить....


Цитата:
Сообщение от Air Посмотреть сообщение
Вся проблема в том, что если DLL загружена, то её нельзя удалить.
Мне надо принудительно её выгрузить, что бы удалить.
Да элементарно её "удалить":

Код:
MessageBox("TEST BEFORE", "", MB_OK | MB_ICONINFORMATION);
UnmapViewOfFile((LPVOID) GetModuleHandle("USER32.DLL") ); // <---------
MessageBox("TEST AFTER", "", MB_OK | MB_ICONINFORMATION);
Речь то о том, что библиотека могла внести каких-то изменений в процесс, Вы же сами говорили, что она хуки ставит, и, не убрав эти изменения, можно отправить процесс прямиком в 0чС0000005: Access Violation.
B_N вне форума Ответить с цитированием
Старый 01.05.2008, 00:06   #8
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

"Alter" попробовал, понял что сама себя DLL выгрузить не может, как не старайся, "Access Violation" говорит, а вот если из той проги что её загрузила - работает.

Цитата:
Разумеется. Вы же спрашивали как хэндл получить....
Я делал так
Код:
FreeLibrary(GetModuleHandle('Project1.dll'));
Результат то же, - программа (2) не может выгрузить DLL, которую загрузила программа (1).

А я без понятия "кто" из всех программ Windows грузит DLL, так или иначе DLL начинает работать когда пользователь пароль вводит. (на стадии приветствия). P.S. возможно WinLogon или Lsass.

Пока что выход один, переименовывать DLL (это все что можно с ней делать) и ставить новую, вместо старой и пускать комп на Reset.
Всё гениальное - просто!

Последний раз редактировалось Air; 01.05.2008 в 00:09.
Air вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как выгрузить сайт в интернет steck Свободное общение 18 22.02.2011 13:47
Помогите советом! Как выгрузить форму из памяти? Bezdar Microsoft Office Excel 18 08.05.2009 13:06
не могу выгрузить сайт, pагружаю через filezilla alexxxx Помощь студентам 2 07.06.2008 17:39
как выгрузить базу данных из MySQL в Access??? TRANE Помощь студентам 5 03.12.2007 13:22