![]() |
@ mrim.pl: Написание скриптов, работающих по протоколу MMP
@ mrim.pl: Написание скриптов, работающих по протоколу MMP by Digimortal [ intr0 ] Что такое Mail.Ru Агент, я думаю, знают все. Для тех кто не в курсе, это асикуподобный мессенджер с поддержкой разнообразных дополнительных возможностей, вроде отправки смс, голосового общения, игр и пр. В этой статье я достаточно подробно опишу основные моменты работы с протоколом, который испульзует Мэйл.ру Агент, что поможет тебе в написании различных тулз, работающих с этой системой (ни в коем случае не пишите смс-флудеры, МАгент-спаммеры или сборщики почтовых баз mail.ru!!! ;)) Как уже можно было понять из названия, примеры кода, приводящиеся в статье, будут написаны на самом классном скриптовом языке программирования :). [ протокол MMP ] Mail.Ru Агент использует собственный протокол - MMP, или mrim, который является частично открытым. На сайте agent.mail.ru выложено краткое описание протокола. В данном cписании присутствует только информация по основным возможностям мессенджера, но вооружившись сниффером пакетов, выяснить значения заголовков пакетов, например, для отправки смс, не составит труда. Помимо описания там присутствует С-хидер, с значениями полей, флагов и т.п. Я посчитал, что будет удобней объединить описание пакетов и этот заголовочный файл в один txt-файл, что и я сделал (смотри в ссылках). В дальнейшем думаю внести туда описания некоторых пакетов, которые не вошли в официальное описание. MMP действует поверх установленного tcp-соединения. Клиент инициализирует соединение с сервером, и далее взаимодействие происходит путем обмена сообщениями, причем сообщения могут отпарвляться как клиентом так и сервером. MMP является бинарным протоколом, кроме того, данные передаются не в общепринятом сетевом формате, а в little-endian'е, т.е. старший байт идет впереди. Основные типы данных, описанные в протоколе это: - UL; - LPS; - UIDL. Типом UL разработчики обозначили u_long или двойное слово, т.е. 4 байта. LPS - это составной тип, в который кодируются текстовые строки. Он представляет собой идущий впереди UL, в котором содержится длина строки, и саму строку. Строки представлены в windows-1251 кодировке. UIDL используется гораздо реже первых двух и в статье затрагиваться не будет. Представлен последовательностью из 8 символов из множества [a-z A-Z 0-9 _ - = +]. [ Структура пакетов ] Рассмотрим теперь структуру пакетов протокола. Как и полагается, пакет состоит из заголовка и данных (данные могут и отсутствовать). Поля хидера: Код:
<-4bytes->Тип пакета - это команды (или ответы на них), которыми обмениваются между собой клиент и сервер. Команды могут иметь параметры, передающиеся как данные пакета. Значения этих команд и параметров иможно взять из того файла, что прикрепил к статье. Я сразу приведу здесь те, что будут использоваться в приводимых далее примерах: Код:
my $CS_MAGIC = 0xDEADBEEF; ## Клиентский MagicКод:
sub make_mrim_packet[ Взаимодействие client <-> server ] Для того, чтоб устаовить соединение с mrim-сервером, нужно прежде получить его ip и port. Для этого необходимо установить tcp-соединение с mrim.mail.ru:2042 или mrim.mail.ru:443. Проделав это, клиент получает рекомендуемый для соединения ip-адрес и порт. Итак, вот саб, возвращающий ip:port для коннекта: Код:
sub get_host_portКод:
,---. ,---.Код:
sub helloКод:
Код:
sub login[ Ложки нету =) ] По сути, у нас есть уже все необходимое, чтоб вывести в онлайн наш mrim.pl. Но просто висящий в онлайне скрипт - это совсем неинтересно, и я решил добавить в статью код, отправяляющий сообщение на указанный адрес. Саб этот я упростил до безобразия, не сделав возможность устанавливать флаги, не сделав проверку на получение адресатом сообщения и еще многие вещи, которые можно было бы сделать (впрочем, практически во всех вышеприведенных сабах стоило бы доработать некоторые моменты). Данные которые должен содержать пакет сообщения: UL flags, LPS to, LPS message, LPS rtf-message. Установив нужные флаги, можно указать тип сообщения (например, указать, что пересылаемые данные являются списком контактов). Я установил только флаг, означающий отсутствие необходимости присылать пакет о подтверждении доставки сообщения. Сообщение можно оформить и в rtf-формате, но мне это нафиг не нужно, потому в rtf-message отправляется ноль. Итак саб, отправляющий сообщение: Код:
sub messageКод:
#!/usr/bin/perlКод:
D:\perl-mrim>perl mrim.pl[ outr0 ] На этом все, т.к. приведенной информации уже вполне достаточно для того, чтоб ты мог начать писать свои тулзы, взаимодействующие с системой МАгент. Жду теперь интересных релизов по этой теме.. [ Links ] http://agent.mail.ru - официальный сайт Mail.ru Агент http://agent.mail.ru/dev-license.html - официальное описание протокола MMP http://digimortal.0x48k.cc/articlz/mrim-packets.txt - отредактированное мной описание пакетов mrim http://hellknights.void.ru - сайт моей тимы http://0x48k.cc - форум DarkSide ResearcherZ Специально для форума Античат.. |
кста, посоветуйте хороший сниффер
|
Цитата:
|
Весьма познавательно)
Насчет кода: я никак не пойму, зачем многие люди юзают sysread/write ? Ты вроде юзаешь IO::Socket, так почему нельзя обойти просто $sock->send/recv ? Тем более, что sysread/write могут вызывать проблемы в некоторых ситуациях... ЗЫ: Цитата:
|
KSURi упорно подражает Perl Underground)))
шутко зачем ты придераешься к коду? ведь фишка статьи обьяснить работу протокола а не показать примеры красивого кода. Обычный пример. я думаю ты излишне строг. |
Хорошо. Многим будет интересно. В своё время разобрался в этом протоколе и очень полезный опыт получил. Никогда до того бинарными протоколами не занимался.
|
Цитата:
Цитата:
|
Цитата:
А по поводу sysread/write: Цитата:
За исследование протокола я уже сказал спасибо в виде +мах. Жду исследований на тему отправки смс ;) |
Цитата:
|
1E 00 00 00 - так вот оно )
1Eh = 30d |
| Время: 11:49 |