Бот - как избежать слежки?

  • Автор темы borisblade
  • Дата начала
B

borisblade

#1
Я с другим пацаном разрабатываю прогу автоматизации действий в одном приложении. Ее алгоритм:
1 раз в секунду делать скриншот
2 маленький ORS (optical recognition system) - определить изменения в окне клиентской программы
3 по алгоритму принять решение о дальнейшем действии
4 выполнить клик мышкой по кнопке

Косяк в том, что использовать ИИ-бота запрещено, и клиент отслеживает это.
Вопросы:
1 как запущенный клиентский экзешник может отследить, что работает бот, а не я?
2 как мне обойти эту слежку?

мои размышления по первому вопросу:
1) тупо делает tasklist и смотрит какие процессы из каких папок запущены
2) в клиенте есть лог, в кот. выводятся события - клиент, я думаю, может отследить обращения к своему скролл-окну или хз что там за дочерний объект. этот пункт меня не пугает, т.к. бот скриншотит эти ихменения а не обращается к окну
3) может ли клиент отследить клики мышью? - например бот без рандомизатора тыкает в один и тот же пиксел и водит мышью тупо по прямым - сразу видно, что играет не человек

по поводу второго вопроса - мое мнение:
1) использовать виртуальную машину в VirtualPC / Vmare Workstation либо рдп-сессию / сессию р-админа либо что-то подобное - запускать клиента в ней, а бот - на хост-машине
2) запускать клиента из под учетки с сильно-урезанными правами

Что думаете?
 
Z

zubr

#2
1) тупо делает tasklist и смотрит какие процессы из каких папок запущены
Ну и что это клиенту даст, мало ли какие процессы из каких папок запущены.
2) в клиенте есть лог, в кот. выводятся события - клиент, я думаю, может отследить обращения к своему скролл-окну или хз что там за дочерний объект. этот пункт меня не пугает, т.к. бот скриншотит эти ихменения а не обращается к окну
Клиент и так знает обращения к своему окну. Ему надо как то отделять события сделанные пользователем от событий активированных программно. никакой лог эту задачу не решает.
3) может ли клиент отследить клики мышью? - например бот без рандомизатора тыкает в один и тот же пиксел и водит мышью тупо по прямым - сразу видно, что играет не человек
Врядли, по ламерски это, не надежно.

Я бы, если бы у меня стояла задача защиты от бота сделал бы перехват функций FindWindow, FindWindowEx, GetWindow, SetCurcorPos, SendInput, mouse_event и подменял бы им результат.
 
B

borisblade

#3
Спасибо за оперативный ответ.
Теперь конкретизирую. клиент не онлайн-игра, а нечто другое. Приложение представляет собой 4 окна, позиция/размеры которых не меняется, не появляются другие окна. В общем эти окна статичны и не перекрывают друг друга. поэтому считывание инфы легко сделать скриншотом и не надо использовать функции *Window. Может ли клиент отследить функцию скриншота раз в секунду?
Другое дело - клики и движения мышью. Как сделать эти действия максимально похожими на человека?
Движения:
1 во время простоя мышь движется по "стандартным юзерским" траекториям - к пуску, к окну винампа наверху монитора и тд
2 траектория мыши от точки А до точки Б должна представлять собой случайную кривую в заданном коридоре, т.е. зигзагообразную линию с фиксированной максимальной амплитудой и небольшим шагом. Как сложно реализовать?
3 скорость движения мыши должна быть резкой - типа человек собирается быстро нажать на кнопку. Как сложно реализовать?

Клики:
1 случайные координаты в заданной зоне. Окна сделана в виде страниц ИЕ - т.е. кнопки - не объекты, а картинки - ну как на странице браузера.
2 случайные ошибки/мисклики
3 клики в сторонних приложениях

Учитывая вышесказанное, я бы сделал так:
создал бы виртуальную машину - в ней запустил клиент
на хост-машине запустил бы бота
бот скриншотит и кликает куда надо - все функции происходят на хост-машине, перехватить их процесс из виртульной машины не может - так?

Что скажешь?

Как вариант - сделать запись моих реальных движений - это реально? Записать сотню моих мувов - кликов и забить их в программу. Более того - сделать список этих движений обновляемым - я буду записывать эти движения.

!!! ВАЖНЫЙ ВОПРОС !!! Я двигаю курсор из одного угла монитора в другой и кликаю по идеальной прямой. Бот системными функциями делает то же самое. Клиент может различить, где я, а где бот?
 
B

borisblade

#4
Вопрос по виртуальной машине. Какие виртуалки есть в природе? Я знаю VirtualPC, VMare Workstation - какие еще? Какие у них достоинства и недостатки?
Самый, пожалуй, важный вопрос - клиент может узнать, что он запущен на виртуальной машине? У каждой железки и компа в целом есть Hardware ID - друг-асушник сказал, что у виртуальных машин ID четко указывает на их виртуальность. Нельзя ли его изменить?
 
Z

zubr

#5
Учитывая вышесказанное, я бы сделал так:
создал бы виртуальную машину - в ней запустил клиент
на хост-машине запустил бы бота
бот скриншотит и кликает куда надо - все функции происходят на хост-машине, перехватить их процесс из виртульной машины не может - так?
На хост-машине будет только действие по созданию скриншота, которое клиент не сможет перехватить. Кликанье мыши в клиенте будет все равно в контексте виртуальной машины.
Как вариант - сделать запись моих реальных движений - это реально? Записать сотню моих мувов - кликов и забить их в программу. Более того - сделать список этих движений обновляемым - я буду записывать эти движения.
Не понял, твой бот должен записывать твои мувы с кликами или клиент?
!!! ВАЖНЫЙ ВОПРОС !!! Я двигаю курсор из одного угла монитора в другой и кликаю по идеальной прямой. Бот системными функциями делает то же самое. Клиент может различить, где я, а где бот?
Может, если он будет перехватывать соответствующие системные функции, обеспечивающие вышеуказанные программные действия. Правда ему еще придется поработать, чтобы определить, что эти действия относятся именно к боту. Именно при клике это будет легко идентифицировать.
 
B

borisblade

#6
Имеется ситуация.
Я загружаю комп, запускаю на нем клиента. С другого компа захожу на первый комп в ту же сессию по рдп. Клиент каким-либо образом может увидеть, что я стал работать по рдп?
Тот же самый вопрос - только я делаю логон по рдп, т.е. первая машина загружена, но пользователем на нее я не залогинился - логинюсь через рдп-клиент.