В этом треде я буду вести лог разработки пакетного бота. Конечная цель - сделать работающий бот, который летает по карте и собирает коробки. Надеюсь, что кому-то это будет интересно, и я всё это делаю не зря.
Сразу скажу, что я давно не играл в DO, поэтому про новые фишки не знаю, а старые уже подзабыл. В любом случае, буду опираться на опыт, который у меня уже есть.
Итак, приступим.
Для начала попробуем запустить игру. Заходим на сайт(в моём случае пришлось зарегистрировать новый аккаунт), логинимся - и что мы видим?
В браузере поиграть уже нельзя, нужно скачивать десктопный клиент.
Не вопрос - скачиваем. Первое, на что обращаем внимание - это вот эти библиотеки:
Запускаем сам клиент. Очевидно, что это браузер Qt5WebEngine, работающий на базе Chromium. Логинимся в аккаунт - и вот она: долгожданная кнопка "START"!
Нажимаем её, игра запускается. Всё, как раньше, только теперь для этого нужно скачивать отдельный браузер.
Пока в этом не особенно много смысла. Чтобы что-то узнать - нужно увидеть трафик. Я это буду делать через программу WireShark.
Запускаем WireShark, проделываем те же самые действия, и смотрим в лог:
Здесь видно, что для коммуникации с сайтом используется хедер
Код:
User-Agent: BigpointClient/1.6.9
Вот ещё один интересный запрос:
Здесь присутствует хедер
Код:
X-Requested-With: ShockwaveFlash/26.0.0.137
Это нам понадобится в будущем для авторизации. Пока что мы просто смотрим, что здесь вообще происходит.
Так же видим запрос к maps.php.
Ответом на него сервер отдаёт XML'ку с IP-адресами карт:
Нажимаем кнопку "START". В логах начинают появляться запросы на скачивание .swf файлов:
Насколько я помню, main.swf - это как раз то, что нам нужно. Скачиваем эти файлы и складываем в специальную папку, они нам пригодятся.
Заодно посмотрим TCP-пакеты. Проблема WireShark'а в том, что несмотря на всю свою мощь, он не может ловить пакеты от определённого процесса. Он работает на уровне интерфейсов, а там никакой информации про процессы нет. Но, к счастью, чуть выше мы получили IP адреса карт. В моём случае их можно описать маской 47.245.0.0/16. Пишем следующий фильтр:
Код:
ip.addr == 47.245.0.0/16
Я не особо силён в TCP протоколе, если увидите неточности - поправляйте.
Пакет [SYN, ACK] с SACK_PERM=1 - это подключение к сокету. Пакет [FIN, ACK] - это отключение.
Тут мы видим 2 подключения и 1 отключение. При первом подключении отправляется вот такой пакет:
На который приходит вот такой ответ:
После этого соединение прерывается.
Дальше соединение устанавливается заново, и клиент отправляет серверу вот такой пакет:
На что получает следующий ответ:
В запросе первые 4 байта (0x24) - это длина пакета(40), минус 4 байта. Дальше идёт, предположу, что ID сообщения(0x029A), после - длина строки(0x0020), и сама строка.
В ответе есть небольшое отличие. Длина пакета записана в первых трёх байтах, а не четырёх(0x25). Всё остальное в целом такое же.
Итак, базовая информация у нас есть. Следующий шаг - добраться до внутренностей main.swf
Добавлено через 1 час 9 минут
Для работы с SWF я буду использовать программу JPEXS Flash Decompiler. Её совершенно бесплатно можно скачать с github'а: [Ссылки могут видеть только зарегистрированные пользователи. ]
Разумеется, сначала я попытаюсь открыть main.swf
К сожалению, хотя и ожидаемо - получаю ошибку:
С loadingscreen.swf то же самое.
Значит, начнём с preloader.swf
Он открывается без проблем. Попытаемся "наудачу" грепнуть main - и о чудо! Находим то, что искали:
В этом же файле, чуть ниже видим процесс получения валидного main.swf:
Сначала скачивается raw data, потом распаковывается(используется упаковщик ZLib), после чего расшифровывается.
За расшифровку отвечает method_48:
Дальше идёт class_15:
Который, в свою очередь, использует class_27:
Так, надо притормозить. В теории это, конечно же, можно расшифровать. Но, насколько мне известно - BigPoint часто меняет протокол, и наверняка алгоритм шифрования тоже. Мы не хотим, чтобы после очередного обновления протокола бот перестал работать, а значит извлечение main.swf нужно автоматизировать. Я, к сожалению, не смог найти интерпретаторы ActionScript 3, поэтому подход придётся поменять.
У JPEXS есть прекрасная функция - Search SWFs in memory. Так как SWF после расшифровки неизбежно попадает в память - я думаю, что это именно то, что нам нужно. Запускаем игру и смотрим:
Методом тыка мне удалось выяснить, что это и есть тот самый main.swf
Почему он представлен в 3 экземплярах? Я не знаю.
Почему он весит 12 мегабайт, а не 5, как оригинальный? Это мне тоже неизвестно.
В любом случае - он у нас есть. Попробуем грепнуть какой-нибудь пакет. К примеру, 0x029A, который мы получили в прошлый раз. 0x029A - это 666. Стоит отметить, что это достаточно требовательная к ресурсам ПК задача:
И вот результат:
Итак, мы добрались до сетевого кода!
Этот пакет отвечает за версию клиента, на что ему в ответ сервер возвращает такую же версию, плюс некий boolean. Для удобства я экспортировал исходники, чтобы не нагружать компьютер при каждом грепе:
Теперь мы можем посмотреть и остальные пакеты, которые поймали ранее.
Номер пакета - 7. Это LoginRequest. Выглядит он так:
Если сложить количество бит, на которое число сдвигается влево, с количеством бит, на которое число сдвигается вправо - то в данном случае мы получим 32. В других случаях мы всегда будем получать число бит, из которых состоит число. Например для short, он же int16 - сумма будет равна 16. Для int8 сумма будет равна 8.
Это значит, что BP использует wrapping bit shift, он же rotate. Вот как он работает:
Для обратного преобразования нужно просто поменять числа местами.
Теперь, если разобрать пакет, который уходит на сервер - то мы получим следующее:
user_id = 0x52685300 << 29 | 0x52685300 >> 3 = 0x00 | 0xA4D0A60 = 172821088 - это мой User ID
faction_id = 0x0180 << 9 | 0x0180 >> 7 = 0x00 | 0x03 = 3 - это VRU.
session_id = "b8f61bde4c7d01d74ba8475750b86661" - это SID.
version = "" - пустая строка. Видимо, тут должна быть(или когда-то была) версия.
instance_id = 0x002D7000 << 20 | 0x002D7000 >> 12 = 0x00 | 0x02D7 = 727 - если я правильно понял, то это ID клиента, через который я захожу в игру.
В конце идёт boolean(var_5664), который в моём случае равен 1. Если покопаться в исходниках, то мы увидим вот такой участок кода:
В этом треде я буду вести лог разработки пакетного бота. Конечная цель - сделать работающий бот, который летает по карте и собирает коробки. Надеюсь, что кому-то это будет интересно, и я всё это делаю не зря.
Сразу скажу, что я давно не играл в DO, поэтому про новые фишки не знаю, а старые уже подзабыл. В любом случае, буду опираться на опыт, который у меня уже есть.
Итак, приступим.
....
Привет, товарищ! Пожалуйста, не забрасывай тему, всё очень интересно. Вижу последнее редактирование от 25.10, но ты был в сети 05.11. Отклика народа нет, форум почти мертвый, но след останется навсегда (интернет помнит всё) и обязательно кто-то увидит и ему это пригодится.
К сожалению, у меня нет возможности поставить "спасибо" на твое сообщение, поэтому могу сказать это лишь письменно.
Уже есть несколько вопросов. Я ушел из ДО, надоело, хоть и раньше сидел, как на наркотике, возвращаясь каждый год / полтора, но сейчас тошно. Есть новая игрушка, она сразу идет на платформах IOS, Android, Linux, Windows, Mac. Играю на Windows, так там exe файл открывается через 7zip и есть доступ ко всей начинке. Если правильно понимаю, то движок - java. Хочу написать бот, пакетник. Кликеры уже делал, есть, но это не то, нужно что-то посерьезнее. Теперь ломаю голову, как залезть, перехватить и потом имитировать игровой процесс программно.
1. Доступ ко всем файлам есть
2. Игра создает скрытую папку с txt файлом на диске C, где записаны все настройки. Разрешение экрана, кнопки, логин-пароль от всех сохранённых аккаунтов.
3. Попробовал запустить клиент параллельно с Wireshark, поплыли пакеты, в одном из них нашел ссылочку на авторицазацию auth.сайт.com
Опыта работы с процессами, пакетами, памятью, контролю - нет. Потолком были кликеры. Поэтому сам мозг бота, смогу написать, все циклы и прочее, а вот, как это внедрить.. Может быть у тебя есть опыт или посоветуешь?
Грубо говоря, твоя тема сейчас для меня пример, хоть и бот для flash игры.
Писать буду на с++ или змейке. Это особо не важно, стандартную информацию и гайды найти можно. Но, с ботами такого типа не нашел. Для меня идеалом является DarkBOT. Это лучшее, что я видел. Стремлюсь к тому, чтобы сделать нечто подобное.
P.s. Моя цель - вдохнуть жизнь в сообщество читеров. Пробудить былой интерес у людей к нестандартным решениям и коллективному творчеству.
Последний раз редактировалось Bug.Point; 10.11.2023 в 20:15.