![]() |
@ 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 |
хех, я после того как запостил сам ужо сообразил)
|
кстати, я тока щас обратил внимание на то, что зарезервированные поля похоже все же используются в текущей версии протокола:
Код:
|
А не знаете ещё сниферов, что б видеть трафф только одной проги, а не всех?
и кста, не могу найти в пакете место где находится номер пакета (в коде $seq_real) |
Цитата:
а номер пакета с 9-го по 12-й байт включительно занимает.. |
угу, спасибо
вот ещё фишка когда в клиент мессдж идёт, надо выслать потверждение. знаешь как? что то я пока не разберусь |
гляди в описании пакетов, там все это расписано.. и если ты вникнешь в содержимое статьи, то все будет предельно ясно:
Код:
[ Доставка сообщения (sc): MRIM_CS_MESSAGE_ACK = 0x1009 ] |
мне сразу несколько приходит
Цитата:
точнее думаю с первого, но не могу догнать что за остальные пакеты. |
это все один пакет )
просто в примерах в статье я всегда знал сколько будет размер получаемого пакета и выставлял его в sysread, но в твоем случае размер пакета заранее неизвестен - ведь данные могут быть различной длины.. у тебя первое - это заголовок - из него можно взять длину данных 1A 01 00 00 = 11Ah = 282 байта, а затем принять эти 282 байта - это будут данные пакета.. из этих данных и брать нужные значения.. |
наверное я идиот(
|
вот посмотри подалуйсто:
Цитата:
Цитата:
|
>> это ведь не просто мусор?
нет конечно, это rtf-текст твоего сообщения, упакованный gzip и закодированный base64.. прочитай в описании пакетов про MRIM_CS_MESSAGE: http://digimortal.0x48k.cc/articlz/mrim-packets.txt |
это я читал))) толбко я не могу понять для чего он нужен
|
вы МАгентом пользовались хоть раз? там можно пересылать отформатированный в формате rtf текст (фон цветной, шрифт ит.д.) - это я думаю вам нафик не надо, если конечно вы свой мрим-клиент не собрались писать.. )
|
пользовался... раз пять... надо наверное поюзать
|
вот дампы пакетов:
мой: Цитата:
Цитата:
так почему они различаются? неужели мэил уже успели изменить протокол? |
ну да, а что в этом удивительного?
в МАгенте постоянно появляются новые возможности, а следовательно и новые версии протокола появляются.. |
ну всё равно как - то...
для меня немног времени прошло, а уже на три еденички протокол поменяли всмысле три раза я думаю мэилпрото не станет таким как асику. тоесть не будет делать так, что клиенты работающие по старому протоколу, не смогут дажо залогинитсо. |
хм, строю пакет, вот дамп
Цитата:
если поставить NORECV (04 00 00 00), мессага прекрасно идёт, а если rtf, то не доходит. плюс нету потвержения. помогите и кста, если не трудно, преведите пример потверждения получения мессаги. никак не могу понять как он строитсо |
ну, чтоб ставить флаг rtf, надо саму rtf-часть наверно в сообщение вкладывать.. а зачем тебе это? поставь просто в значение флага 0..
а собрать пакет для подтверждения очень просто: Код:
sub message_recv |
хех, если бы всё так просто
просто не так выразился, я имел ввиду дамп а не сабу. сорри. тут вот в чём вопрос: from - это мыло отправителя или его айпи? msg_id - это seq пакета с мессаджем котороый пришёл? вот это у мну и составило проблему. |
>> from - это мыло отправителя или его айпи?
мыло конечно.. >> msg_id - это seq пакета с мессаджем котороый пришёл? нет.. это поле msg_id в данных пакета.. |
хммм, вот посмотри какой пакет потверждения получился:
Цитата:
Цитата:
не могу понять |
ты должен отпраялять не тот seq, что в заголовке MRIM_CS_MESSAGE_ACK, а тот что в msg_id этого пакета.. у тебя он равен C3 00 00 00 .. а ты отправляешь 03 00 00 00 .. (это я, наверно, своим предыдущим ответом немного сбил тебя с толку - msg_id отпраляется не тот что получает получатель сообщения, а тот, что передает отправитель.. )
|
вот смотрел старые скрипты. много думал. наткнулся на скрипты свзяаные с мэил агентом.
вспомнил)) и вот значит вспомнил что хотел бота написать. тока думал как же сделать посылку этого гадостного пинга (пакет уходящий каждые 30 секунд). додумался. и забыл. а сейчас вспомнил. значит можно просто использовать потоки(модуль threads). то есть запускаем бота. и выделяем отдельный поток, который будет слать пинг, а затем спать 30 секунд. вот вообщем то и все. написал потому, что в определённый момнет это составило для мну проблему. надеюсь что кому то помогу. |
у меня в черновом варианте кода, рядом с функцией пинга комментарий даже стоит: типа, запустить отдельный тред и пинговать из него... )
|
Цитата:
|
http://agent.mail.ru/developers/
|
Цитата:
http://digimortal.0x48k.cc/articlz/mrim-packets.txt - отредактированное мной описание пакетов. Я и хотел бы посматреть, что именно автор там писал, может чего-нибудь новенькое или поподробней. |
да ниче особо нового там не было.. я тока написал немного своих наблюдений по некоторым пакетам, добавил описания пакетов, необходимых для отправки смс, написал кое-какие идеи по этому поводу, и привел это все в более удобный (по моему мнению) вид.. сорри, но у меня щас нету возможности выложить тот файл..
|
Цитата:
дайте пож информацию! :( |
| Время: 10:58 |