Blog. Just Blog

Защита кнопок формы от автокликеров

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из прошлых статей я писал об управлении другим приложением из своей программы, в частности о возможности эмулировать нажатия на кнопки. Ненадолго переберусь на другую сторону баррикады и расскажу о нехитром способе, которым можно отличить реальные нажатия на кнопки от эмулированных. Заключается он в том, что при обработке клика проверяются экранные координаты, где это событие произошло. Если они находятся в пределах границ кнопки, то все нормально, иначе клик считается эмулированным. Координаты события можно получить при помощи функции GetMessagePos.
  1. button_clicked:
  2.         ; Получить экранные координаты кнопки
  3.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON
  4.         invoke  GetWindowRect,eax,pt
  5.  
  6.         ; Получить координаты произошедшего события
  7.         invoke  GetMessagePos
  8.  
  9.         ; Выделить координату Y
  10.         mov     ebx,eax
  11.         shr     ebx,16
  12.         mov     [y],ebx
  13.  
  14.         ; Выделить координату X
  15.         mov     ebx,eax
  16.         and     ebx,0FFFFh
  17.         mov     [x],ebx
  18.  
  19.         ; Проверка, чтобы событие произошло в пределах кнопки
  20.         mov     eax,[y]
  21.         cmp     eax,[pt.top]
  22.         jb      clicked_by_robot
  23.         cmp     eax,[pt.bottom]
  24.         ja      clicked_by_robot
  25.  
  26.         mov     eax,[x]
  27.         cmp     eax,[pt.left]
  28.         jb      clicked_by_robot
  29.         cmp     eax,[pt.right]
  30.         ja      clicked_by_robot
  31.  
  32. clicked_by_human:
  33.         ; Кнопка нажата человеком
  34.         ...
  35.  
  36. clicked_by_robot:
  37.         ; Кнопка нажата автоматически
  38.         ...
Недостаток такого способа в том, что при работе с кнопками и полями формы с клавиатуры, координаты события все равно будут передаваться на основании положения курсора мыши. Эту проблему можно решить через субклассированный обработчик, в котором придется подавлять нажатия с клавиатуры. Ну и не забывайте о том, что никто не мешает так же программно передвинуть курсор на кнопку и "кликнуть" на ней, так что это защита только от самых простейших автокликеров. А адептам Темной стороны Силы будет полезно знать о такой возможности защиты, хотя на практике я ничего подобного не встречал.

В качестве более мирного использования функции GetMessagePos могу предложить обработку нажатия на элементы окна, которые в принципе не могут самостоятельно обрабатывать события. Например, функциями GDI можно нарисовать в окне какой-нибудь рисунок, текст или псевдоэлемент, а затем через обработчик родительского окна отслеживать клики на этом рисунке.

В приложении пример программы с исходным текстом, реализующей защищенную кнопку, и два автокликера, с помощью которых можно протестировать работу программы.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Protected.Button.Click.Demo.zip (5,337 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 5714 | Комментариев: 17

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Колдун (16.03.2022 в 06:39):
Запускаю prot_button, запускаю clicker_1, щёлкаю "Send CLICK message" и вижу "Status: All right"...
ManHunter (17.06.2020 в 22:29):
Никак
asdf (17.06.2020 в 22:24):
ЦитатаНе только Qt себя так ведет. Например, у Firefox тоже определяется только хэндл главного окна и нескольких вложенных, а все кнопочки и прочие элементы spy тоже не ловит.

А как с этим бороться?
ManHunter (29.08.2014 в 21:35):
Интересное решение, надо будет взять на заметку. Спасибо!
Василий (29.08.2014 в 21:22):
Можно с помощью функции InSendMessage проверить что сообщение прилетело из другого потока, авось пригодится))
ManHunter (12.02.2014 в 15:41):
Не только Qt себя так ведет. Например, у Firefox тоже определяется только хэндл главного окна и нескольких вложенных, а все кнопочки и прочие элементы spy тоже не ловит.
morgot (12.02.2014 в 15:39):
у меня есть планшет с виндой, могу потестить если что надо.

Я еще встречал странную вещь, что у кнопки и инпута не было hwnd. Прога на QT или подобном, в общем через spy++ получаю само окно, но невозможно получить его дочерные элементы. Т.е. чтобы скликать такое, нужно только передвигать курсор, или хз как.
Never (11.02.2014 в 18:26):
"жесть смотреть до конца?" - доставило, запишу )))
Dieter (11.02.2014 в 15:57):
manhunter анализирую алгоритм t**** COM LOADER
ManHunter (10.02.2014 в 16:46):
Планшетов под виндой в наличии нет, проверить не могу.
Андрей (10.02.2014 в 16:44):
Если серьёзно, с мультитачем как задумано работает или нет ?
ManHunter (10.02.2014 в 16:39):
Надо было назвать "100% непробиваемая гарантированная супер-пупер защита от всех когда-либо созданных человечеством автокликеров жесть смотреть до конца"?
Приведены примеры, от которых этот способ защищает, указаны слабые стороны, возможные проблемы и варианты их решения.
Андрей (10.02.2014 в 16:38):
Извини, но тогда получается что название статьи очень непрозрачное.

Статья называется "Защита кнопок формы от автокликеров", тут же пример с "классическим" кликером. На что ты реагируешь весьма странной фразой: "так использовать программу нельзя".

Интересно, с мультитачем как задумано работает ?
ManHunter (10.02.2014 в 16:27):
Про это тоже написано.
Андрей (10.02.2014 в 16:25):
autoit 3, встроенная "записывалка".

_WinWaitActivate("Protected Button Click Demo","")
MouseClick("left",52,57,1)

- и я не робот (All Right)...
ManHunter (10.02.2014 в 16:23):
Статью совсем не читал?
"Недостаток такого способа в том, что при работе с кнопками и полями формы с клавиатуры, координаты события все равно будут передаваться на основании положения курсора мыши. Эту проблему можно решить через субклассированный обработчик, в котором придется подавлять нажатия с клавиатуры."
Андрей (10.02.2014 в 16:22):
Окно в фокусе + "click me" в фокусе, жму "пробел" - я робот.
:(

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0056 сек.) / Память: 4.5 Mb
Наверх