Защита кнопок формы от автокликеров
В одной из прошлых статей я писал об управлении другим приложением из своей программы, в частности о возможности эмулировать нажатия на кнопки. Ненадолго переберусь на другую сторону баррикады и расскажу о нехитром способе, которым можно отличить реальные нажатия на кнопки от эмулированных. Заключается он в том, что при обработке клика проверяются экранные координаты, где это событие произошло. Если они находятся в пределах границ кнопки, то все нормально, иначе клик считается эмулированным. Координаты события можно получить при помощи функции GetMessagePos.Code (Assembler) : Убрать нумерацию
- button_clicked:
- ; Получить экранные координаты кнопки
- invoke GetDlgItem,[hwnddlg],ID_BUTTON
- invoke GetWindowRect,eax,pt
- ; Получить координаты произошедшего события
- invoke GetMessagePos
- ; Выделить координату Y
- mov ebx,eax
- shr ebx,16
- mov [y],ebx
- ; Выделить координату X
- mov ebx,eax
- and ebx,0FFFFh
- mov [x],ebx
- ; Проверка, чтобы событие произошло в пределах кнопки
- mov eax,[y]
- cmp eax,[pt.top]
- jb clicked_by_robot
- cmp eax,[pt.bottom]
- ja clicked_by_robot
- mov eax,[x]
- cmp eax,[pt.left]
- jb clicked_by_robot
- cmp eax,[pt.right]
- ja clicked_by_robot
- clicked_by_human:
- ; Кнопка нажата человеком
- ...
- clicked_by_robot:
- ; Кнопка нажата автоматически
- ...
В качестве более мирного использования функции GetMessagePos могу предложить обработку нажатия на элементы окна, которые в принципе не могут самостоятельно обрабатывать события. Например, функциями GDI можно нарисовать в окне какой-нибудь рисунок, текст или псевдоэлемент, а затем через обработчик родительского окна отслеживать клики на этом рисунке.
В приложении пример программы с исходным текстом, реализующей защищенную кнопку, и два автокликера, с помощью которых можно протестировать работу программы.
Просмотров: 5764 | Комментариев: 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):
А как с этим бороться?
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++ получаю само окно, но невозможно получить его дочерные элементы. Т.е. чтобы скликать такое, нужно только передвигать курсор, или хз как.
Я еще встречал странную вещь, что у кнопки и инпута не было 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)...
_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" в фокусе, жму "пробел" - я робот.
:(
:(
Добавить комментарий
Заполните форму для добавления комментария