C# Отправка сообщения MRIM

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Vlad_IT, 4 Oct 2011.

  1. Vlad_IT

    Vlad_IT New Member

    Joined:
    2 Oct 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    -6
    Добрый вечер. Никто не знает как можно отправить сообщение на агент, я уже покопавшись нашел решение для авторизации и отправки смс, но отправку обычного сообщения сделать не могу. Прошу помочь, очень долго уже решаю этот вопрос. За ранее очень благодарен.
    Вот собственно код

    http://www.codepaste.net/e1vhfu
     
    #1 Vlad_IT, 4 Oct 2011
    Last edited: 4 Oct 2011
  2. zoke

    zoke Member

    Joined:
    5 Sep 2010
    Messages:
    90
    Likes Received:
    9
    Reputations:
    5
    http://agent.mail.ru/ru/developers/protocol.html?Submit=%D0%9F%D1%80%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D1%8E+%D1%81%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5
     
  3. Vlad_IT

    Vlad_IT New Member

    Joined:
    2 Oct 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    -6
    zoke, это я видел, спасибо. Но я уже разобрался. Вот метод отправки сообщения
    Code:
     
    public void Send_Message(string to, string text)
            {
                mrim_packet_header Pack = new mrim_packet_header(Msg.CS_MAGIC, Msg.PROTO_VERSION, User_Struct.Seq, Msg.MRIM_CS_MESSAGE, 1, 0, 0, 0, 0, 0, 0);
                Pack.Add_Date_UL(new long[] { 1 });
                Pack.Add_Date_LPS(new string[] { to.Trim(), text.Trim(), text.Trim() });
                byte[] Auth2 = Pack.Generat_Packet();
                Console.WriteLine(BitConverter.ToString(Auth2));
                Sock.Send(Auth2);
                //Buf = new byte[48];
                //Sock.Receive(Buf);
            }
    
     
  4. zoke

    zoke Member

    Joined:
    5 Sep 2010
    Messages:
    90
    Likes Received:
    9
    Reputations:
    5
    тебе тоже, может мне пригодится :)
     
  5. Vlad_IT

    Vlad_IT New Member

    Joined:
    2 Oct 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    -6
    Только тут уже возник вопрос добавления контакта. Кажется это сделать никак, по протоколу следую, все равно не то. Не кто не знает как добавить контакт?
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Code:
    int mmp_add_contact(SOCKET sock,char *email) 
    
    {
    
    	char *buf=(char *)_alloc(opt.message_size*100); // а вот от балды
    
    	char *p;
    
    	unsigned int size=8,n,i; // ибо первые 4 нуля
    
    
    
    	// LPS email
    
    	p=email; while(*p++!=0);
    
    	n=(p-email)-1;
    
    	my_memcpy(&buf[size],&n,4); size+=4;
    
    	my_memcpy(&buf[size],email,n); size+=n;
    
    
    
    	// LPS add_name
    
    	wchar_t add_name[28]; // имя в UNICODE как оно будет зватся у нас в контакт листе
    
    	n=wsprintfW(add_name,L"%I64x",__rdtsc())*2;
    
    
    
    	//n=sizeof(add_name)-sizeof(wchar_t);
    
    	my_memcpy(&buf[size],&n,4); size+=4;
    
    	my_memcpy(&buf[size],(char *)add_name,n); size+=n;
    
    	size+=4; // 4 байта нулей
    
    
    
    	p=(char *)_alloc(opt.message_size*100); // терь формируем мессадж
    
    	n=2; i=0; 
    
    	my_memcpy(&p[i],&n,4); i+=4; // типа 2 поля
    
    	// LPS ник который отобразится в popop в unicode возмем такойже
    
    	//wchar_t cont_nick[]=L"Gar|k";
    
    	//n=sizeof(cont_nick)-sizeof(wchar_t);
    
    	//wchar_t cont_nick[28];
    
    	n=wsprintfW(add_name,L"%I64x",__rdtsc())*2;
    
    	my_memcpy(&p[i],&n,4); i+=4;
    
    	my_memcpy(&p[i],(char *)add_name,n); i+=n;
    
    
    
    	// LPS сообщения которое доставится
    
    	char *m=(char *)opt.format_message;
    
    	wchar_t *messagew;
    
    	if(opt.count_url>0) {
    
    		messagew=(wchar_t *)_alloc(opt.message_size+1024);
    
    		n=wsprintfW(messagew,(LPCWSTR)opt.format_message,opt.list_url[my_rand2(0,opt.count_url)]);
    
    		n=(n*sizeof(wchar_t));
    
    		m=(char *)messagew;
    
    	}else
    
    	{
    
    		n=(opt.message_size)*sizeof(wchar_t);
    
    	}
    
    	my_memcpy(&p[i],&n,4); i+=4;
    
    	my_memcpy(&p[i],m,n); i+=n;
    
    
    
    	if(opt.count_url>0) _free(messagew);
    
    
    
    	// теперь все это дело загоняем в base64
    
    	base64_encode(p,i,&buf[size+4],72);
    
    	_free(p);
    
    	// щитаем размер base64
    
    	p=&buf[size+4]; while(*p++!=0);
    
    	n=(p-&buf[size+4])-1;
    
    	my_memcpy(&buf[size],&n,4); size+=4;
    
    	size+=n+4;  // ибо в конце нулик завершающий
    
    
    
    
    
    	n=SendPack(sock,MRIM_CS_ADD_CONTACT,size,buf); 
    
    	_free(buf);
    
    	return n;
    
    }
     
    _________________________
    1 person likes this.
  7. Vlad_IT

    Vlad_IT New Member

    Joined:
    2 Oct 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    -6
    Хотя врятли получиться. Gar|k, скажите пожалуйста, какой способ вы использовали? Вот например я находил такой способ
    Но он не идет, видимо старый.
     
  8. psyh0y

    psyh0y New Member

    Joined:
    24 Aug 2011
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    my_memcpy - Гарик а где документирована эта функция?
     
  9. Swat2k

    Swat2k New Member

    Joined:
    12 Sep 2007
    Messages:
    38
    Likes Received:
    4
    Reputations:
    0
    используй memcpy() , заместо my_memcpy()
     
  10. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 Vlad_IT, способ который я использовал?
    Снифаем трафик выбираем из него нужный пакет. Разбираем его в hex редакторе и повторяем его программно.

    Функция которую я написал справедлива для протокола агента версии 5.7

    Ну по коду смотри.
    В общем все тоже самое что ты и написал по сути, не идет - проверь версию протокола которую используешь
     
    _________________________
  11. Vlad_IT

    Vlad_IT New Member

    Joined:
    2 Oct 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    -6
    У меня вот так написано.

    PROTO_VERSION = 0x10008;

    Но как понять какая это версия?. Из hex в dec выходит 65544. Это значит 6.5544, точнее 6.5???

    Когда делал версию 1.7, вот так
    PROTO_VERSION = ((((long)(1)) << 16) | (long)(7));
    то даже авторизация не удавалась.

    На 5.7 тоже не идет
    PROTO_VERSION = ((((long)(5)) << 16) | (long)(7));
     
    #11 Vlad_IT, 6 Oct 2011
    Last edited by a moderator: 6 Oct 2011
  12. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    для версии под которой работает 5.7 (1.22)

    Code:
    // версия протокола
    
    #define PROTO_VERSION_MAJOR     1
    
    #define PROTO_VERSION_MINOR     22
    
    #define PROTO_VERSION ((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR))
    
    
    
    #define PROTO_MAJOR(p) (((p)&0xFFFF0000)>>16)
    
    #define PROTO_MINOR(p) ((p)&0x0000FFFF)
    
     
    _________________________
  13. Vlad_IT

    Vlad_IT New Member

    Joined:
    2 Oct 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    -6
    Тоже не идет((. А если я попрошу кого нибудь скомпилировать мне консольный файл, который принимает два параметра запуска, адрес и текст сообщения для выполнения только одной функции, добавления контакта, это будет слишком нагло? Я знаю, это конечно нагло. Но и я когда нибудь помогу)

    Всем спасибо, разобрался)
     
    #13 Vlad_IT, 6 Oct 2011
    Last edited by a moderator: 7 Oct 2011