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

Ваш аккаунт

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

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

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

Как выгрузить библиотеку из процессов при выходе из основной программы

5.2K
16 декабря 2006 года
SerMax
96 / / 04.11.2006
Искал в инэте- многие об этом сспрашивают, но конкретного ответа я не нашёл. И всё же :
Есть программкА, ставящая глобальный клавиатурный хук. Хук ставится/убирается внутри библиотеки (ну при её загрузке/выгрузке в АП процесса). При выходе из основной программы она выгружает библиотеку только из своего АП...а в других процессах библиотека висит и хук продолжает работать (когда уже и не нужно). Всё это выгружается, ест-но, только при выходе из винды.

Так вот, как сделатЬ, чтобы при выходе из основной программы, она давала сигнал о выгрузке библиотек из всех процессов, которые её используют ??
547
18 декабря 2006 года
Hydra
488 / / 20.06.2006
UnHookWindowsHook сделать
5.2K
18 декабря 2006 года
SerMax
96 / / 04.11.2006
кхм...UnHookWindowsHook выгружает библиотеку только из АП своего процесса (программы). Мне же надо выгрузить библиотеку в ЧУЖОМ процессе.
547
19 декабря 2006 года
Hydra
488 / / 20.06.2006
UnHook вообще выключает хук из цепочки вызовов, соответственно библиотека срабатывать не будет. Проведи эксперимент. Из Dll пости какое-нть сообщение и каким-нть приложением лови его.
Сделай UnHook и посмотри, будут ли приходить сообщения.
5.2K
19 декабря 2006 года
SerMax
96 / / 04.11.2006
У меня всего 2 варианта :
1) я ставлю хук в основной программе при её запуске. Выгружаю тоже при выходе из программы. Но при таком варианте выскакивает ошибка при выходе из программы. Я не понял, в чём там проблемА, поэтому сделал по 2-му варианту
2) хук ставится ВНУТРИ библиотеки при её загрузке в АП какого-нибудь процесса (т.е. сколько процессов использую библиотеку, столько и хуков одного типа стоит. Может оряво выразился, но так оно и есть). И при выходе из основной программы, выгружается библиотека из АП только ЭТОЙ программы. Чтобы выгрузить её из всех других процессов, нужно их убить (закрыть приложения), только тогда винда сама выгрузит библиотеку. Но мне этого не надо. Я хочу сразу при выходе из основной программы выгрузить библиотеку из ВСЕХ чужих процессов.

А так пользуюсь тем же самым....
UnhookWindowshookEx
5.2K
22 декабря 2006 года
SerMax
96 / / 04.11.2006
пошёл по методу : ищу перебором процесс, работающий с моей библиотекой, и пытаюсь вызвать в этом процессе функцию, которая выгружает библиотеку.

Итак, я знаю идентификатор процесса, из которого нужно выгрузить dll.
вот код:
Код:
var
 ....
 hProc,hThread,hmod:THandle;
 pe32:TPROCESSENTRY32;
 tid:DWORD;
.........

 hProc:=OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION, FALSE, pe32.th32ProcessID);
 if hProc=null then
  ShowMessage('Oshibka pri OpenProcess')
 else
  begin
    hThread:=CreateRemoteThread(hProc, nil, 0,(GetProcAddress(GetModuleHandle(PCHAR('dll_change.dll')), PCHAR('FreeLib'))), @hmod, 0, tid);
    if hThread=null then
      begin
       ShowMessage('Oshibka pri CreateRemoteThread');
       CloseHandle(hProc);
      end
    else
     begin
       WaitForSingleObject(hThread, INFINITE);
       CloseHandle(hThread);
       CloseHandle(hProc);
     end;
  end;


Ну и в библиотеке сама FreeLib :
Код:
........
procedure DLLEntryPoint(dwReason: DWord); //stdcall;
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
     begin
   ...........
     end;
    DLL_PROCESS_DETACH:
     begin
      UnhookWindowshookEx(CurrentHook);
      ReleaseDC(hwndMain,HDC); //отвязываю HDC от hwndMain
      DestroyWindow(hwndMain);   //уничтожаю окно
      UnRegisterClass(wc.lpszClassName,HInstance); //освобождаю память ,взятую присоздании класса...не знаю, правильно ли
      FreeLibrary(HInstance);
     end;
  end;
end;
.....
 procedure FreeLib; stdcall; //пытался без stdcall -не помогло
  begin  
   DLLEntryPoint(DLL_PROCESS_DETACH);
  end;
.......
exports Key_Hook,FreeLib;


так вот..шаги при OpenProcess и CreateRemoteThread, при проверке дебаггером, выполняются...дальше если проверять пошагово ,то вылетает ошибка...ссылаюсь на то ,что нельзя там дальше пошагово.
Ну да ладно. Пускаю программу. Я знаю, что у меня есть один процесс (аська), которы в данный мометн пользуется библиотекой.
При нажатии на кнопку пытаюсь выгрузить из неё библиотеку (вышеописанный код). Аська закрывается с ошибкой.

Часть примера взята с фоорума, я пытался развить идею. Посмотртте ,мож чего забыл ?
261
22 декабря 2006 года
ahilles
1.5K / / 03.11.2005
этот код выгрузки библиотеки полностью не рабочий
ты при создании удалённого потока ищешь адрес функции в своём процессе, а в чужом процессе он по этому адресу может быть совсем другое - поэтому ошибка
главная задача найти базу по которой загружена твоя либа в чужом процессе
5.2K
22 декабря 2006 года
SerMax
96 / / 04.11.2006
А как это сделать ? :)
261
23 декабря 2006 года
ahilles
1.5K / / 03.11.2005
вот именно этом то и заключается главная проблема......
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог