Jump to content
Sign in to follow this  
V3ct0r

Проект игрового Бота

Recommended Posts

Проект игрового Бота

 

Всем привет! :smile:

 

В данной теме я хочу Вам рассказать о своем проекте игрового бота. Бот - это специальная программа, выполняющая какие-либо действия автоматически или по указанному расписанию. Изначально я поставил себе цель написать программу, которая могла бы подключаться к серверу и торговать в ларьке. Таким образом, мне не надо запускать игровой клиент и держать его открытым. Для чего это нужно? Практического применения программа в данный момент не имеет, но я улучшил свои навыки программирования, то есть получил ценный опыт.

 

Что умеет бот уже сейчас:

1) Подключаться к серверу, авторизовываться с использованием указанного аккаунта, выбирать персонажей и заходить в игру;

2) Ничего не делать (как вариант, растить фею);

3) Принимать сообщения со всех каналов (Система, GM, местный, мировой, торговый, гильдия, ЛС, отряд, лагерь);

4) Отправлять сообщения во все каналы;

5) Торговать в ларьке;

6) Делать простые линейные передвижения;

7) Читать .map файлы. Это нужно в будущем для навигации.

 

В качестве демонстрации работы покажу два скриншота. На них бот подключается к серверу, успешно авторизуется, выбирает персонажа V3ctor, заходит на карту garner и создает торговый ларек по координатам (2232, 2782). Кроме того, каждые 15 секунд бот пишет сообщение в местный чат, зазывая игроков заглянуть в ларек:

Bot1.png

 

 

ec5d19db20b8.png

 

Из технических подробностей отмечу, что разработка ведется на языке C++, так как это мой основной язык программирования. Для сетевого ввода/вывода была выбрана библиотека libevent, что обеспечивает кроссплатформенность бота.

 

Что касается дальнейшего развития, у меня есть следующие идеи:

1) Автоматический бафер, который будет бегать за Вашим персонажем, бафать и лечить его;

2) Классический бот для прокачки персонажей, фарма монстров, добычи ресурсов. То есть программа будет искать монстров (ресурсы) и атаковать (добывать) их;

3) Интерактивный помощник для игроков. Например, такой бот стоит около фонтана в Аргенте, к нему походят игроки и спрашивают в ЛС/местный чат где находится такой-то NPC. Затем бот следует до указанного NPC, тем самым показывая игрокам где он находится. Или у него можно спросить, какая погода в NNNN: программа подключится к серверу погоды в Интернете, получит ответ и скажет погоду игрокам;

4) Автоматический GM-модератор, который банит игроков за мат в чатах или торговые сообщения в неположенных каналах.

 

Так же данная программа может являться основой для кастомного клиента игры: к ней можно прикрутить графику и GUI.

 

На этом пока все. Пишите что думаете о проекте в этой теме, возможно у Вас есть какие-либо интересные идеи применения бота. Сразу скажу, что меня не интересует моральная сторона вопроса, то есть писать что бот - это плохо, а я плохой человек не нужно. Как я писал выше, разработку веду для себя в качестве хобби, в свободное время.

  • Like 6

Share this post


Link to post
Share on other sites

Хотелось бы увидеть код к примеру на гитхабе, чтобы можно было исследовать и предлагать различные реализации.

Share this post


Link to post
Share on other sites
4 минуты назад, trayfan сказал:

Хотелось бы увидеть код к примеру на гитхабе, чтобы можно было исследовать и предлагать различные реализации.


Поддерживаю.

Share this post


Link to post
Share on other sites
В 26.10.2017 в 09:19, destroger сказал:

Когда можно будет увидеть сие чудо в доступе...?

Проект был остановлен, так что, скорее всего, никогда.

 

7 часов назад, trayfan сказал:

Хотелось бы увидеть код к примеру на гитхабе, чтобы можно было исследовать и предлагать различные реализации.

 

7 часов назад, Kolumb сказал:

Поддерживаю.

Лучше исследуйте исходные коды сервера и клиента. Все, что есть в боте, там тоже есть.

 


Share this post


Link to post
Share on other sites
56 минут назад, trayfan сказал:

а из-за чего проект был остановлен?

Из-за отсутствия интереса и времени


Share this post


Link to post
Share on other sites
18 часов назад, V3ct0r сказал:

Из-за отсутствия интереса и времени

Как вариант - можно выложить "кастрированного" бота, вдруг у кого руки дойдут доделать или фишки новые прикрутить

  • Like 1

Делай добро и бросай его в воду

Share this post


Link to post
Share on other sites
On 10/18/2021 at 5:01 PM, Asakura007 said:

Поделись формой запроса для авторизации, или хотя бы в каком файле капать из исходного кода.

Структуру логин-пакета можно посмотреть в исходных кодах клиента в файле ProCirculateCS.cpp, в методе CProCirculate::Login().

  • Thanks 1

Share this post


Link to post
Share on other sites

