Как программа может управлять другой программой? - PullRequest
39 голосов
/ 23 июня 2009

Боты, как они работают? Говорят ли они, что в видеоигре была нажата клавиша или была нажата мышь?

Если нет, можно ли заставить вашу программу сообщать другой программе, что клавиша была нажата? Я хотел бы сделать программу, чтобы побить некоторые игры. Поэтому любые ресурсы или примеры приветствуются.

Обновление: Итак, один из способов - эмулировать нажатия клавиш, так, каковы некоторые способы сделать это (на любом языке)?

Ответы [ 12 ]

49 голосов
/ 23 июня 2009

Я написал кучу ботов в тот или иной момент (от игр Pogo до Yohoho Puzzle Pirates). Для окон вы обычно будете отправлять события Win32 для имитации движений мыши или подделывать фактически низкоуровневые сообщения, посылаемые между окнами, когда на самом деле щелкают мышью. Многое из этого зависит от того, как отреагирует программа (принимая сообщение с координатами или, в случае Java, сразу считывая координаты мыши). Часть «автоматизации» обычно включает чтение экрана и написание эвристики или алгоритмов для определения состояния, но также может быть столь же приятным, как анализ пакетов (много информации в плохих покерных реализациях) или же хакерским, как непосредственное считывание областей памяти. Довольно большое «поле», и плохо документировано, так как это довольно прибыльно и не трудно попасть в него.

Отправка ввода

C / C ++ (в Windows)

Для ключей попробуйте CodeProject:

http://www.codeproject.com/KB/cpp/sendkeys_cpp_Article.aspx

И сообщения:

http://www.codeproject.com/KB/threads/sendmsg.aspx

Лучше всего научиться отправлять сообщения с помощью Win32 API, а затем использовать что-то вроде Spy ++ или его производных для «обратного инжиниринга» того, как нажатия клавиш и движения мыши отправляются в окно.

Java

У Java есть удивительно портативный класс Robot, который способен:

  1. Чтение пикселей с экрана.
  2. Управление мышью.
  3. Отправка ключей.

Я бы сделал это, если вы ищете быстрый и легкий.

Базовая логика

Это подробно описано в другом месте в Интернете, но большинство ботов следуют простому потоку программ конечного автомата. Вы читаете экран (или пакеты, или память), выясняете, в каком «состоянии» вы находитесь, основываясь на ваших показаниях и прошлых данных, выполняете вычисления и отправляете результат обратно в программу.

Чтение экрана может быть затруднено, но его можно упростить, если учесть, что много раз, есть несколько «счастливых» пикселей относительно окна, которые дадут вам представление о том, в каком состоянии находится программа. Процесс поиска этих пикселей может быть автоматизирован.

4 голосов
/ 23 июня 2009

Самым большим недостатком этой концепции является не ввод, а вывод игры. Ваш бот не может просто случайно нажимать клавиши, ему нужно знать, что «происходит». Очень немногие игры позволяют запрашивать эти данные, и ваш бот решает очень сложную задачу - преобразование 60 кадров в секунду 2D-визуальных данных в виртуальное пространство.

Существуют актуальные игры, которые не только позволяют игрокам-ботам, но и поощряют их. Open RTS - один из них, но есть и более простые, такие как GUN-TACTYX и crobots , которые являются хорошими отправными точками.

4 голосов
/ 23 июня 2009

Некоторые программы (например, программы, которые растягивают вас в MMORPG) просто эмулируют нажатия клавиш. Инструмент для этого - AutoIt .

Что касается ботов, которые на самом деле сами играют в игры, я ничего с ними не сделал, но я предполагаю, что они будут использовать какой-то заранее определенный набор действий, возможно, эвристический, но маловероятный.

4 голосов
/ 23 июня 2009

Есть несколько видов ботов. Из того, что я помню, когда играл в CS (давным-давно)

Некоторые боты используют библиотеки самого приложения для проверки окружающей среды (карта, где находятся игроки и т. Д.). Боты также используют библиотеку для управления движением. Я сомневаюсь, что есть много реализаций ботов, которые вызывают сообщения мыши, чтобы сообщить игре, как двигаться и т.д. ...

Некоторые боты эмулируют протокол уровня приложения (если он мультиплеерный). Другими словами, игре даже не нужно запускаться. Бот может работать в виртуальной игре.

Я иду вразрез с тем, что предложил один из других авторов: написание игрового бота, вероятно, является более ценным упражнением, чем игра в игру, и любопытство о том, как они работают, является хорошим знаком. :)

2 голосов
/ 23 июня 2009

Это очень сильно зависит от игры. Например, я создал бота для Travian (это онлайн-игра), который использовал Internet Explorer ActiveX для автоматизации ходов. Я работаю с приложением на языке c #, и для его выполнения потребовалось около 30 минут. Вызовать методы в ActiveX просто и заставить их выполнять такие вещи, как заполнение текстовых полей или нажатие кнопок. Например, для входа в систему я использовал следующее:

var inputs = web.Document.GetElementsByTagName("input").
                        Cast<HtmlElement>();
var nume = inputs.First(h => h.GetAttribute("type") == "text");
var pass = inputs.First(h => h.GetAttribute("type") == "password");
var login = inputs.First(h => h.GetAttribute("type") == "image");
var form = web.Document.GetElementsByTagName("form")[0];

nume.SetAttribute("value", "user");
pass.SetAttribute("value", "pass");
login.InvokeMember("Click");

Для тех игр, которые основаны на десктопе, все становится сложнее. Windows позволяет одному приложению отправлять сообщения в другое приложение, поэтому я думаю, вы можете использовать это для отправки сообщений в игру (хотя это работает для игр, использующих DirectX для ввода, я не знаю)

2 голосов
/ 23 июня 2009

Боты будут выступать в качестве клиентов к игре (серверу). Затем они могут отправлять соответствующие данные так же, как пользователь может отправлять вручную. Бот (клиент) будет анализировать данные с сервера («кто-то собирается атаковать слева») и так далее. Затем клиент должен иметь возможность вычислить лучший ход и отправить соответствующие данные на сервер для его выполнения.

Я не уверен, что это будет работать со всеми играми.

1 голос
/ 23 июня 2009

Насколько я понимаю, большинство высококлассных игровых ботов используют системные вызовы, чтобы отобразить себя в памяти игрового клиента, перепроектировать его макет и напрямую управлять внутренними переменными программы клиента. Это намного больше работы, чем я хотел бы просто для удовольствия.

1 голос
/ 23 июня 2009

Я думаю, AutoIT - отличный язык для такого рода программ. Несмотря на то, что я не использовал его для создания ботов, отправка кликов и ключей была очень простой.

1 голос
/ 23 июня 2009

Вы можете эмулировать движения / щелчки мыши и ввод с клавиатуры в Java с помощью класса Robot . Это также позволяет делать снимки экрана.

1 голос
/ 23 июня 2009

Когда вы говорите «управлять программой», думайте о том, как программы управляются. Большинство принимает ввод с клавиатуры / мыши.

Если вы пишете программу, имитирующую ввод с клавиатуры / мыши, то вы идете.

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

Так работают все боты. Надеюсь, он проливает свет на вас!

Редактировать: Вот как работает подавляющее большинство ботов: -)

...