Друзья и подруги, сегодня я попробую объяснить основные принципы написания бота для игры. Для меня удобнее писать на python. Поэтому я выберу его за язык, на котором будут показаны примеры. И да, здесь не будут лежать исходники бота, здесь будут только примеры и описание протокола и пакетов. Исходники стоят денег. Заинтересовало? Пишите в личку. Теперь поехали:
Описание протокола.
Пример пакета:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Зеленым обозначен размер пакета, который вычисляется: ключ+0x1822 (статический байт)+4 байта отпечатка.
Красным обозначен отпечаток. При отправке 1го пакета, мы еще не имеем данных для генерации отпечатка, поэтому отпечаток равен «00 00 00 00».
Синим, обозначен c,cc пакет.
Желтым отмечена версия «27».
Розовым отмечен ключ, получение ключа с: [Ссылки могут видеть только зарегистрированные пользователи. ]
Голубым отмечены 2 статических байта 0x1822.
После отправки 1го пакета мы получим 26;22 пакет, который содержит kikoo.swf, мы его игнорируем. Получаем следующий пакет, который содержит: Онлайн, MDT, CMDTEC. Последние 2 значения нужны нам для генерации отпечатка.
MDT содержит список чисел. В нем нужно заменять каждый 0 на 10. Тип у MDT list, а у CMDTEC целый тип.
PHP код:
LMDT = list(now[4]) print MDT for c in map(int, LMDT): if c == 0: MDT.append(chr(10)) else: MDT.append(chr(c))
Когда мы закончим с составлением генератора префикса, мы отправим пакет с логином, паролем и комнатой (Старый протокол). После каждого пакета, CMDTEC нужно увеличивать на 1!
00 00 00 60 – размер пакета
06 01 09 01 – отпечаток
01 01 – с,сс
00 54 – версия
Остальное, это: логин + 01 + sha256(пароль) + 01 + комната
Вид пакета авторизации
[4 байта размера] + [4 байта отпечатка] + [01 01] + [размер строки] + [строка содержащая: [версия игры] + 01 + [логин] + 01 + [пароль] + 01 + [комната]]
Где единичные байты 01 есть разделитель.
Отправлем…
Мы в игре :3
После отправки пакета с данными, мы получим 2 (или 3… бывает по-разному) пакета, в одном из которых есть ключ и 2й ip (называемый Bulle5).
Открываем новое сокет-соединение с этим ip и отправляем пакет, который содержит: Размер + отпечаток(00 00 00 00) + ключ (полученный прошлым пакетом).
В случае успешной отправки пакета, бот окажется в комнате.
p.s. Во 2м сообщении будет рассмотрена структура пакетов их виды и таблица заголовков.
Описание пакетов.
В Transformice есть 2 вида пакетов, а именно: для старого протокола и для нового. С новым все более менее понятнее:
[4 байта размера] + [4 байта отпечатка] + [с и сс (таблица будет позднее)] + [размер строки] + [строка].
Пример (отправка сообщения в чат):
PHP код:
00 00 00 11 + 12 34 56 78 + 06 06 (с и сс для отправки сообщения в чат) + 00 0A + Hello world
Где:
00 00 00 11 - размер пакета.
12 34 56 78 - отпечаток.
06 06 - с и сс.
00 0A - размер сообщения.
Hello world - сообщение.
Где:
00 00 00 06 - длина пакета.
12 34 56 78 - отпечаток.
08 01 - с и сс (для эмоции).
08 - сообщение (в данном случае тип эмоции, здесь эмоция "сидеть").
Старый протокол выглядит иначе:
[4 байта размера] + [4 байта отпечатка] + [01 01] + [размер сообщения] + [ [с и сс] + [строка]]. Т.е. в строку входит с и сс заголовок пакета и сама строка. Не забудьте то, что размер сообщения ДОЛЖЕН включать в себя "с и сс":
Пример:
PHP код:
00 00 00 0E + 12 34 56 78 + 01 01 + 00 02 + 1A 02
Где:
00 00 00 0E - длина пакета.
12 34 56 78 - отпечаток.
01 01 - с и сс определяющий старый протокол.
00 02 - длина сообщения.
1A 02 - с и сс старого протокола (т.е. сообщение из 2х байтов. см. выше).
Каждые 10 секунд вы должны отправлять 2 пакета, один на маин сервер, а 2й на бул сервер (в примере про старый протокол рассмотрен именно тот пакет, который следует отправлять).
Картинки с описанием заголовков будут доступны позднее.
Первые шаги.
Этот урок нацелен на тех пользователей, которые уже умеют пользоваться сниффером (для всех остальных будет запилен видео-гайд).
Давайте попробуем изучить пакеты, которые клиент отправляет серверу и обратно. Игнорируем весь шлак во время загрузки клиента!
Вот пример, актуального на момент написания пакета (с ключом):
[Ссылки могут видеть только зарегистрированные пользователи. ]
00 00 00 26 - размер пакета.
00 00 00 00 - пустой отпечаток.
1C 01 - с и сс (заголовок пакета).
00 1C - версия игры.
00 11 - длина ключа.
71 73 64 68 67 67 63 61 79 69 79 69 65 74 68 74 69 - ключ (qsdhggcayiyiethti).
18 22 - размер загрузчика.
В ответ от сервера нам приходит kikoo.swf, размер пакета: 2499 байт. Мы его игнорируем.
Идем дальше:
Во 2м пакете нам приходят CMDTEC и MDT (способ получения отпечатка, приведен в 1м посте).
Пакет с отправкой логина изменился!
Дальше мы отправляем пакет с логином и паролем:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Где:
00 00 00 5C - размер пакета.
0A 06 04 03 - отпечаток, который мы сгенерировали используя MDT и CMDTEC.
01 01 - заголовок определяющий что мы используем старый протокол.
00 50 - размер сообщения (с и сс +логин+пароль+комната).
1A 01 - с и сс.
01 - разделитель.
6C 65 66 6C 65 69 72 74 66 6D - логин (lefleirtfm).
01 - разделитель.
36 38 33 66 37 34 65 37 38 32 32 61 37 39 33 66 64 34 33 35 30 37 33 62 35 37 32 35 66 65 36 33 66 30 62 35 65 30 35 34 30 31 66 37 32 64 35 38 62 38 32 66 64 61 38 36 36 32 62 36 66 65 30 63 - пароль (хеширование sha256).
01 - разделитель.
31 - комната (в данном случае: 1).
01 - разделитель.
+
[Ссылки могут видеть только зарегистрированные пользователи. ][Дата в формате unix datastate, для python: time.time() (6 символов)]
В ответ нам приходит 3 пакета, которые содержат информацию о игроке, племя и прочее. Но в 3м пакете находятся ключ и bulle5 ip адрес.
[Ссылки могут видеть только зарегистрированные пользователи. ]
00 00 00 19 - размер пакета.
2C 01 0F 18 FD 41 - ключ.
00 - разделитель.
31 37 36 2E 33 31 2E 32 35 33 2E 38 39 - ip адрес (176.31.253.89).
Открываем 2й сокет коннект (с новым ип адресом) и отправляем:
[4 байта длины] 00 00 00 00 ключ
В ответ нам придет пакет с бул сервера, который содержит CMDTEC и MDT для бул сервера.
ПОМНИТЕ! Для маин и бул сервера, отпечатки отличаются, вам нужно создать две функции генерации отпечатков, для главного и бул сервера.
После получения пакета с cmdtec и mdt от бул сервера, ваша мышь оказывается в комнате.
Последний раз редактировалось lefleir; 01.05.2012 в 04:27.
Причина: update 1.39
p.s. Почему-то видео не грузится, но ссылка доступна. Заходим, смотрим.
http://youtu.be/9RXrUjm9E6g
В следующем видео мы отправляем 1й пакет и получаем kikoo.swf, а следом пакет содержащий: онлайн, MDT и CMDTEC. Надеюсь стало понятно, что и куда отправлять. Далее действуем по инструкции выше и отправляем последовательно пакеты до входа в игру.
Последний раз редактировалось KlouS; 28.05.2012 в 11:05.
Получение, обработка пакетов.
Итак, котики. Мы с вами разобрались с отправкой пакетов. Теперь давайте изучим входящие пакеты и способы реагирования на них бота. Эта статья будет содержать примеры на питоне!
Запомните! Пакет с сервера не содержит отпечатка. А так почти все одинаково
Как и при отправке, пакет может быть старого и нового протокола. Поэтому положение с и сс будет отличаться.
Мы попробуем избежать геморроя и запилим это:
Здесь видно, что мы берем байты с тех позиций, где объявляется заголовок (с и сс) и если он равняется 01 01, мы берем другое положение (помните? 01 01 + 2 байта размера + с и сс).
Теперь мы можешь вызывать эту функцию и обрабатывать данные.
Для получения данных заведем цикл While True - бесконечный. И будем использовать условие:
if code == '\x06\x06': - пример обработки сообщения в чат.
Помните то, что данные с маин сервера идут не всегда. По этой причине, цикл будет ожидать получения данных. Из этого следует, что засовывать сурвивал, парсинг булл сервера и парсинг маин сервера в один цикл, стратегически не выгодно. Теперь сурвивал. Этот пакет должен отправлять каждые 10 секунд, в противном случае вас кикнет через 40 секунд, с обоих серверов. Что отправлять?
Эти байты: размер + отпечаток + \x01\x01\x00\x02\x1A\x02
Отправлять нужно на оба сервера.
Как же радует что я получил отпечаток...
[Ссылки могут видеть только зарегистрированные пользователи. ]
И так у меня возник вопросик, а почему когда я иногда подключаюсь к серверу то он молчит? Зашитный код на кико формайс появляеться чуть позднее чем на основном?
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961
Как же радует что я получил отпечаток...
[Ссылки могут видеть только зарегистрированные пользователи. ]
И так у меня возник вопросик, а почему когда я иногда подключаюсь к серверу то он молчит? Зашитный код на кико формайс появляеться чуть позднее чем на основном?
Т.е. молчит? Он в любом случае отвечает на твой пакет.
Да, ключ обновляется каждые 15 минут.
Т.е. молчит? Он в любом случае отвечает на твой пакет.
Да, ключ обновляется каждые 15 минут.
Ну короче беда в другом:
1. я не понял где менять 0 на 10, когда с ответа считую мдтек тогда и меняю?
2. кодировка запроса я ставил Default(C#)
3. Длина "00 50 - размер сообщения (с и сс +логин+пароль+комната)."
было 5В посчитал это 91, но когда считаю глазами то получаеться менше, почему? И нужно ли считать разделитили и сам байт длины?
Вот вроде всё с чем столкнулся вчера в 23:00 и пошол спать.
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961
Ну короче беда в другом:
1. я не понял где менять 0 на 10, когда с ответа считую мдтек тогда и меняю?
2. кодировка запроса я ставил Default(C#)
3. Длина "00 50 - размер сообщения (с и сс +логин+пароль+комната)."
было 5В посчитал это 91, но когда считаю глазами то получаеться менше, почему? И нужно ли считать разделитили и сам байт длины?
Вот вроде всё с чем столкнулся вчера в 23:00 и пошол спать.
1. После получения MDT и CMDTEC заменяешь в MDT все 0 на 10:
PHP код:
for c in map(int, LMDT):
if c == 0: self.MDT.append(chr(10))
else: self.MDT.append(chr(c))
2. Байты длина сообщения не нужно считать, ты считаешь только с и сс и сообщение.
1. После получения MDT и CMDTEC заменяешь в MDT все 0 на 10:
PHP код:
for c in map(int, LMDT): if c == 0: self.MDT.append(chr(10)) else: self.MDT.append(chr(c))
2. Байты длина сообщения не нужно считать, ты считаешь только с и сс и сообщение.
Размер 1 "00 00 00 5C - размер пакета."
Размер 2 "00 50 - размер сообщения (с и сс +логин+пароль+комната)."
Пойми что я говорю, тут не всё сообщение тут только вот это.
Что во втором считать можно подробней.
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961
Последний раз редактировалось the-boxi; 14.03.2012 в 17:54.