Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отлов событий другого приложения через хуки 
:(
    Опции темы
MANAB
Дата 15.11.2010, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Хочу сделать так, чтобы моя программа могла отловить факт нажатий кнопок другой конкретной уже запущенной программы.

Делаю длл, в ней вызываю функцию, которая находит окно нужной мне программы, получает ее ThreadId и ставит хук:

Код

void Init( )
{
    USES_CONVERSION;

    //find PokerStars window
    WCHAR wWindowName[256];
    size_t pos = 0;

    HWND hWndF = GetTopWindow( NULL );
    GetWindowText( hWndF, wWindowName, 256 );
    if ( ( pos = string( W2A( wWindowName ) ).find( "MyTestProgram" ) ) == string::npos )
    {
        while ( hWndF != NULL )
        {
            hWndF = GetNextWindow( hWndF, GW_HWNDNEXT );
            GetWindowText( hWndF, wWindowName, 256 );
            if ( ( pos = string( W2A( wWindowName ) ).find( "MyTestProgram" ) ) != string::npos )
                break;
        }
    }

    g_hPokerMainWnd = hWndF;

    //get process id
    DWORD dwThreadID;
    DWORD dwProcessID;
    dwThreadID = GetWindowThreadProcessId( g_hPokerMainWnd, &dwProcessID );

    //create hook
    g_hhook = SetWindowsHookEx( WH_MSGFILTER, &HookProc, (HINSTANCE)g_hMod, dwThreadID );
}


Проверял g_hhook - не NULL.

Обработчик
Код

LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam )
{
    MessageBox( NULL, L"", L"", MB_OK );

    return CallNextHookEx( g_hhook, nCode, wParam, lParam );
}

эмоций никаких не проявил.
Как я ни извращался, какие idHook ни ставил - молчит как партизан.  smile 

Где я ступил? smile 


Это сообщение отредактировал(а) MANAB - 15.11.2010, 03:31
PM MAIL ICQ   Вверх
ASMatic
Дата 15.11.2010, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

Репутация: 1
Всего: 1



видимо не задумывались - PokerStars вполне возможно защиту сделала от таких как выsmile
попробуйте свой код натравить на блокнот...

если действительно защита, скорей всего от хуков - тогда вам надо будет подгрузить длл в покерстарз и там уже сабклассить ихнее окно.
я бы так изначально делал, темболее если на локальном компе - AppInitDlls неплохо помогает вместе с проверкой в дллмеин имени процесса.
PM MAIL   Вверх
MANAB
Дата 15.11.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Я тоже сначала так подумал, но перед тем как создать тему быстренько создал форму с парой кнопочек и обработчиками для них, чтобы проверить. Тоже не отлавливает. smile 

Это сообщение отредактировал(а) MANAB - 15.11.2010, 11:19
PM MAIL ICQ   Вверх
bass
Дата 15.11.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



надеюсь весь код который ты предоставил находиться в длл.......
После установки хука глянь процесс-експлорером или отладчиком в процессе присутствует длл??????
А вообще насколько помню в хук надо хандл процесса кидать .........
Посмотри функцию опенпроцес(на английском).
 dwThreadID = GetWindowThreadProcessId( g_hPokerMainWnd, &dwProcessID );
Далее опен процесс с флагом для всего и вот это dwProcessID..... и хандл в хук.....

Добавлено через 1 минуту и 45 секунд
Да и что ты мучаешься перебирая все окна findwindow на что тебе.....
PM MAIL   Вверх
GremlinProg
Дата 15.11.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(bass @  15.11.2010,  13:31 Найти цитируемый пост)
А вообще насколько помню в хук надо хандл процесса кидать .........Посмотри функцию опенпроцес(на английском).

нет - идентификатор потока:
Цитата(SetWindowsHookEx Function @  MSDN)

dwThreadId
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. 

g_hMod - HMODULE загруженной библиотеки?
Цитата(SetWindowsHookEx Function @  MSDN)

hMod
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. 



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
bass
Дата 15.11.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Цитата(GremlinProg @ 15.11.2010,  11:41)
Цитата(bass @  15.11.2010,  13:31 Найти цитируемый пост)
А вообще насколько помню в хук надо хандл процесса кидать .........Посмотри функцию опенпроцес(на английском).

нет - идентификатор потока:
Цитата(SetWindowsHookEx Function @  MSDN)

dwThreadId
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. 

g_hMod - HMODULE загруженной библиотеки?
Цитата(SetWindowsHookEx Function @  MSDN)

hMod
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. 

Приношу извинения я еще не выспался....
PM MAIL   Вверх
MANAB
Дата 15.11.2010, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



g_hMod - да, это хендл загруженной библиотеки:
Код

