Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
9-11759
Madromik
2003-06-11 14:19
2004.01.05
Image move


4-12220
Senator
2003-11-05 12:04
2004.01.05
путь


14-12145
Death2
2003-12-11 10:53
2004.01.05
Не работает InternetCheckConnection


14-12037
Undert
2003-12-11 11:12
2004.01.05
SQL: Как узнать запросом, какой был последний AutoInc ?


3-11838
Tornado
2003-12-08 09:10
2004.01.05
Существует ли таблица?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский