Protocolo MSN en C#

Iniciado por Hendrix, 3 Junio 2007, 01:28 AM

0 Miembros y 2 Visitantes están viendo este tema.

Hendrix

Aqui les dejo este proyecto....se que el codigo se puede optimizar...pero son la 1:24 am y no hay ganas...xDDD

Lo que hace este codigo es conectarse al MSN mediante el protocolo del MSN:

Descargar/Ver

En principio lo que hace es pedirte tu cuenta, tu pass, conectarse y te enseña el nick tal y como lo tienes tu en el MSN (ya que por defecto te los pasan codificado...e implementado una funcion que lo descodifica).

El codigo es el siguiente:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;


namespace ConsoleApplication2
{
    class Program
    {
        static string cuenta;
        static string pass;

        public bool IsNumeric(object epresionje)
        {
            bool isNum;
            double retNum;

            isNum = Double.TryParse(Convert.ToString(epresionje), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
            return isNum;
        }

        public string urldecode(string cadena)
        {
            char p = '%';
            string hexa;
            long dec;
            char asc;
            string resultado = "";

            Program hen = new Program();

            string[] arr = cadena.Split(p);
            foreach (string q in arr)
            {
                if (q.Length > 0)
                {
                    hexa = q.Substring(0, 2);
                    if (hen.IsNumeric(hexa) == true)
                    {
                        dec = Convert.ToInt64(hexa, 16);
                        asc = Convert.ToChar(dec);
                        resultado = resultado + asc + q.Substring(2);
                    }
                    else
                    {
                        resultado = resultado + q;
                    }

                }
            }

            return resultado;

        }

        public string depurarip(string direc)
        {
            string a;
            int b;
            string c;

            a = direc.Substring(9);
            b = a.IndexOf(":");
            c = a.Substring(0, b);
           
            return c;

        }

        public string Sacacookie(string resultado)
        {
            int a;
            string b;
            int c;
            string d;


            a = resultado.IndexOf("'t=");
            b = resultado.Substring(a + 2);
            c = b.IndexOf("'");
            d = b.Substring(1, c);

            return d;
        }





        static void Main(string[] args)
        {

            Console.Write("Introduce tu Cuenta: ");
            cuenta = Console.ReadLine();
            Console.Write("Introduce la Pass: ");
            pass = Console.ReadLine();


            string cabecera = "VER 1 MSNP9 MSNP8 CVR0\r\n";
            string respuesta = "";
            string cab2 = "CVR 2 0x0C0A winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS " + cuenta + "\r\n";
            string cab3 = "USR 3 TWN I " + cuenta + "\r\n";
            string cab4 = "VER 4 MSNP9 MSNP8 CVR0\r\n";
            string cab5 = "CVR 5 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS " + cuenta + "\r\n";
            string cab6 = "USR 6 TWN I " + cuenta + "\r\n";
            string cab7;
            string nick;
            Byte[] Send6 = Encoding.ASCII.GetBytes(cab6);
            Byte[] Rec6 = new Byte[255];
            Byte[] Send5 = Encoding.ASCII.GetBytes(cab5);
            Byte[] Rec5 = new Byte[255];
            Byte[] Send4 = Encoding.ASCII.GetBytes(cab4);
            Byte[] Rec4 = new Byte[255];
            Byte[] Send3 = Encoding.ASCII.GetBytes(cab3);
            Byte[] Rec3 = new Byte[255];
            Byte[] Send2 = Encoding.ASCII.GetBytes(cab2);
            Byte[] Rec = new Byte[255];
            Byte[] SendBytes = Encoding.ASCII.GetBytes(cabecera);
            Byte[] RecvBytes = new Byte[255];
            int bytes;
            string IPnueva;
            string cookie;
            string cuentaurl = cuenta.Replace("@", "%40");


            IPHostEntry address = Dns.GetHostEntry("messenger.hotmail.com");
            IPEndPoint Ep = new IPEndPoint(address.AddressList[0], 1863);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                // Primera conexión
                socket.Connect(Ep);
                socket.Send(SendBytes, SendBytes.Length, SocketFlags.None);
                bytes = socket.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None);
                respuesta = Encoding.ASCII.GetString(RecvBytes, 0, bytes);

                //Segunda Conexión
                socket.Send(Send2, Send2.Length, SocketFlags.None);
                bytes = socket.Receive(Rec, Rec.Length, SocketFlags.None);
                respuesta = Encoding.ASCII.GetString(Rec, 0, bytes);

                //tercera Conexión
                socket.Send(Send3, Send3.Length, SocketFlags.None);
                bytes = socket.Receive(Rec3, Rec3.Length, SocketFlags.None);
                respuesta = Encoding.ASCII.GetString(Rec3, 0, bytes);

                Program o = new Program();

                IPnueva = o.depurarip(respuesta);

                socket.Close();

                Console.WriteLine("\nConectando...");

                //Cuarta conexión
                IPHostEntry addressa = Dns.GetHostEntry(IPnueva);
                IPEndPoint Epo = new IPEndPoint(addressa.AddressList[0], 1863);
                Socket socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                socket2.Connect(Epo);
                socket2.Send(Send4, Send4.Length, SocketFlags.None);
                bytes = socket2.Receive(Rec4, Rec4.Length, SocketFlags.None);
                respuesta = Encoding.ASCII.GetString(Rec4, 0, bytes);

                //Quinta conexión
                socket2.Send(Send5, Send5.Length, SocketFlags.None);
                bytes = socket2.Receive(Rec5, Rec5.Length, SocketFlags.None);
                respuesta = Encoding.ASCII.GetString(Rec5, 0, bytes);

                //Sexta conexión
                socket2.Send(Send6, Send6.Length, SocketFlags.None);
                bytes = socket2.Receive(Rec6, Rec6.Length, SocketFlags.None);
                respuesta = Encoding.ASCII.GetString(Rec6, 0, bytes);

                cookie = respuesta.Substring(12);


                //Septima conexión
                string tiket;
                string head;

                cab7 = "Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" + cuentaurl + ",pwd=" + pass + "," + cookie + "\r\n";
                WebRequest request = WebRequest.Create("https://login.passport.com/login2.srf");
                request.Headers.Add("Authorization", cab7);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                head = Convert.ToString(response.Headers);
                tiket = o.Sacacookie(head);
                response.Close();

                //Ultima conexión
                string cab8 = "USR 7 TWN S t=" + tiket + "\r\n";
                Byte[] Send8 = Encoding.ASCII.GetBytes(cab8);
                Byte[] Rec8 = new Byte[255];

                socket2.Send(Send8, Send8.Length, SocketFlags.None);
                bytes = socket2.Receive(Rec8, Rec8.Length, SocketFlags.None);
                respuesta = Encoding.ASCII.GetString(Rec8, 0, bytes);

                nick = respuesta.Substring(cuenta.Length + 10);

                string decode;
                int fin;

                fin = nick.IndexOf("??$");
                nick = nick.Substring(0, fin);

                decode = o.urldecode(nick);

                Console.WriteLine("\n\nTu nick es: {0}",decode);

                Console.Read();
            }
            catch
            {
                Console.WriteLine("Ocurrió un error");
                Console.Read();
            }
        }
    }
}


