Система — Win2000.
MSVC 6.0, pure API.
Имеется exe с экспортом функции keyproc для "захучивания" клавиатуры.
Т.е. он себя же использует как dll одновременно.
Для отладки загоняю в keyproc MessageBox.
Запускаем прогу. Давим на клавиши — все ОК. m-box-ы появляются.
Как только пробуем нажать что-нибудь в другом окне(активизируем другое), хук слетает.
И все... безвозвратно..........
(Хук устанавливается ВСЕГДА нормально)
В чем может быть дело???
Забыл добавить еще кое-что.
— Под Win95 все отлично работает. Все процессы в системе "ловятся".ы
— После сброса хука процесс остается работать.
— "Лишних" UnHook-ов нет.
— И с LoadLibrary, GetProcAddr, SetWindowsHookEx все в порядке.
— В SetWindowsHookEx предедаю по хендлу "dll" — (..,hLib,NULL)
Здравствуйте KMiNT21, Вы писали:
KMNT>В чем может быть дело???
Я как-то делал хук клавы под W95 и длл с ХукПроцессом делал как системную длл. Где-то в обзоре хуков вскользь написано, что ХукПроцесс должен быть в в длл. Ну много там, как всегда, не пишут.
— Под Win95 все отлично работает. Все процессы в системе "ловятся".
— После сброса хука процесс остается работать.
— "Лишних" UnHook-ов нет.
— И с LoadLibrary, GetProcAddr, SetWindowsHookEx все в порядке.
— В SetWindowsHookEx предедаю по хендлу "dll" — (..,hLib,NULL)
KMNT>Система — Win2000. KMNT>MSVC 6.0, pure API. KMNT>Имеется exe с экспортом функции keyproc для "захучивания" клавиатуры. KMNT>Т.е. он себя же использует как dll одновременно. KMNT>Для отладки загоняю в keyproc MessageBox. KMNT>Запускаем прогу. Давим на клавиши — все ОК. m-box-ы появляются. KMNT>Как только пробуем нажать что-нибудь в другом окне(активизируем другое), хук слетает. KMNT>И все... безвозвратно..........
KMNT>(Хук устанавливается ВСЕГДА нормально)
KMNT>В чем может быть дело???
KMNT>Забыл добавить еще кое-что.
KMNT>- Под Win95 все отлично работает. Все процессы в системе "ловятся".ы KMNT>- После сброса хука процесс остается работать. KMNT>- "Лишних" UnHook-ов нет. KMNT>- И с LoadLibrary, GetProcAddr, SetWindowsHookEx все в порядке. KMNT>- В SetWindowsHookEx предедаю по хендлу "dll" — (..,hLib,NULL)
Здравствуйте KMiNT21, Вы писали:
KMNT>Система — Win2000. KMNT>MSVC 6.0, pure API. KMNT>Имеется exe с экспортом функции keyproc для "захучивания" клавиатуры. KMNT>Т.е. он себя же использует как dll одновременно.
Вот в этом-то и дело. Запихай в Dll и не парься.
KMNT>Для отладки загоняю в keyproc MessageBox. KMNT>Запускаем прогу. Давим на клавиши — все ОК. m-box-ы появляются. KMNT>Как только пробуем нажать что-нибудь в другом окне(активизируем другое), хук слетает. KMNT>И все... безвозвратно..........
Потому что винда не могет твою exe загрузить.
KMNT>(Хук устанавливается ВСЕГДА нормально)
KMNT>В чем может быть дело???
KMNT>Забыл добавить еще кое-что.
KMNT>- Под Win95 все отлично работает. Все процессы в системе "ловятся".ы
Это просто ошибка в Win95, не иначе.
KMNT>- После сброса хука процесс остается работать. KMNT>- "Лишних" UnHook-ов нет. KMNT>- И с LoadLibrary, GetProcAddr, SetWindowsHookEx все в порядке. KMNT>- В SetWindowsHookEx предедаю по хендлу "dll" — (..,hLib,NULL)
С LoadLibrary все в порядке только потому, что, когда ты ее вызаваешь, модуль уже загружен и вызов LoadLibrary сводится практически к GetModuleHandle. Попробуй загрузить свой хуковый exe с помощью из LoadLibrary другого exe — фиг получится. А ведь это именно то, что винде приходится делать при установке хука.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S> Вот в этом-то и дело. Запихай в Dll и не парься.
Не могу. Если я не говорил — скажу. Я должен подредактировать чужой исходник. Пользуется этим продуктом большое число людей. Не видел я поминания о том, работает ли "оно" под НТ.
.. короче говоря не могу..
Может просто в ресурсы DLL-ку впихнуть? Ну все равно морока есть..
S> Потому что винда не могет твою exe загрузить.
Ну потому что без DLL-ной точки входа? Так может добавить?
Попробую...
S> Это просто ошибка в Win95, не иначе.
???? :)))
Мда...
" — фиг получится. А ведь это именно то, что винде приходится делать при установке хука."
Здравствуйте KMiNT21, Вы писали:
S>> Вот в этом-то и дело. Запихай в Dll и не парься.
KMNT>Не могу. Если я не говорил — скажу. Я должен подредактировать чужой исходник. Пользуется этим продуктом большое число людей. Не видел я поминания о том, работает ли "оно" под НТ. KMNT>.. короче говоря не могу.. KMNT>Может просто в ресурсы DLL-ку впихнуть? Ну все равно морока есть..
S>> Потому что винда не могет твою exe загрузить. KMNT>Ну потому что без DLL-ной точки входа? Так может добавить?
Что такое DLL-ная точка входа? AddressOfEntryPoint — просто DWORD по смещению 16 в Optional Header. Дело скорее в поле Characteristics из IMAGE_FILE_HEADER.
KMNT>Попробую...
S>> Это просто ошибка в Win95, не иначе. KMNT>???? KMNT>Мда...
KMNT>" — фиг получится. А ведь это именно то, что винде приходится делать при установке хука."
KMNT>Ок, попробую точку входа добавить еще одну.
В PE файлах не бывает более одной точки входа.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S> Что такое DLL-ная точка входа? AddressOfEntryPoint — просто DWORD по смещению 16 в Optional Header. Дело скорее в поле Characteristics из IMAGE_FILE_HEADER.
:)))))))
Да нет же, не об этом речь.
Короче разберись с функциями
_DllMainCRTStartup, _WinMain, _main
Здравствуйте KMiNT21, Вы писали:
S>> Что такое DLL-ная точка входа? AddressOfEntryPoint — просто DWORD по смещению 16 в Optional Header. Дело скорее в поле Characteristics из IMAGE_FILE_HEADER.
KMNT>))))
KMNT>Да нет же, не об этом речь.
KMNT>Короче разберись с функциями KMNT>_DllMainCRTStartup, _WinMain, _main
Сам сначала разберись А лучше не с этими функциями, а с форматом PE файла. Когда ты говоришь линкеру /ENTRY:_SuperDuperStartup, все, что он делает — это помещает адрес этой функции (переведя его в RVA) в поле AddressOfEntryPoint в IMAGE_OPTIONAL_HEADER. А загрузчик в Win 2000 просто не станет передавать управление по этому адресу, если в поле Characteristics из IMAGE_FILE_HEADER написано, что это не Dll, а модуль ты грузишь через LoadLibrary. И импорты биндить не будет, поэтому при попытке вызова из твоей exe, загруженной как Dll, любой виндовой функции ты получишь GPF. Что у тебя и происходит.
KMNT>и вообще как работает RTL
Винде плевать на сишный RTL. Загрузчик про нее ничего на знает.
KMNT>Вот моя статья (громко сказано) KMNT>www.uinc.ru/articles/28
KMNT>И тут где-то я встречал более полную.
Угу, только она тут не при чем
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S> Сам сначала разберись :) А лучше не с этими функциями, а с
Да, я тут немножко поспешил по поводу тебя. :) Просто на такие советы типа... хм.. ну по порядку.
1) "Потому что винда не могет твою exe загрузить."
С чего ты такое взял? Я попробовал сделать DLL, в которой в
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
загнал MessageBox. При захучивании эта DLL теперь не подгружается заново для каждого процесса. (?)
Или это потому, что в этом exe в PE эти флаги сброшены?
(File is DLL, Process initialization, Process termination еtc...)
2) "С LoadLibrary все в порядке только потому, что, когда ты ее вызаваешь, модуль уже загружен и вызов LoadLibrary сводится практически к GetModuleHandle. Попробуй загрузить свой хуковый exe с помощью из LoadLibrary другого exe — фиг получится. А ведь это именно то, что винде приходится делать при установке хука."
Вообще есть такая вот запись в ремарке по поводу LoadLibrary:
--
If the module is a DLL not already mapped for the calling process, the system calls the DLL's DllEntryPoint function with the DLL_PROCESS_ATTACH value. If the DLL's entry-point function does not return TRUE, LoadLibrary fails and returns NULL.
--
"Попробуй загрузить свой хуковый exe с помощью из LoadLibrary другого exe — фиг получится."
Пробовал. Все прекрасно работает. :) И хук так же ставится нормально.
3) "Потому что винда не могет твою exe загрузить. "
Снова не то. Я вот думал что не может загрузить потому, что внутри нет, как я сказал "длл-ной точки входа". Да, я не прав. Разобрался.
Просто как-то запало в голову после какой-то статьи, что, например, exe может стартовать с одной точки, а если его подгрузить как библиотеку, будет "заход" с другой точки.
На самом деле такая точка только одна.
....
Или все-таки и это не есть правда?
4) "А загрузчик в Win 2000 просто не станет передавать управление по этому адресу, если в поле Characteristics из IMAGE_FILE_HEADER написано, что это не Dll, а модуль ты грузишь через LoadLibrary."
????????????????
А что в описании LoadLibrary написано?????
"pLibFileName — Points to a null-terminated string that names the executable module (either a .DLL or .EXE file). "
S> Угу, только она тут не при чем :)
Согласен.
5)
"В PE файлах не бывает более одной точки входа. "
Здравствуйте KMiNT21, Вы писали:
KMNT>1) "Потому что винда не могет твою exe загрузить." KMNT>С чего ты такое взял? Я попробовал сделать DLL, в которой в KMNT>BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) KMNT>загнал MessageBox. При захучивании эта DLL теперь не подгружается заново для каждого процесса. (?) KMNT>Или это потому, что в этом exe в PE эти флаги сброшены? KMNT>(File is DLL, Process initialization, Process termination еtc...)
Очень может быть, я с флагами IMAGE_LIBRARY_PROCESS_INIT, IMAGE_LIBRARY_PROCESS_TERM, IMAGE_LIBRARY_THREAD_INIT,
IMAGE_LIBRARY_THREAD_TERM не разбирался. А если сброшен флаг File is DLL (IMAGE_FILE_DLL), то это уже не Dll, c точки зрения системы.
KMNT>2) "С LoadLibrary все в порядке только потому, что, когда ты ее вызаваешь, модуль уже загружен и вызов LoadLibrary сводится
практически к GetModuleHandle. Попробуй загрузить свой хуковый exe с помощью из LoadLibrary другого exe — фиг получится.
А ведь это именно то, что винде приходится делать при установке хука."
KMNT>Вообще есть такая вот запись в ремарке по поводу LoadLibrary: KMNT>-- KMNT>If the module is a DLL not already mapped for the calling process, the system calls the DLL's DllEntryPoint function with the DLL_PROCESS_ATTACH value. If the DLL's entry-point function does not return TRUE, LoadLibrary fails and returns NULL. KMNT>--
Ключевые слова — "If the module is a DLL". В остальных случаях — как бог на душу положит. Вообще-то поведение загрузчика в
недокументированных ситуациях различается в разных версиях виндов.
KMNT>"Попробуй загрузить свой хуковый exe с помощью из LoadLibrary другого exe — фиг получится."
KMNT>Пробовал. Все прекрасно работает. И хук так же ставится нормально.
Что именно пробовал? Из одного exe грузить другой exe с помощью LoadLibrary? В Win2k LoadLibrary вернет тебе ненулевой хэндл,
но exe не будет нормально загружен. Больше всего он будет похож на загруженный resource-only Dll — entry point не вызовется, импорты не
будут привязаны. Со всеми вытекающими отсюда последствиями. Если у тебя другие результаты, уточни.
KMNT>3) "Потому что винда не могет твою exe загрузить. " KMNT>Снова не то. Я вот думал что не может загрузить потому, что внутри нет, как я сказал "длл-ной точки входа". Да, я не прав. Разобрался. KMNT>Просто как-то запало в голову после какой-то статьи, что, например, exe может стартовать с одной точки, а если его подгрузить как библиотеку, будет "заход" с другой точки. KMNT>На самом деле такая точка только одна. KMNT>.... KMNT>Или все-таки и это не есть правда?
Статья не про Win16 была? Там что-то подобное вроде было возможно (а может и нет), но я точно этого не знаю.
KMNT>4) "А загрузчик в Win 2000 просто не станет передавать управление по этому адресу, если в поле Characteristics из IMAGE_FILE_HEADER написано, что это не Dll, а модуль ты грузишь через LoadLibrary."
KMNT>????????????????
KMNT>А что в описании LoadLibrary написано????? KMNT>"pLibFileName — Points to a null-terminated string that names the executable module (either a .DLL or .EXE file). "
Это используется в другом случае — например, 1.exe загружает 2.Dll. При этом 1.exe сама экспортирует некоторые функции, которые нужны
загруженной 2.Dll. Так вот из 2.Dll можно смело вызывать LoadLibrary("1.exe"), все будет работать правильно. Заметь, что entry point в этом
случае не вызывается, иначе 1.exe опять начала бы создавать главное окно или что там она делает при загрузке, и управление в LoadLibrary
вернулось бы очень не скоро
А вот если попробовать сделать LoadLibrary("1.exe") из 3.exe, то обломс — 1.exe загрузится
(под Win2k, под Win98 у меня она просто не грузилась с last error, кажется, ERROR_BAD_FORMAT), но ее экспортированные функции работать
(почти наверняка) не будут. Почти — потому в адресное пространство процесса она все-таки попадет, и если ее экспортированные функции
настолько простые, что не требуют вызовов импортированных функций, инициализации статических переменных, не требуют применения relocations
и т. д., то выполняться они все-таки будут. Впрочем, очеводно, что практическая ценность такой "загрузки" близка к нулю.
KMNT>5) KMNT>"В PE файлах не бывает более одной точки входа. "
KMNT>Ну тут я подразумевал другое немножко. См. ИДУ:
KMNT> File Edit Navigate View Options Windows ↓ AU:▒░idle░▒ WAITING 09:55:37
Я понял только, что ты пользуешься какой-то старой версией IDA, потому что Navigate уже давно переименован в jump. Скачай версию 4.17
(http://www.crackbest.com/unlock/discomp/ida417.zip), не пожалеешь. Видимо, имелся в виду DOS stub? В принципе, его можно считать второй
точкой входа, но не для сочетания EXE/DLL, а для DOS/Windows.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S>но exe не будет нормально загружен. Больше всего он будет похож на загруженный resource-only Dll — entry point не вызовется, импорты не S>будут привязаны. Со всеми вытекающими отсюда последствиями. Если у тебя другие результаты, уточни.
Возможно. Я пробовал простой вариант. Скомпилил свой exe, переименовал. Затем перекомпилил снова, подставить в LoadLibrary уже другой exe файл.
Вроде как результат на 100 процентов аналогичный предыдущему. Т.е., как говорится, "ниякоi рiзницi".
S>иначе 1.exe опять начала бы создавать главное окно или что там она делает при загрузке, и управление в LoadLibrary S>вернулось бы очень не скоро :)
S>Я понял только, что ты пользуешься какой-то старой версией IDA, потому что Navigate уже давно переименован в jump. Скачай версию 4.17
Да есть, правда как-то небыло надбности "обновляться". :)
"Видимо, имелся в виду DOS stub?"
Да нет, конечно.. ладно, не в том дело.
Здравствуйте KMiNT21, Вы писали:
S>>но exe не будет нормально загружен. Больше всего он будет похож на загруженный resource-only Dll — entry point не вызовется, импорты не S>>будут привязаны. Со всеми вытекающими отсюда последствиями. Если у тебя другие результаты, уточни.
KMNT>Возможно. Я пробовал простой вариант. Скомпилил свой exe, переименовал. Затем перекомпилил снова, подставить в LoadLibrary уже другой exe файл. KMNT>Вроде как результат на 100 процентов аналогичный предыдущему. Т.е., как говорится, "ниякоi рiзницi".
S>>иначе 1.exe опять начала бы создавать главное окно или что там она делает при загрузке, и управление в LoadLibrary S>>вернулось бы очень не скоро
S>>Я понял только, что ты пользуешься какой-то старой версией IDA, потому что Navigate уже давно переименован в jump. Скачай версию 4.17
KMNT>Да есть, правда как-то небыло надбности "обновляться".
KMNT>"Видимо, имелся в виду DOS stub?" KMNT>Да нет, конечно.. ладно, не в том дело.
KMNT>Скажи вот лучше что-нибудь на эту мысль -
KMNT>http://www.bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=41285
Насколько я понимаю, этот exe превратится в Dll. И загружать его как exe (CreateProcess) винда после правки не станет.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.