Сейчас на форуме: bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Проблема с хуком мыши
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 07 февраля 2011 18:31
· Личное сообщение · #1

На тему хуков масса примеров, я пробовал перехватывать WH_MOUSE и WH_MOUSE_LL. Код в DLL. Хук включаю из delphi формы на которой несколько кнопок. Цель в примере при клике на одну из кнопок с помощью хука менять координаты клика и попадать в другую кнопку. Интересует именно подмена координат при клике, а не фактическое попадание в какой либо элемент.
Делал так:
Code:
  1. function MouseClick(Code: Integer; wParam, lParam: Longint):Longint; stdcall;
  2. begin
  3. if (wParam>=$201) and (wParam<=$203) then lParam:=MAKELPARAM(190,420));
  4. Result:=CallNextHookEx(HookID, Code, wParam, lParam);
  5. end;
  6.  
  7. HookID:=SetWindowsHookEx(WH_MOUSE, MouseClick, 0, GetCurrentThreadId());


и так:
Code:
  1. function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
  2. begin
  3.   if (Code = HC_ACTION) then begin
  4.     if (wParam =  WM_LBUTTONDOWN) then Result:= CallNextHookEx(HookID, Code, wParam, makelparam(190,420))
  5.     else
  6.     if (wParam =  WM_LBUTTONUP) then Result := CallNextHookEx(HookID, Code, wParam, makelparam(190,420));
  7.   end else Result := CallNextHookEx(HookID, Code, wParam, lParam);
  8. end;
  9.  
  10. HookID:= SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);


В общем блокировать клики могу, а подменять координаты нет. В чём моя ошибка?



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 07 февраля 2011 21:14
· Личное сообщение · #2

По мойму этими хуками переполнен инет. Реализуйте в ядре, максимально высокий уровень абстрагирования это захват RIT(ниже шадова идут IRP etc.).




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 08 февраля 2011 00:29
· Личное сообщение · #3

Clerk пишет:
По мойму этими хуками переполнен инет.


Да, знаю, пробовал многое, но толку нету...

Даже такой вариант не даёт результата. Клик приходит на контрол на котором его делаю...
Code:
  1. function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
  2. type
  3.     MSLLHOOKSTRUCT  = record
  4.         pt          : TPoint;
  5.         mouseData   : DWORD;
  6.         flags       : DWORD;
  7.         time        : DWORD;
  8.         dwExtraInfo : DWORD;
  9.     end;
  10.     PMSLLHOOKSTRUCT = ^MSLLHOOKSTRUCT;
  11. begin
  12.   if (Code = HC_ACTION) then
  13.   begin
  14.     if (wParam =  WM_LBUTTONDOWN) then
  15.     begin
  16.       PMSLLHOOKSTRUCT(lParam).pt.X:=190;
  17.       PMSLLHOOKSTRUCT(lParam).pt.Y:=420;
  18.       Result:= CallNextHookEx(HookID, Code, wParam,lParam);
  19.     end else ....


Clerk пишет:
Реализуйте в ядре, максимально высокий уровень абстрагирования это захват RIT(ниже шадова идут IRP etc.).


К сожалению в этом не силён... Мне бы включать/выключать такую штуку передавая смещения для x и y. В принципе только это и нужно. Своего рода все клики с учётом калибровки.



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 08 февраля 2011 07:55 · Поправил: ELF_7719116
· Личное сообщение · #4

Помнится в user32 есть bool SetCursorPos(int x, int y);
Есть событие хука, по ходу дела можно использовать эту WinAPI и дрыгать мышкой.
А по поводу хука.
Result:= CallNextHookEx(HookID, Code, wParam,lParam);
После попробуй(хотя бы узнаеш в чем ошибка):
DWORD Error = GetLastError();



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 10 февраля 2011 14:15
· Личное сообщение · #5

Set/GetCursorPos
перехватить просто и всё

-----
продавец резиновых утёнков




Ранг: -0.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 12 февраля 2011 05:41
· Личное сообщение · #6

uote
Не поможет. События мыши могут доставляться через mouse_event, а если кликает пользователь а не программа, то черт знает как.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 20 февраля 2011 23:23
· Личное сообщение · #7

ToBad
В шадове Low-level фильтр я описал:
> В шадове обработка ввода от клавиатуры и мыши начинается в InputApc(), доставляемой асинхронно. Тут вызы
> ваются базовые диспетчеры ProcessKeyboardInput() и ProcessMouseInput(). APC завершается рекурсивно в Sta
> rtDeviceRead() -> NtReadFile(*InputApc). Диспетчеры описаны в описателях устройст ввода, это массив стру
> ктур DEVICE_TEMPLATE(userk.h & ntinput.c) которые содержат ссылки на диспетчеры. Сами описатели располож
> ены в секции данных Win32k. Оба диспетчера получают на вход структуру DEVICEINFO с сырым потоком данных.
> Установка кейлоггера заключается в загрузке ссылок на свои диспетчеры(необходимая инфа для реализации в
> DDK: ntddmou.h & ntddkbd.h). Переменная aDeviceTemplate может быть найдена через содержащиеся в ней ссыл
> ки, например на GUID: GUID_DEVINTERFACE_KEYBOARD/GUID_DEVINTERFACE_MOUSE.

Реализуется элементарно, проще даже чем винапишные хуки, но весьма эффективно - детекторы идут в топку
Ниже чтото фильтравать смысла нет. Вот псевдокод для реализации:
- Конвертим процесс в GUI для доступа к шадову в ядре вызвав любой теневой сервис, либо вручную сконвертировав тред в GUI. Также можно выполнить аттач к гуи-процессу(например тотже RIT выполняется в контексте csrss).
- Ищем описадель девайса. Для этого находим в пределах проекции строку и ссылку на неё.
- Загружаем в описатель ссылки на два наши менеджера(для потоков данных с клавы и мыши).
- Профит, аверы нервно жуют галстук


 eXeL@B —› Программирование —› Проблема с хуком мыши
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати