Протокол MMP (mail.ru агент), кто сталкивался?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 18 окт 2009.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Пытаюсь понять как работает.Пока ничего невыходит.Абсолютно непонятно как пакеты формировать :dntknw: Пробывал так
    Код (Text):
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     SOCKET s;SOCKADDR_IN adr;WSADATA wsd;
    4.     WSAStartup(MAKEWORD(2,0),&wsd);
    5.     hostent *h;
    6.     char Ip[1024];
    7.     char *datain=new char[1024*1024];
    8.     memset(datain,NULL,1024*1024);
    9.     h=gethostbyname("mrim.mail.ru");
    10.     sprintf(Ip,"%d.%d.%d.%d",(unsigned char)h->h_addr_list[0][0],(unsigned char)h->h_addr_list[0][1],(unsigned char)h->h_addr_list[0][2],(unsigned char)h->h_addr_list[0][3]);
    11.     adr.sin_family=AF_INET;
    12.     adr.sin_addr.s_addr =inet_addr(Ip);
    13.     adr.sin_port = htons(2042);
    14.     s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    15.     connect( s,(sockaddr *)&adr, sizeof(adr));
    16.     recv(s,datain,1024*1024,0);
    17.     closesocket(s);
    18.     int mraport;
    19.     char *buf=new char[1024];
    20.     strtok(datain,"\n");
    21.     strcpy(buf,strstr(datain,":"));
    22.     buf+=1;
    23.     mraport=atoi(buf);
    24.     buf-=1;
    25.     delete []buf;
    26.     strtok(datain,":");
    27.     strcpy(Ip,datain);
    28.     memset(datain,NULL,strlen(datain)+1);
    29.     adr.sin_family=AF_INET;
    30.     adr.sin_addr.s_addr =inet_addr(Ip);
    31.     adr.sin_port = htons(mraport);
    32.     s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    33.     connect( s,(sockaddr *)&adr, sizeof(adr));
    34.     mrim_packet_header_t data;
    35.     mrim_packet_header_t _data;
    36.     mrim_connection_params_t params;
    37.     data.dlen=0;
    38.     data.msg=MRIM_CS_HELLO;
    39.     data.magic=PROTO_VERSION;
    40.     data.seq=0;
    41.     data.magic=CS_MAGIC;
    42.     data.fromport=mraport;
    43.     data.from=0;
    44.     cout<<send(s,(char*)&data,sizeof(data),0)<<endl;
    45.     int received=0;WSASetLastError(0);
    46.     received=recv(s,(char*)&_data,sizeof(_data),0);
    47.     cout<<received<<_data.seq<<endl;
    48.     printf("%d",WSAGetLastError());
    49.     closesocket(s);
    50.     getch();
    51.     WSACleanup();
    52.     return 0;
    53. }
    А ответ не бубум .То есть recv возвращяет 0.Как же надо правильно формировать эти пакеты?
     
  2. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Эм. А разве последний мэйл-агент не jabber использует?
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    http://agent.mail.ru/ru/developers/protocol.html
     
  4. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Так, ну, во-первых, MMP (Mail.Ru Messaging Protocol). Далее: fromport в заголовке ставить не обязательно (оно вроде только в P2P используется, но могу и ошибаться). mrim_connection_params_t – извращение даже для MMP (несмотря на то, что в официальном хэдере есть), читай по-нормальному – это всего лишь один UL.

    Пакеты формировать: пишешь Packet_AppendUL, Packet_AppendLPS (на С++ это будет класс Packet и <<, переопределённый для добавления данных в пакет), когда пакет готов, обновляешь заголовок и выдаёшь пакет байтами. Читать в том же стиле (но сначала копить в буфере минимум sizeof(mrim_packet_header_t) байтов, читать заголовок, потом копить ещё mrim_packet_header.dlen байтов и затем кормить полученный пакет парсеру – а у тебя пока нет никаких гарантий даже того, что recv прочитает весь заголовок).

    И ещё далее: MRIM_CS_HELLO_ACK тебе приходит (seq там такой же, как и у твоего запроса, поэтому и 0), received = 44 (ты не перепутал цифры в консоли?). Шли логин с паролем.
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Мне ничего не приходит .Тута received=recv(s,(char*)&_data,sizeof(_data),0); НУЛЬ ,а в _data.seq мусор как и в _data.dlen :dntknw: И что самое странное сервер сокет незакрывает,бред какой то.
     
  6. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Я к сожалению тоже пользуюсь агентом и что-то он вызывает у меня странные подозрения. Как научусь пользоваться отладчиком - обязательно пройдусь! По-моему, мэил как гугль хочет захватить мир). Агент постоянно обращается к серваку(как правило соединений туча!к разным адресам!), причем через чужие процессы. Файрвол постоянно на него ругается. Очень подозрительная софтина, ИМХО.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    советую начать писать нормальный код а не собранную в кучу ерунду.
     
  8. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    _nic, а что WSAGetLastError говорит в таком случае?
     
  9. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Все по нулям и заголовок ответного пакета не приходит ,и ошибки как бе нету =/
     
  10. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    В первом варианте нашол у себя ляпы в пакете, переделал
    Код (Text):
    1.     data.dlen=0;
    2.     data.proto=PROTO_VERSION;
    3.     data.seq=1;
    4.     data.msg=MRIM_CS_HELLO;
    5.     data.magic=CS_MAGIC;
    6.     data.fromport=0;
    7.     data.from=0;
    8.     for(int i=0;i<16;i++)
    9.     {
    10.         data.reserved[i] = char(0);
    11.     }
    И всеравно те же яйца только в профиль, те по нулям :dntknw: Заметил особенность если dlen сделать больше 0 то сервер начинает ожидать данных то есть мой recv виснет.Значит оно все же парсит то что я шлю,но сцуко молчит что же там не так
     
  11. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    hack_virii
    Есть MMP клиент для Miranda. С открытыми исходниками.
     
  12. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    _nic, да не молчит оно. Молчало бы – как раз и висел бы твой recv до принудительного дисконнекта (полминуты вроде). Сниффером чтоль убедись, что данные приходят. У меня, по крайней мере, твой код работает и в 98, и в XP. Отлаживай свой EXE-шник, ищи у себя проблему. И в личку глянь, да.
    Кстати, когда в последний раз ковырялся, серверу на мусор в reserved было пофиг (по крайней мере, в первом пакете точно).
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    когда-то этим протоколом ящики брутились без задержки...
     
  14. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Спасибо! Буду разбираться! :cool:

    когда-то ящики брутились подменой параметров ссылки почтовому роботу..) :rolleyes:
     
  15. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Никогда они так не брутились.
    Это соц. инженерия, или развод по другому.
    В тех параметрах о которых ты говоришь надо было свой ящик указать и пароль.
    И на него якобы прийдёт пароль от ящика который указан вторым в запросе.
    И некоторые мегахацкеры повелись, даже не подумав что они сами сливают пароль от своего ящика.
    В общем старо это как мир. Хотят ломануть чужой ящик и сливают свой.
    Головой надо думать а не верить всему что пишут.
     
  16. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Перетащил свой код в линукс.Там таже фигня, все по нулям :dntknw: