подскажите пожалуйста, по данной теме есть пара вопросов, которые пока остаются не ясными: 1) верно ли: хук установленный процессом одного приложения остается активным (то есть остается в памяти) до тех пор пока приложение не будет завершено? И если да то что будет если его не снять при выходе из приложения? 2) можно ли в процедуре DllMain при reason == DLL_PROCESS_ATTACH вызывать ф-цию SetWindowsHookEx() ?? ( по сути надо сделать поставленный хук резидентным )
Не совсем понятно выражение Если имеется в виду локальный хук, то он живет только в приложении. Такой хук называется глобальным и должен размещаться в DLL. При установке такого хука, эта DLL будет загружена в каждый процесс, запущенный в данный момент.
ну разумеется речь шла о глобальном, и про проекцию длл на адресное пространство процессов понятно. вопрос в том как долго такой хук будет жить?? (то есть если завершить приложение, кот. его поставило без снятия хука... что будет?? )
эм, еще раз доброй ночи, но как то вроде либо у меня непонятки остались, либо ответ не совсем верный ... получается вот какая картина: приложение А ставит глобальный хук и соответственно проецирует длл (проверено - эта часть работает). Дальше до тех пор пока приложение работает длл проецируется на АП других процессов (тоже проверено) и соответственно хук срабатывает... но как только приложение А завершает работу, все приходит в норму - никаких хуков... Почему оно так происходит, если хук живет аж до перезагрузки системы??? заранее спасибо
за код стыдно =) но это так сказать просто шаблон так что прошу не критиковать очень (только если по делу =) та часть кот. ставит хук и подгружает библиотеку Код (Text): local hInstLib:HANDLE local hProc:HANDLE local hParam:HANDLE invoke LoadLibrary, $CTA0("tstdll") mov hInstLib,eax invoke GetProcAddress, hInstLib, $CTA0("TestProc") mov hProc,eax invoke SetWindowsHookEx, WH_KEYBOARD, hProc,hInstLib,0 invoke ExitProcess,0
Я бы поместил код, устанавливающий/снимающий хук, в ту же длл, где находится обработчик хука. И экспортировал бы функции типа InstallHook/RemoveHook;
Когда закрывается последнее приложение, использующее dll, она (длл) выгружается нафик. И хук твой летит ко всем чертям. Или я не прав?
Что значит "загружается во все процессы"? Во все копии твоего приложения, которые ее подгрузили? Ну так она выгружается из памяти ОС при закрытии последнего процесса, подгрузившего его. P.S. Если не прав, поправь, но это ведь логично. DLL не может висеть в памяти, если ее никакой процесс не использует. Если процесс не выгрузил DLL при закрытии, OS сама следит за тем, чтобы выгрузить ее. P.P.S. Давно под win не прогал =)
Partner хук работает потому что в длл'ке на result == DLL_PROCESS_ATTACH висит окошко (просто показывает что длл загружена) да и ф-ция обработки хука в той же длл также выводит окошко (так проще отследить что работает а что нет =)) по поводу: тогда получается: внедряется длл в АП процесса -> чтобы поставить хук нужно чтобы функция установки хука была вызвана, а в чужом коде всяко не вызывается такое =))... (или вешать ловушку при DLL_ATTACH_PROCESS - но тут не уверен что проблем не будет) perez как я понял длл загружается в АП всех процессов для чьих потоков сработал хук... таким образом перед тем как будет обработано DLL_PROCESS_ATTACH счетчик пользоват-й длл = +1, а после DLL_PROCESS_DETACH =-1... ну и соответственно при == 0 длл выгружается... вроде так ... другое дело все еще не понятно с хуком?? как долго живет? пока длл загружена (но ведь она ему вроде не нужна и подгружается только чтобы запустить процедуру обработки хука) или, как было сказано аж до ребута... (но тут на практике не совсем так получается)
Хук глобален. Хэндл его тоже глобален. Достаточно вызвать процедуру установки хука у себя один раз. Хук снимается системой после того, как процесс (поток?) создатель хука завершает выполнение, а не после того, как завершится последний процесс, с подгруженной в него dll. Для того, чтобы прийти к таким выводам не нужно лезть в дебри ядра и, тем более, гадать на кофейной гуще. Достаточно взять пример из этой статьи, ProcessExplorer (чтоб следить за наличием dll) и программу PuntoSwitcher.
=) отлично, теперь выводы совпадают с тем что получается в качестве результата... perez спасибо за ссылку, тоже была такая догадка, но была надежда может он (хук) и правда будет жить дольше запустившего процесса (впрочем надежда осталась, алгоритм поменялся =)) Всем спасибо за внимание
=)) что интересно абсолютно четкий ответ нашелся у Рихтера, только в главе про оконные сообщения =)) (что также достаточно забавно потому как перечитав несколько раз раздел о длл и хуках как раз информации по поднятому здесь вопросу и не нашел)