Страница: 1 | 2 |
Вопрос: Хук
Добавлено: 23.01.05 21:18
Автор вопроса: CyRax | Web-сайт:
Нужно ловить сообщения окна чужого процесса. Киньте ссылку или пример. Или это можно сделать через SetWindowLong?
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 23.01.05 21:40
Вероятно мне нужен SetWindowsHookEx с идентификатором WH_CALLWNDPROC (или WH_CALLWNDPROCRET). Есть пример у кого?
Номер ответа: 2
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #2
Добавлено: 23.01.05 22:04
Есть только с WH_MOUSE и тот на асме. Насколько я знаю, WH_CALLWNDPROC немного отличается от WH_MOUSE. Dll, в которой реализуется хук, надо внедрять в адресное пространство чужого процесса. И компилится она со специфичными ключами (где-то был батник).
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 23.01.05 22:36
http://clifftown.narod.ru/HDK/HDK21.zip
Номер ответа: 4
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #4
Добавлено: 24.01.05 04:18
По этой ссылке Опера грузит пустой архив, а ИЕ выдаёт ошибку.
Ещё вопрос.
Не буду томить, это связано с аддоном для PB IDE. Нужно ловить показ файлового диалога и активацию MDI-child окон.
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 24.01.05 04:24
Два дня не вылазил из OllyDbg в поисках способа извлечения текста из редактора. Остальное - дело техники. Ловить нажатие клавишь "точка", "пробел", "скобки", "Ввод" и перегружать инклюды при соответствующих событиях.
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 24.01.05 04:31
надо внедрять в адресное пространство чужого процесса.
Я и сам подумывал насчёт использования CreateRemoteThread, но никогда с последним не работал и не знаю какие подводные камни могут меня ожидать.
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 24.01.05 07:18
Хм, прикол получился. Запускаю прогу, состоящую единственно из вызова хука клавы в DLL.
После этого прога завершается, а DLL-ка c хуком остаётся. И ни задачник ни TaskInfo её не видят (во всяком случае в Windows'98).
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 24.01.05 10:46
Вероятно используют др. процессы...
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 24.01.05 10:55
Но вообще странно. Экзешник на ПБ и ДЛЛ-ка тоже на ПБ. По идее она должна грузиться в тот же процесс. А на деле чёрт знает что получается. Прога вызывает функцию из DLL, которая в свою очередь вызывает CallBack-функцию при помощи SetWindowsHook.
Function PbMain
 llHook
End Function
Function DllHook Alias"llHook") Export As Long
...
End Function
Номер ответа: 10
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #10
Добавлено: 24.01.05 12:21
\masm32\bin\ml /c /coff /Cp C:\masm32\RadASM\Masm\Projects\VBScroll\MHook\MHook.asm
\masm32\bin\Link /SECTION:.bss,S /DLL /DEF:mhook.def /SUBSYSTEM:WINDOWS /LIBPATH:\masm32\lib mhook.obj
pause
Это бат. Для линкера нужно указать разделяемые секции. SECTION:.bss,S, чтобы можно было соваться в чужой процесс.
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 24.01.05 17:52
Думаю что обойдусь клавиатурной ловушкой. Если будут сложности тогда уже буду пробовать другие варианты.
Номер ответа: 12
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #12
Добавлено: 26.01.05 05:07
Глобальные переменные обнуляются. Что делать? Может в реестре сохранять?
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 26.01.05 08:52
Оказалось что ловушка работает в процессе-цели. Пока решил проблему так:
Sub KeyPressed(ByVal wParam As Dword, ByVal lParam As Dword)
Static hWnd_Local_PBWIN32MAIN As Long
Dim ProcessID As Long, ProcessID2 As Long, hThread_Main As Long
MsgBox Hex$(hWnd_Local_PBWIN32MAIN),,Str$(hWnd_Local_PBWIN32MAIN)
If hWnd_Local_PBWIN32MAIN=0 Then
ProcessID=GetCurrentProcessId()
Do
hWnd_Local_PBWIN32MAIN = FindWindowEx(0&,hWnd_Local_PBWIN32MAIN,"PBWIN32MAIN",ByVal 0&
hThread_Main = GetWindowThreadProcessId(hWnd_Local_PBWIN32MAIN, ProcessID2)
If ProcessID=ProcessID2 Then Exit Do
Loop
End If
End Sub
Function KeyboardProc Alias"KeyboardProc"ByVal nCode As Integer, ByVal wParam As Dword, ByVal lParam As Dword) Export As Long
If (lParam And &B10000000000000000000000000000000)=&B10000000000000000000000000000000 Then
STDOUT Bin$(lParam And &B10000000000000000000000000000000) & " / " & Str$(Len(Bin$(lParam And &B10000000000000000000000000000000)))
ElseIf (lParam And &B01000000000000000000000000000000)=&B01000000000000000000000000000000 Then
STDOUT Str$(wParam) &" = " & Chr$(wParam)
KeyPressed wParam, lParam
End If
Function = CallNextHookEx(hhook, nCode, wParam, ByVal lParam)
End Function
Function StartHoook Alias"StartHoook"ByVal lThreadID As Long, ByVal hWnd_MAIN As Long) Export As Long
'hWnd_MDI=FindWindowEx(hWnd_MAIN,0&,"MDIClient",ByVal 0&
hhook = SetWindowsHookEx(%WH_KEYBOARD, CodePtr(KeyboardProc), hWndDLL, lThreadID)
End Function
Правда мне не нравится что в процедуре KeyPressed приходится при каждом вызове проверять hWnd_Local_PBWIN32MAIN на нулевое значение, хотя проверка эта нужна только при первом вызове.
Номер ответа: 14
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #14
Добавлено: 30.01.05 05:00
Какой ужас! Ты уверен, что это нельзя записать по другому?
Номер ответа: 15
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #15
Добавлено: 30.01.05 08:19
Да, я и написал по другому
If (lParam And &H80000000) = &H80000000 Then
Мне просто понравилась поддержка двоичного типа записи в PB когда я программировал поддержку сопроцессора в Local Assembler.
Кстати такое условие не срабатывает для беззнаковых типов. Нужно добавлять идентификатор типа.
PS: Можно ещё через BT сделать, но здесь по моему это несущественно.