Как для человека изучающий java что то трудновато  переделать метод  CProCirculate::Login().  и сформулировать запрос правильно, к примеру я подключаюсь к серверу и получаю формат даты, если я не ошибаюсь то это и есть ключ который я должен отправить обратно в месте со всеми данными , далее не закрывая соединение пытаюсь отправить в одну строку через  пробелы  (логин парольМД5 версию ключ) без кодировки без нечего, и соединение тупо сбивается ,снифер показывает что я  должен отправлять еще и мак адрес, пробовал и с ним но без толку , хотелось все таки увидеть  ваш  чистый код без каких то внешних ссылок.

Share this post


Link to post
Share on other sites
On 10/29/2021 at 7:22 PM, Asakura007 said:

Как для человека изучающий java что то трудновато  переделать метод  CProCirculate::Login().  и сформулировать запрос правильно, к примеру я подключаюсь к серверу и получаю формат даты, если я не ошибаюсь то это и есть ключ который я должен отправить обратно в месте со всеми данными , далее не закрывая соединение пытаюсь отправить в одну строку через  пробелы  (логин парольМД5 версию ключ) без кодировки без нечего, и соединение тупо сбивается ,снифер показывает что я  должен отправлять еще и мак адрес, пробовал и с ним но без толку , хотелось все таки увидеть  ваш  чистый код без каких то внешних ссылок.

 

Нужно получить MD5-хэш пароля, перевести его в верхний регистр и зашифровать алгоритмом DES используя строку с датой и временем подключения к серверу из пакета ID 940.

 

Пакет отправляется не строкой, а в виде массива байт, так как протокол бинарный. Пример записи логин-пакета в выходной буфер на C++ может выглядеть следующим образом:

	// Записать пакет в буфер
	void CLoginPacket::write(CBinaryWriter& Writer)
	{
		// Буфер под зашифрованный пароль
		char pass_buf[128] = {0x00};

		// Длина зашифрованного пароля
		unsigned short int pass_len = 0;

		// Зашифруем пароль
		passencrypt(pass_buf, pass_len);

		// Записываем пакет
		Writer.WriteString(m_nobill);           // "nobill"
		Writer.WriteString(m_login);            // Логин
		Writer.WriteBytes(pass_buf, pass_len);  // Зашифрованный пароль
		Writer.WriteString(m_mac_address);      // MAC-адрес
		Writer.WriteInt16(m_flag);              // 136
		Writer.WriteInt16(m_version);           // 911
	}

 

Чтобы записать строку, сначала необходимо записать 2 байта её длины с учетом нулевого байта, а далее непосредственно байты строки плюс нулевой байт. С массивом байт, чем будет являться зашифрованный пароль, аналогично, только без учета нулевого байта.

 

При отладке советую использовать сниффер, подойдет даже WPE Pro, и сравнивать пакеты от Вашей программы с пакетами, которые отправляет Game.exe. В случае с логин-пакетом, они должны быть побайтово одинаковы, кроме поля с паролем, т.к. пароль каждый раз будет шифроваться с разными ключами.

 

Отладку  также лучше проводить на "чистых" серверных файлах, без каких-либо модификаций, например, защиты от того же WPE Pro.

  • Like 2

Share this post


Link to post
Share on other sites

@Asakura007

 

Забыл добавить, что в приведенном примере кода опущена запись заголовка пакета, который состоит из длины пакета (2 байта), числа 0x80000000 (4 байта) и ID пакета (2 байта). Таким образом, полная запись логин-пакета будет выглядеть так:

 

// Записываем пакет
Writer.WriteInt16(length);              // Где length - длина пакета
Writer.WriteInt32(0x80000000);
Writer.WriteInt16(431);
Writer.WriteString(m_nobill);           // "nobill"
Writer.WriteString(m_login);            // Логин
Writer.WriteBytes(pass_buf, pass_len);  // Зашифрованный пароль
Writer.WriteString(m_mac_address);      // MAC-адрес
Writer.WriteInt16(m_flag);              // 136
Writer.WriteInt16(m_version);           // 911

 

22 hours ago, V3ct0r said:

При отладке советую использовать сниффер, подойдет даже WPE Pro, и сравнивать пакеты от Вашей программы с пакетами, которые отправляет Game.exe. В случае с логин-пакетом, они должны быть побайтово одинаковы, кроме поля с паролем, т.к. пароль каждый раз будет шифроваться с разными ключами.

Соответственно отладку необходимо выполнять при отключенном шифровании пакетов (GateServer.cfg, CommEncrypt = 0)

  • Like 2

Share this post


Link to post
Share on other sites

@Asakura007

 

В гайде  "Исправление SQL-инъекции в AccountServer" я выкладывал исходный код эксплоита на C++, который подключается к серверу и отправляет логин пакет. Можно использовать его как рабочий пример. Проверь файл main.cpp, функцию send_login_packet() на 504 строке.

 

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...