Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
#1

Глобальный хук. Довести до ума - C++

04.09.2009, 16:37. Просмотров 1479. Ответов 6
Метки нет (Все метки)

Здравствуйте, решил изучить механизмы хуков, почитал статьи. Появились вопросы.
Вот собственно если делать глобальный хук, то функцию нужно совать в ДЛЛ. Нужно ли ее потом как-то специально загружать? Или как она ко всем процессам пристанет?
Потом, как влияет на это #pragma data_seg что оно делаем в этом случае? А так же #pragma comment(linker, "/section:.ИМЯ,rws")

Точнее я прочил, что эти операции делают и как работают, но не пойму, как они работают в этом случае вообще. Толку что они будут в секции READ WRITE SHARED?
Вроде пока все. Вот код который есть.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream.h>
#include "GH.h"
 
HHOOK hook;
HINSTANCE hin;
 
int APIENTRY DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH :
            hin = hInstance ;
            break ;
    }  
    return TRUE ;
}
 
 
extern "C" __declspec(dllexport) void Pr()
{
    cout<<"Works"<<endl;
}
 
extern "C" __declspec(dllexport) bool TurnON()
{
    cout<<"Hook ON"<<endl;
    hook = SetWindowsHookEx(WH_CALLWNDPROC, HookProc,hin, NULL);
    return true;
}
 
LRESULT CALLBACK HookProc( int nCode, WPARAM wParam,LPARAM lParam)
{
    if( nCode == HC_ACTION )
        cout<<"Action"<<endl;
    return CallNextHookEx(hook, nCode, wParam, lParam);
}
и

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <windows.h>
#include <iostream.h>
#include <conio.h>
 
bool(*F)();
int main()
{
    HINSTANCE h;
 
    h = LoadLibrary("GH.dll");
    if( h != NULL )
        cout<<"Loaded"<<endl;
    else
    {
        cout<<"Cannot load"<<endl;
        exit(0);
    }
 
    F = (bool (*)())GetProcAddress(h, "TurnON");
    F();
    getch();
    FreeLibrary(h);
    return 0;
}
Пока не работает ничего.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
05.09.2009, 22:18  [ТС]     Глобальный хук. Довести до ума #2
Хорошо, поискав еще статей я доделал рабочий вариант. Но все же остались вопросы.
1)Почему при хуке на GETMESSAGE посылая сообщение PostMessage если слать на хэндл окна к которому присоединился процесс, то проц на 99%.(Проверял в QIP в Окне сообщений, полагаю, что оно не предусматривает нажатие кнопки и поэтому тупит). Если же посылать сообщение тому хендлу, который получен из структуры MSG, то все посылается, но зацикливается почему-то. Пробовал сразу же слать WM_KEYUP, но это ничего не дало.
2)Возвращаясь к read write shared секциям, как они влияют на то, что эта ДЛЛ внедряется во все процессы?
Alexandoros
227 / 65 / 4
Регистрация: 02.06.2009
Сообщений: 280
16.09.2009, 13:46     Глобальный хук. Довести до ума #3
Если ставиш хук через SetWindowsHook то загружать его спецом не нужно, винда сама подгрузит длл во все процессы, которые стригерят этот хук.

#pragma comment(linker, "/section:.ИМЯ,rws") - ты объявляеш эту секцию даных шаровой. Это значит , что содержащиеся там даные будут одинаковы для всех процессов. По умолчанию каждые даные в длл уникальны для своего процесса. В шаред секции все процессы юзают одну и ту же физическую область памяти. Поэтому доступ к таким даным должен быть ограничен мутексом.

По поводу 99% - это твой косяк в коде где то.
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
16.09.2009, 17:28  [ТС]     Глобальный хук. Довести до ума #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LRESULT CALLBACK HookProc( int nCode, WPARAM wParam,LPARAM lParam)
{
    MSG * st = (MSG*)lParam;
    if( nCode == HC_ACTION )
        if( st->message== WM_KEYDOWN )
        {
            st->wParam = 0x42;
            //PostMessage(st->hwnd, st->message, (WPARAM)0x42, (LPARAM)st->lParam); 
            //PostMessage(st->hwnd, WM_KEYUP, (WPARAM)0x42, (LPARAM)st->lParam); 
        }
    else
    {
        //MessageBox(NULL, "BAD", "ON", 0);
        return CallNextHookEx(hook, nCode, wParam, lParam);
    }
    return CallNextHookEx(hook, nCode, wParam, lParam);
}
Если менять значение, все отлично, а если постить новое сообщение, то грузит проц.

Так я и спрашиваю, как так, что Винда эту ДЛЛ во все процессы подгружает? Это так со всеми ДЛЛ?
Alexandoros
227 / 65 / 4
Регистрация: 02.06.2009
Сообщений: 280
16.09.2009, 18:19     Глобальный хук. Довести до ума #5
Если менять значение, все отлично, а если постить новое сообщение, то грузит проц.
Ну а че б и не?
1)Пришла месага,
2)сработал хук
3) Хук вызвал Постмесадж
4) Готу 1)

Так я и спрашиваю, как так, что Винда эту ДЛЛ во все процессы подгружает?
Так я и отвечаю, хук срабатывает, длл подгружается.
Это так со всеми ДЛЛ?
Так это как?
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
16.09.2009, 19:55  [ТС]     Глобальный хук. Довести до ума #6
Да зациклил я(( Спасибо.

Если хук включать внутри программы, то он только на 1 процесс работает.
А если из ДЛЛ, то ДЛЛ подгружается во все процессы и ловит все сообщения. Почему это происходит именно из ДЛЛ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2009, 12:02     Глобальный хук. Довести до ума
Еще ссылки по теме:

Не могу довести до ума, не хватает функции C++
в чем ошибка,как довести до ума C++
C++ Глобальный хук клавиатуры
Глобальный хук клавиатуры (windows) C++ WinAPI

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Alexandoros
227 / 65 / 4
Регистрация: 02.06.2009
Сообщений: 280
17.09.2009, 12:02     Глобальный хук. Довести до ума #7
Почему это происходит именно из ДЛЛ?
Потому что ехе модуль не длл, и нельзя быть уверенным в том что его можно подгрузить в чужой процесс и правильно выполнить инициализацию.
Yandex
Объявления
17.09.2009, 12:02     Глобальный хук. Довести до ума
Ответ Создать тему
Опции темы

Текущее время: 21:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru