Друзья и подруги, сегодня я попробую объяснить основные принципы написания бота для игры. Для меня удобнее писать на 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))
Генерация префикса:
PHP код:
loc_2 = CMDTEC % 9000 + 1000
fingerprint = b''
fingerprint += bytes(MDT[int(loc_2 / 1000)])
fingerprint += bytes(MDT[int(loc_2 / 100) % 10])
fingerprint += bytes(MDT[int(loc_2 / 10) % 10])
fingerprint += bytes(MDT[loc_2 % 10])
Когда мы закончим с составлением генератора префикса, мы отправим пакет с логином, паролем и комнатой (Старый протокол).
После каждого пакета, 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
Где:
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 от бул сервера, ваша мышь оказывается в комнате
Описание протокола.
Пример пакета:
Зеленым обозначен размер пакета, который вычисляется: ключ+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))
Генерация префикса:
PHP код:
loc_2 = CMDTEC % 9000 + 1000
fingerprint = b''
fingerprint += bytes(MDT[int(loc_2 / 1000)])
fingerprint += bytes(MDT[int(loc_2 / 100) % 10])
fingerprint += bytes(MDT[int(loc_2 / 10) % 10])
fingerprint += bytes(MDT[loc_2 % 10])
Когда мы закончим с составлением генератора префикса, мы отправим пакет с логином, паролем и комнатой (Старый протокол).
После каждого пакета, 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
Где:
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 от бул сервера, ваша мышь оказывается в комнате