Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.05;
Скачать: CL | DM;

Вниз

Global HOOK без DLL.. Это как? Или вообще ни хук?   Найти похожие ветки 

 
Dima_dvp   (2003-10-23 03:38) [0]

Вот я тут наткнулся на задачу отловить создание окон(всех окон верхнего уровня всех процессов). Так вот конечно же первым делом в SDK - а там говорят надо DLL. Ну сделал для теста сначала HOOK для мыши, клавиатуры, а потом было начал делать для CBT_ как вспомнил что есть у меня програмка (даже две и обе без исходников) которые ловят появляющиеся окна и без всяких DLL. Програмка первая была написана наверное очень давно, потому что там есть строка by Windows 95. Но несмотря на это работает во всех мною опробованных Виндах. И как же это они делают?
Делать Хук всякое желание отпало. Чую там решение более быстрое (в плане производительности), а то это через Hook мой пойдёт чуть ли не треть всех сообщений. Расскажите кто чё знает. А программку если не верите выслать могу.


 
Dima_dvp   (2003-10-23 03:41) [1]

Или может создатели этих программ на самом деле тупые и сделали SetTimer....
Как бы это проверить, наверняка?
Дизассемблировал. SetTimer есть, но это ещё ничего не значит - там и все GDI ф-ии есть а программа ничего вроде не рисует. Да и доверия у меня компилятору Delphi нет - он чё только не суёт в программы.


 
Vlad Oshin ©   (2003-10-23 10:32) [2]

просто тот код приведи

> А программку если не верите выслать могу.


про хуки на сайте статья была, рекомендую, с примерами


 
NightAngel ©   (2003-10-23 14:55) [3]

Вот этот код вроде-бы работать не должен, т.к. он пытается поставить локальный хук на поток другого процесса! Т.е. хук срабатывает в удаленом процессе, а хуковая функция находится в этом коде, но... он работает.


#include <windows.h>

HHOOK HookH;

long __stdcall MsgProc(int code,UINT wParam, long lParam)
{
if (code==HC_ACTION)
{
if(((MSG*)lParam)->message==WM_USER+50)
{
MessageBox(0,"Yes!","Thats works",MB_OK);
}
}
return CallNextHookEx(HookH, code, wParam, lParam);
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND HandleOfBrows = FindWindow(NULL, "EFDOK");
DWORD ThreadOfEx = GetWindowThreadProcessId(HandleOfBrows,NULL);
HookH = SetWindowsHookEx(WH_GETMESSAGE,&MsgProc,GetModuleHandle(0),ThreadOfEx);
PostMessage(HandleOfBrows,WM_USER+50,0,0);
Sleep(10);
UnhookWindowsHookEx(HookH);
return 0;
}


Работает он, только если при сборке exe"шника принудительно добавить таблицу релокейшенов, прописав в настройках линкера /FIXED:NO, и собрав релиз версию. Этот трюк срабатывает только в Win9x. Я думаю, работает это потому, что когда срабатывает хук в удаленном процессе, система должна загрузить туда модуль, в котором находится хуковая функция. Т.к. в этом процессе стандартный адрес 400000h (по умолчанию все exe"шники грузятся с этого image base) уже занят, то модулю с хуковой функцией нужно делать настройку адресов. Если это DLL, то релокейшены там есть по умолчанию. Если exe, то их обычно нет - это делается из соображений оптимизации (линкер их обычно "отрезает" - это уменьшает размер exe"шника). Можно заставить этот код работать и в Win2000 - нужно сделать код хуковой функции базонезависимым. Независимость я думаю нужна потому, что при загрузке модуля в другой процесс настройка адресов не производится. Интересно что, для того, чтобы заставить систему загрузить exe в удаленный процесс, нужны релокейшены, а настройка адресов при этом не производится! Что это: баг или фича, я не знаю. Если баг, то тогда должна вызываться точка входа exe"шника в удаленном процессе как если бы это была DllMain, но этого не происходит. Если это фича, то тогда почему не производится настройка адресов? Как это будет работать на других системах я не знаю. Детально разбираться в этом, у меня времени нет, да и практического применения не вижу. Кому интересно, попробуйте проверить на WinNT/XP.

> Вот я тут наткнулся на задачу отловить создание окон(всех окон верхнего уровня всех процессов).

Под Win9x это несложно сделать без всяких хуков. Пробемы будут только с WinNT/2000/XP, хотя и там это решаемо.


 
DVM ©   (2003-10-23 18:37) [4]

RegisterShellHookWindow() тебе поможет. DLL в данном случае не нужна. Потому как все нужные для работы оболочки хуки уже стоят в shell.dll и shell32.dll. На MSDN есть скудная инфа по этой теме.


 
Dima_dvp   (2003-10-23 21:19) [5]

> Vlad Oshin © (23.10.03 10:32) [2]
> просто тот код приведи
>
> > А программку если не верите выслать могу.
>
>
> про хуки на сайте статья была, рекомендую, с примерами


Да уж. Статья была, да ещё к тому же штук 100:)
Но мне-то как раз с хуками всё понятно, мне не понятно чем пользуются эти программы.


> DVM © (23.10.03 18:37) [4]
> RegisterShellHookWindow() тебе поможет.


Я щас посмотрю на MSDN, но в этой программе которая у меня в списке импорта нет такой ф-ии точно


 
Dima_dvp   (2003-10-23 21:29) [6]