A partir de esta base se pueden hacer otros proyectos como son versiones del MSN tipo AMSN, se pueden hacer MSN nukers....eso lo dejo a vuestra elección.

Un Saludo.  ;)

PD: Quiero dar las gracias a MazarD, sin su ayuda no habria podido conectar con login.passport.com... :xD :xD
"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

BADBYTE-K

Muchas gracias por la info, valiosisima

Saludos

Meta

¿Para qué es todo esto exactamente?

¿Con qué idea?

Menudo curro ha hecho.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Hendrix

Esta parrafada implementa el protocolo del MSN a traves de C#....es decir, implementa le mismo protocolo que implementa tu MSN....podria hablar con alguien a traves de la consola del C# o si le diseñara una GUI podria hacer una version del MSN como es el AMsn... ;) ;)

Este codigo se conecta y te presenta tu nick actual del msn en la consola.

Un Saludo.  ;)

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

Meta

Eso si ya me interesa más.

Pero ya que hay messenger. No creo que haya motivación para hacer algoq ue ya existe.

Es decir. ¿Para qué reinventar la rueda?
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

BADBYTE-K

Hola

Para fines didacticos esta muy bien, aparte la satisfaccion de desarrollar un proyecto propio en base a la investigacion del protocolo. Luego, lo considero interesante ya que se ponen en practica varios conceptos de c# y ademas tecnicas de trabajo con sockets con c#.

Meta

Eso es cierto, no se nada de socket, pero para los que lo sepan, que hagna ejemplillos para aprender.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

sirdarckcat

Hay algunas clases que te permiten establecer una conversación con algun conteacto, etc..

http://www.wox.no/
http://www.firstfloorsoftware.com/
http://members.home.nl/b.geertsema/dotMSN/

Saludos!!

Hendrix

Meta, si quieres lo puedo ampliar hasta un codigo en el que se pueda ver la lista de contactos y hablar con ellos.... ;) ;)

Un Saludo.  ;)

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

anion

se puede hacer que una vez que se conecta a la red del msn, independiediente del contanto que nos envia un mensaje responda algo a ese contacto, por ej, si cualquiera de los contacto envia la palabra "hola", responda algo, si envia "chau", responde otra.