HANDLE g_hMod;
HHOOK g_hhook;



BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
    g_hMod = hModule;

    return TRUE;
}

И да, весь код находится внутри Dll, я просто вызываю в своей программе одну функцию Init, которая все это счастье запускает.
PM MAIL ICQ   Вверх
GremlinProg
Дата 15.11.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



а если сменить тип хука, например на WH_GETMESSAGE?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MANAB
Дата 15.11.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Цитата(bass @  15.11.2010,  11:31 Найти цитируемый пост)
После установки хука глянь процесс-експлорером или отладчиком в процессе присутствует длл??????

Проверил, присутствует.

Добавлено через 1 минуту и 56 секунд
Цитата(GremlinProg @  15.11.2010,  12:32 Найти цитируемый пост)
а если сменить тип хука, например на WH_GETMESSAGE? 

Вообще все idHook проверил, ничего.

Добавлено через 7 минут и 42 секунды
Поставил глобальный хук (без dwThreadID) - вроде реагирует. Вроде - потому что скажем для мышки - не все нажатия почему-то перехватываются...
Попробую на другом компе с XP, может это все из-за того, что у меня Windows 7 64-битная.
PM MAIL ICQ   Вверх
MANAB
Дата 15.11.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



Хм... Там тоже самое.
Что странно, глобальный хук вроде ставлю на клавиатуру:
Код

g_hhook = SetWindowsHookEx( WH_KEYBOARD, &HookProc, (HINSTANCE)g_hMod, 0 );


а нажатия клавиш не отлавливаются  smile 
PM MAIL ICQ   Вверх
GremlinProg
Дата 15.11.2010, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(MANAB @  15.11.2010,  14:39 Найти цитируемый пост)
64-битная

а хук 32-х, или приложение 32-х, а хук 64-х?

вобщем битность у приемника и перхватчика должна совпадать, у нас уже была дискуссия на эту тему

Добавлено через 5 минут и 8 секунд
Цитата(SetWindowsHookEx Function @  MSDN)

SetWindowsHookEx can be used to inject a DLL into another process. A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process. If an application requires the use of hooks in other processes, it is required that a 32-bit application call SetWindowsHookEx to inject a 32-bit DLL into 32-bit processes, and a 64-bit application call SetWindowsHookEx to inject a 64-bit DLL into 64-bit processes. The 32-bit and 64-bit DLLs must have different names. 



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MANAB
Дата 15.11.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



И хук и приложение 32х битные. На Windows XP тоже самое все, проверял.
PM MAIL ICQ   Вверх
bass
Дата 15.11.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Странооо ........  Воббще должно может не тот HWND находить поставь логирование......... 
И попробуй findwindow......
Вообще я использую замену Windowproc ..... Injekt.... Если что кодом могу помоч.....

Добавлено @ 20:45
WH_KEYBOARD Может работать в своем процессе.............


Это сообщение отредактировал(а) bass - 15.11.2010, 20:46
PM MAIL   Вверх
MANAB
Дата 15.11.2010, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 17.5.2009
Где: Беларусь, Минск

Репутация: нет
Всего: нет



bass, если можешь помочь с инъекцией - буду очень признателен. Я читал про нее, но еще не разобрался. Знаю только что там 3 способа есть, и один из них через хуки.
PM MAIL ICQ   Вверх
bass
Дата 16.11.2010, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



Лови рабочий проект на билдоре.......
унит1 сам исходный текст Требуемая библиотека псапи.... Если что либу для билдора могу кинуть......
Смотри у меня инжект вызывает еще и функцию... Сначало енжектит потом идет вызов функции и выход из потока если он вернеться.......
Без функции процес рухнет........ проджект 1 готовый ехе но может библиотек нехватить не помню как компилятор выставил(Если что  кину)....
И если будешь на студии компелить поставь однобайтовое выравнивание иначе процес жертва ружиться....
Вопросы возниктнут звони -))))))

Добавлено через 8 минут и 49 секунд
Способов больше .......
Вот какие я знаю.......
1. как я скинул через кретеремотетшреад.
2. через реестр только длл погрузиться во все процессы где есть библиотека усер32.
3ю через хуки.
4ю написание подложки со всеми экспортируемыми функциями,  и переименование длл.
5ю изменение кода родной длл чтоб подгружалась твоя даже проги спец есть(встречал щас не вспомню как назваються)... Но я делаю через отладчик...

Раньше через сенд мессге можно было но сеЙчас лавочку прикрыли..... с вм_таймер ......
 smile  Так что както так .....
В винлогон тоже через реестр можно попасть.....
А чтоб подменить винпрок используй setwindowlong насколько помню......
С уважением Игорь.
  

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  test.rar 211,84 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.