Кстати, эта задача навеяна жеданием упаковать всю программку в один файл, но ведь есть ещё одно неэлегантное решение: можно жн сохранить DLL в ресурсах и при первом запуске кинуть её напирмер в system.
Но это подло по отношению к пользователям, которые желают(обычно) иметь полное представление о том, что и где программа сохранила(хотя они всё равно этого не заметят).


 
Dima_dvp   (2003-10-23 21:34) [7]

to DVM ©:
В точку. Ф-ия именно для этого,но только win2k+


 
Dima_dvp   (2003-10-23 21:35) [8]

to DVM ©:
и инфа действительно скудная, но где наша не пропадала.


 
jonni ©   (2003-10-23 22:31) [9]

to Dima_dvp
-----------
В точку. Ф-ия именно для этого,но только win2k+
----------

oy ne obmanivay
Procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall; external "shell32.dll" index 181;

vo vseh vindah ona est"


 
Dima_dvp   (2003-10-23 22:52) [10]

to jonni:

Эта ф-ия числиться как устаревшая(и не win32 а win32s) и поэтому в SDK говориться что она не может быть использована


 
jonni ©   (2003-10-23 23:59) [11]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookre ference/hookfunctions/registershellhookwindow.asp

eta funkciya est" i v WinXp i v win2003 server...

i vo vseh versiyah do... esli tebya eto ne ustraivaet to tebe odna doroga v HOOK bol"she nikak


 
Dima_dvp   (2003-10-24 00:13) [12]

Jonni: спасибо на этом. Я в принципе не против использывать ф-ии, которые в SDK как OLD, но спешить не буду - поищу сначала решение почище.
А в Hook тоже нельзя - он DLL просит - а мне не надо это.
Я вот как DVM сказал попробую


 
Dima_dvp   (2003-10-24 01:48) [13]

to DVM
RegisterShellHookWindow() мне помог.
Но в статье MSDN написано и о DeregisterShellHookWindow(), а в Shell32 её нет. Чё за дела???


 
Dima_dvp   (2003-10-24 01:50) [14]

Вообще подкиньте кто-нибудь люди добрые что-нибудь что смотреть какие есть в DLL ф-ии.

Заранее благодарен


 
Dima_dvp   (2003-10-24 04:06) [15]

Что -то у меня ничего не получается........

Как всё-таки поймать создание окна вообще хтоь с ДЛЛ, хоть без неё?????

Пытался через HW_SHELL, но только систему повесил пару раз, хотя тот же код, но с HW_MOUSE работает на урура.....

Почитал SDK а там вот что:

Note that custom shell applications do not receive WH_SHELL messages. Therefore, any application that registers itself as the default shell must call the SystemParametersInfo function with SPI_SETMINIMIZEDMETRICS before it (or any other application) can receive WH_SHELL messages.

Причём тут размер свёрнутого окна я так и не понял..... Опечатка или я тупой????

Объясните люди добрые....

PS Прикольнитесь как эту заметру перевёл http://translate.ru

Отметьте, что таможенные заявления снаряда не получают сообщения WH_SHELL. Поэтому, любое заявление, которое регистрирует себя как снаряд по умолчанию, должно назвать функцию SystemParametersInfo с SPI_SETMINIMIZEDMETRICS прежде, чем это (или любое другое заявление) может получить сообщения WH_SHELL.


 
DVM ©   (2003-10-24 17:10) [16]


> Эта ф-ия числиться как устаревшая(и не win32 а win32s) и
> поэтому в SDK говориться что она не может быть использована

Она не может устареть, пока ей пользуется Explorer.


 
jonni ©   (2003-10-24 21:36) [17]

Dima_dvp (24.10.03 01:48) [13]
to DVM
RegisterShellHookWindow() мне помог.
Но в статье MSDN написано и о DeregisterShellHookWindow(), а в Shell32 её нет. Чё за дела???

jonni © (23.10.03 22:31) [9]
to Dima_dvp
-----------
В точку. Ф-ия именно для этого,но только win2k+
----------

oy ne obmanivay
Procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall; external "shell32.dll" index 181;

vo vseh vindah ona est"
--------------------------------------------------------
kak eto netu????
vot zhe tebe gotoviy primet opisaniya funkcii beri i pol"zuysya..
vse rabotaet na ura i dazhe bez dll


 
Dima_dvp ©   (2003-10-25 00:47) [18]

Спасибо - понял.
Я по имени пытался достать её, индекса я же не знал. Теперь она есть. Буду пробывать.

Ещё раз спасибо


 
Dima_dvp ©   (2003-10-25 01:22) [19]

А к DeregisterShellHookWindow индекс не скажите? или хоть где его узнать....


 
Dima_dvp ©   (2003-10-25 01:37) [20]

и кстати в SDK вот так
BOOL RegisterShellHookWindow(HWND hWnd);
а второго параметра вроди как нет.
Или я может чего не понимаю, но мне кажеться, что вы (jonni) умны. Это вы хотите сказать, что n это будет тот самый BOOL который должна возвращать ф-ия. Т.е. это значит что при stdcall результат исполнения ф-ии лежит в стеке в самом низу и что нет разницы запросить его как последний параметр или как результат. Я прав или я глуп?



Страницы: 1 вся ветка

Текущий архив: 2004.01.05;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
7-12170
Vlad25
2003-10-26 13:10
2004.01.05
Как связать программу с определенным типом файлов?


1-11874
Berezne
2003-12-18 12:56
2004.01.05
Округление результата


14-12152
}|{yk
2003-12-12 15:42
2004.01.05
Кто получит Золотой мяч?


6-12027
TUser
2003-11-05 15:03
2004.01.05
IEGrabber


7-12185
Шустрый
2003-10-24 18:05
2004.01.05
Путь до папки