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;
Как выгрузить библиотеку из процессов при выходе из основной программы
Есть программкА, ставящая глобальный клавиатурный хук. Хук ставится/убирается внутри библиотеки (ну при её загрузке/выгрузке в АП процесса). При выходе из основной программы она выгружает библиотеку только из своего АП...а в других процессах библиотека висит и хук продолжает работать (когда уже и не нужно). Всё это выгружается, ест-но, только при выходе из винды.
Так вот, как сделатЬ, чтобы при выходе из основной программы, она давала сигнал о выгрузке библиотек из всех процессов, которые её используют ??
UnHookWindowsHook сделать
кхм...UnHookWindowsHook выгружает библиотеку только из АП своего процесса (программы). Мне же надо выгрузить библиотеку в ЧУЖОМ процессе.
Сделай UnHook и посмотри, будут ли приходить сообщения.
1) я ставлю хук в основной программе при её запуске. Выгружаю тоже при выходе из программы. Но при таком варианте выскакивает ошибка при выходе из программы. Я не понял, в чём там проблемА, поэтому сделал по 2-му варианту
2) хук ставится ВНУТРИ библиотеки при её загрузке в АП какого-нибудь процесса (т.е. сколько процессов использую библиотеку, столько и хуков одного типа стоит. Может оряво выразился, но так оно и есть). И при выходе из основной программы, выгружается библиотека из АП только ЭТОЙ программы. Чтобы выгрузить её из всех других процессов, нужно их убить (закрыть приложения), только тогда винда сама выгрузит библиотеку. Но мне этого не надо. Я хочу сразу при выходе из основной программы выгрузить библиотеку из ВСЕХ чужих процессов.
А так пользуюсь тем же самым....
UnhookWindowshookEx
Итак, я знаю идентификатор процесса, из которого нужно выгрузить dll.
вот код:
Код:
Ну и в библиотеке сама 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;
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, при проверке дебаггером, выполняются...дальше если проверять пошагово ,то вылетает ошибка...ссылаюсь на то ,что нельзя там дальше пошагово.
Ну да ладно. Пускаю программу. Я знаю, что у меня есть один процесс (аська), которы в данный мометн пользуется библиотекой.
При нажатии на кнопку пытаюсь выгрузить из неё библиотеку (вышеописанный код). Аська закрывается с ошибкой.
Часть примера взята с фоорума, я пытался развить идею. Посмотртте ,мож чего забыл ?
ты при создании удалённого потока ищешь адрес функции в своём процессе, а в чужом процессе он по этому адресу может быть совсем другое - поэтому ошибка
главная задача найти базу по которой загружена твоя либа в чужом процессе
А как это сделать ? :)
вот именно этом то и заключается главная проблема......