Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |  |
?? 21.03.02 00:43 Число просмотров: 1190
Автор: :-) <:-)> Статус: Elderman
|
Давно на старом форуме этот вопрос обсуждался, что хук всегда должен быть в DLL (активное участие в обсуждении принимала irka)
Чтобы хук работал в чужом процессе, винда должна спроецировать DLL с хуком в этот чужой процесс, а если хук не в DLL, то она просто не сможет этого сделать.
Можно попробовать придать .exe-шнику вид .dll: переключить 1 бит в PE-заголовке (file is DLL) и WinMain подправить, чтобы пределять, вызвана ли WinMain в результате запуска .exe или загрузки/выгрузки .dll. Еще у LibMain и WinMain разное число параметров, так что при возврате из LibMain/WinMain положено снимать со стека разное число двойных слов.
А вообще непонятно, почему в Win95 это работает...
|
|
<programming>
|
[win32] w2k, setwindowshookex(wh_keyboard..). сбрасывающийся хук. 20.03.02 10:38
Автор: KMiNT21 <http://blog.kmint21.com> Статус: Member
|
Система - Win2000.
MSVC 6.0, pure API.
Имеется exe с экспортом функции keyproc для "захучивания" клавиатуры.
Т.е. он себя же использует как dll одновременно.
Для отладки загоняю в keyproc MessageBox.
Запускаем прогу. Давим на клавиши - все ОК. m-box-ы появляются.
Как только пробуем нажать что-нибудь в другом окне(активизируем другое), хук слетает.
И все... безвозвратно..........
(Хук устанавливается ВСЕГДА нормально)
В чем может быть дело???
http://www.uinc.ru/forum
|
 |
Забыл добавить еще кое-что. 20.03.02 11:03
Автор: KMiNT21 <http://blog.kmint21.com> Статус: Member
|
> Система - Win2000. > MSVC 6.0, pure API. > Имеется exe с экспортом функции keyproc для "захучивания" > клавиатуры. > Т.е. он себя же использует как dll одновременно. > Для отладки загоняю в keyproc MessageBox. > Запускаем прогу. Давим на клавиши - все ОК. m-box-ы > появляются. > Как только пробуем нажать что-нибудь в другом > окне(активизируем другое), хук слетает. > И все... безвозвратно.......... > > (Хук устанавливается ВСЕГДА нормально) > > В чем может быть дело???
Забыл добавить еще кое-что.
- Под Win95 все отлично работает.
- После сброса хука процесс остается работать.
- "Лишних" UnHook-ов нет.
- И с LoadLibrary, GetProcAddr, SetWindowsHookEx все в порядке.
- В SetWindowsHookEx предедаю по хендлу "dll" - (..,hLib,NULL)
http://www.uinc.ru/forum
|
 |  |
?? 20.03.02 16:43
Автор: KMiNT21 <http://blog.kmint21.com> Статус: Member
|
|
|
 |  |  |
?? 21.03.02 00:43
Автор: :-) <:-)> Статус: Elderman
|
Давно на старом форуме этот вопрос обсуждался, что хук всегда должен быть в DLL (активное участие в обсуждении принимала irka)
Чтобы хук работал в чужом процессе, винда должна спроецировать DLL с хуком в этот чужой процесс, а если хук не в DLL, то она просто не сможет этого сделать.
Можно попробовать придать .exe-шнику вид .dll: переключить 1 бит в PE-заголовке (file is DLL) и WinMain подправить, чтобы пределять, вызвана ли WinMain в результате запуска .exe или загрузки/выгрузки .dll. Еще у LibMain и WinMain разное число параметров, так что при возврате из LibMain/WinMain положено снимать со стека разное число двойных слов.
А вообще непонятно, почему в Win95 это работает...
|
 |  |  |  |
?? №2 21.03.02 11:29
Автор: KMiNT21 <http://blog.kmint21.com> Статус: Member
|
> Можно попробовать придать .exe-шнику вид .dll: переключить > 1 бит в PE-заголовке (file is DLL) и WinMain подправить,
Ну есть просто хеадер подправить, но загрузщик в Win2k скажет что это не EXE (или что-то в этом роде).
> чтобы пределять, вызвана ли WinMain в результате запуска > .exe или загрузки/выгрузки .dll. Еще у LibMain и WinMain > разное число параметров, так что при возврате из > LibMain/WinMain положено снимать со стека разное число > двойных слов.
Да, это мысль.
> А вообще непонятно, почему в Win95 это работает...
А мне вообще не до конца ясноконкретнаяпричина необходимости быть хук-коду в DLL. Разве нельзя настроить сегменты в EXE так, чтобы он так же нормально проецировался на процессы? Ну если дело в DllEntryPoint, то почему же в 9x пашет?
Че-то я запутался...
|
 |  |  |  |  |
?? №2 21.03.02 22:33
Автор: Biasha <Бяша> Статус: Member
|
> > А вообще непонятно, почему в Win95 это работает... Не понятно...
> А мне вообще не до конца ясноконкретнаяпричина > необходимости быть хук-коду в DLL. Разве нельзя настроить > сегменты в EXE так, чтобы он так же нормально проецировался > на процессы? Ну если дело в DllEntryPoint, то почему же в > 9x пашет? > Че-то я запутался... Причина быть в dll понятна - как можно загрузить процесс в процесс. Хотя, конечно можно и загрузить, но зачем MS лишняя морока.
Короче не морочь голову себе - обработчик хука должен быть в dll там его и помести.
|
 |  |  |  |  |  |
Ну это все понятно. Вот если бы кто рассказал подробно процесс весь - какую послед. действий делает загрузщик (на низком уровне - т.е. что за флаги проверяет, в какой момент выделяет память в процессе под dll, когда релоки пересчитывает и т.д.) 22.03.02 10:41
Автор: KMiNT21 <http://blog.kmint21.com> Статус: Member
|
|
|
|
|