Как работают боты для Runescape (и подобных игр)? Как они присоединяются к JVM, находят ссылки на апплет и поддельные события AWT?

Runescape - это большая онлайн-игра с клиентом pure-Java, который работает в браузере как подписанный апплет. Это довольно уникально в этом отношении, с другим основным примером я знаю, что Yohoho Puzzle Pirates. Отчасти из-за сил в игровой экономике существует большая численность автоматизированных игроков, управляющих различным программным обеспечением ботов, чтобы размалывать ресурсы в игре.

Эти боты являются одними из самых сложных приложений Java, которые я видел, особенно в отношении изменения состояния JVM во время выполнения. Мне любопытно, как эти работы, не обязательно специфические для конкретной игры, но в целом. (Вы можете легко использовать Google для примеров. Я не собираюсь ссылаться на них, потому что некоторые из них якобы связаны с вредоносным ПО.)

Из того, что я могу понять, это приблизительный поток того, что делает бот:

  • Запускает и прикрепляет игровой апплет. Я не уверен, что это результат запуска апплета в бот-ток JVM или результат присоединения к JVM игры после его запуска.
  • Читает состояние игры. Это, по крайней мере, означает получение ссылки на текущий апплет и чтение его графики. Я не уверен, что еще здесь участвует. Я знаю, что некоторые боты получают ссылки на некоторые из собственных игр игры и называют их получателями, чтобы читать внутреннее состояние программно.
  • Подделывает ввод. Насколько игра может сказать, она получает регулярные события мыши и клавиатуры. Однако они подделываются на уровне AWT, так как эти боты могут работать нормально, если не на переднем плане, и они не используют системный курсор.

Как выполняются каждый из этих шагов? Что бы я сделал, если бы захотел написать подобный бот для подобной игры? В частности:

  • Если бот запускает игру или присоединяется к игре после ее запуска? Какой из этих подходов возможен/обоснован? Как они сделаны? В каждом случае насколько целесообразно/разумно получать ссылки на игровой апплет? Что относительно JFrames или других компонентов AWT/Swing, которые он содержит?
  • Учитывая ссылку на различные компоненты AWT/Swing, как бот читает их? Когда/где это безопасно?
  • Как бот вызывает код игры для вызова getters для состояния клиента? Обратите внимание, что код игры запутан, и имена, вероятно, будут меняться при каждой сборке, даже если общая топология кода почти одинакова. Как автор находят эти методы интереса для начала?
  • Как бот отправляет фальшивые входные события AWT? Как это делается разумным и последовательным образом?

Я не обязательно буду писать такого бота, хотя это одна из наиболее интересных программ, которые я видел в последнее время, поэтому я определенно хочу узнать больше об этом. Интересно, что многие вещи здесь могут быть применены к неконфронтационным ситуациям, таким как автоматическое тестирование пользовательского интерфейса.

Ответы