W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 20.03.02 10:04
Оценка:
Система — Win2000.
MSVC 6.0, pure API.
Имеется exe с экспортом функции keyproc для "захучивания" клавиатуры.
Т.е. он себя же использует как dll одновременно.
Для отладки загоняю в keyproc MessageBox.
Запускаем прогу. Давим на клавиши — все ОК. m-box-ы появляются.
Как только пробуем нажать что-нибудь в другом окне(активизируем другое), хук слетает.
И все... безвозвратно..........

(Хук устанавливается ВСЕГДА нормально)

В чем может быть дело???

Забыл добавить еще кое-что.

— Под Win95 все отлично работает. Все процессы в системе "ловятся".ы
— После сброса хука процесс остается работать.
— "Лишних" UnHook-ов нет.
— И с LoadLibrary, GetProcAddr, SetWindowsHookEx все в порядке.
— В SetWindowsHookEx предедаю по хендлу "dll" — (..,hLib,NULL)
KMiNT21' Blog
http://kmint21.info/ru/
Re: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: ua1zcl Россия www.alexklm.ru
Дата: 20.03.02 15:25
Оценка:
Здравствуйте KMiNT21, Вы писали:

KMNT>В чем может быть дело???


Я как-то делал хук клавы под W95 и длл с ХукПроцессом делал как системную длл. Где-то в обзоре хуков вскользь написано, что ХукПроцесс должен быть в в длл. Ну много там, как всегда, не пишут.
Александр
Re: Уточняю
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 20.03.02 15:31
Оценка:
Забыл добавить еще кое-что.

— Под 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' Blog
http://kmint21.info/ru/
Re: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: Sergey Россия  
Дата: 20.03.02 15:47
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 20.03.02 15:55
Оценка:
S> Вот в этом-то и дело. Запихай в Dll и не парься.

Не могу. Если я не говорил — скажу. Я должен подредактировать чужой исходник. Пользуется этим продуктом большое число людей. Не видел я поминания о том, работает ли "оно" под НТ.
.. короче говоря не могу..
Может просто в ресурсы DLL-ку впихнуть? Ну все равно морока есть..

S> Потому что винда не могет твою exe загрузить.

Ну потому что без DLL-ной точки входа? Так может добавить?
Попробую...


S> Это просто ошибка в Win95, не иначе.

???? :)))
Мда...


" — фиг получится. А ведь это именно то, что винде приходится делать при установке хука."

Ок, попробую точку входа добавить еще одну.
KMiNT21' Blog
http://kmint21.info/ru/
Re[3]: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: Sergey Россия  
Дата: 20.03.02 16:15
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 20.03.02 16:26
Оценка:
S> Что такое DLL-ная точка входа? AddressOfEntryPoint — просто DWORD по смещению 16 в Optional Header. Дело скорее в поле Characteristics из IMAGE_FILE_HEADER.

:)))))))

Да нет же, не об этом речь.

Короче разберись с функциями
_DllMainCRTStartup, _WinMain, _main

и вообще как работает RTL

Вот моя статья (громко сказано)
www.uinc.ru/articles/28

И тут где-то я встречал более полную.

:)
KMiNT21' Blog
http://kmint21.info/ru/
Re[5]: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: Sergey Россия  
Дата: 20.03.02 16:51
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 21.03.02 08:00
Оценка:
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 файлах не бывает более одной точки входа. "

Ну тут я подразумевал другое немножко. См. ИДУ:

File Edit Navigate View Options Windows ↓ AU:▒░idle░▒ WAITING 09:55:37
╔═[■]════════ Choose an entry point ══════3═[↑]═╗════════════════════════2═[↑]═╗
║ Name Address # ▲ ; __wincmdln+F↑r ... ▲
║ keyproc(int,uint,long) 00401032 1 ■ ▒
║ start 004031B0 ▒ ▒
║ ▼ ▒
╚1/2 ◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘ ▒
KMiNT21' Blog
http://kmint21.info/ru/
Re[7]: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: Sergey Россия  
Дата: 21.03.02 09:11
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[8]: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: KMiNT21 Украина http://kmint21.info/ru/
Дата: 21.03.02 09:34
Оценка:
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?"
Да нет, конечно.. ладно, не в том дело.

Скажи вот лучше что-нибудь на эту мысль —

http://www.bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=41285
KMiNT21' Blog
http://kmint21.info/ru/
Re[9]: W2k, SetWindowsHookEx(WH_KEYBOARD..). Сбр-йся хук.
От: Sergey Россия  
Дата: 21.03.02 09:58
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.