Inicio Foro Noticias Retos Articulos Grupos iHackerss Mapa Creditos Youtube
foros de discusión

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
> Protocolo MSN y minilib
marioly
post Mar 11 2009, 03:39 PM
Post #1


Regia
Group Icon


Group: Root Admin
Posts: 2,380
Joined: 14-April 06
From: Mty, Nuevo Leon
Member No.: 38



Bueno hoy quería hacer algo para MSN jugando, con c#, pero la librería java que siempre usé le tenia que hacer muchos cambios para portarla, además que quería algo ligero, así que escribí una lib "highly based" en dotmsn, si a alguien le es útil aun como algo instructivo, puede cogerla .
Solo necesitaba que reconociera los mensajes, así que no tiene todos los eventos que debería, pero se pueden agregar fácilmente.

Un ejemplo de uso seria:

Llevando tu log a Twitter


CODE
      

static void Main(string[] args)
        {
            MSNMessenger msn = new MSNMessenger();
            msn.Credentials = new Credentials("pepito@hotmail.com", "mipass");
            msn.Connect();

            msn.NotificationProcessor.ConversationCreate += new NotificationProcessor.ConversationCreateHandler(NotificationProcessor_ConversationCreate);
            
            
            Console.Read();
        }

        static void NotificationProcessor_ConversationCreate(object sender, EventArgs args)
        {
            SwitchboardSession ss = sender as SwitchboardSession;
            ss.UserTyping += delegate(object usender, ContactEventArgs uargs)
            {
                Console.WriteLine(uargs.Contact.Mail + " esta escribiendo...");
            };
            
            ss.TextMessageReceived += delegate(object tsender, TextMessageEventArgs targs) {
                Console.WriteLine(targs.From.Mail + " dijo: " + targs.Msg.InnerMessage);
                ((SwitchboardSession)tsender).SendResponse("Tu mensaje sera agregado en twitter :)");

                HttpWebRequest request = HttpWebRequest.Create("http://www.twitter.com/statuses/update.xml") as HttpWebRequest;

                request.Method = "POST";
                request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes("hackerss:mipass")));

                byte[] data = Encoding.UTF8.GetBytes("status=" + targs.Msg.InnerMessage);
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = data.Length;
                request.ServicePoint.Expect100Continue = false;

                ((Stream)request.GetRequestStream()).Write(data, 0, data.Length);
            };
        }




Se ponen tres acciones, una es disparada cuando se crea una conversación, la segunda cuando un contacto empieza a escribir y una ultima cuando el usuario recibe un mensaje. Al recibir este es posteado automáticamente en una cuenta de Twitter avisando al usuario.



Para que esto no sea solo postear un source, explicare un poco el protocolo de msnp, que no se por que nunca lo había hecho.. aunque será una intro rapidísima.


Autenticación:

Se debe conecta con messenger.hotmail.com en el puerto 1863, y hacer la llamada:

CODE
VER 1 MSNP9 CVR0


Comando VER

QUOTE
Parámetros:
El numero de transacción (autoincremental)
La versión soportada del protocolo (MSNP9)
Y el tercero no se que sea.



- Respuesta
CODE
VER 1 MSNP9



Siguiente llamado:

CODE
CVR 2 0x0409 win 5.00 i386 MSNMSGR 5.0.0544 MSMSGS marioly@gmail.com

QUOTE
Parámetros:
- Numero hexadecimal correspondiente al “locale id”
- El OS name
- OS versión
- La arquitectura
- El Id del cliente
- La versión del cliente
- El parámetro MSMSGS es constante
- El login



Siguiente llamada:


CODE
USR 3 TWN I mariol@gmail.com


CODE
Parámetros:
- tipo de autenticación (siempre es TWN)
- siempre "I" (initiating)
- login


La respuesta seria algo como:


CODE
XFR 3 NS 64.4.34.148:1863 0 65.55.219.211:1863


NS significa "notificación server", esta bandera indica que debemos transferirnos a la dirección que se nos da (64.4.34.148:1863). Asi que nos desconectamos y comenzamos transacciones con el nuevo servidor.

Hacemos las llamadas inicialices de igual forma (VER, CVR, USR) y si todo va bien en lugar del XFR (puede volver a redirigirnos y el proceso se repetiría), nos devolverá algo como:


CODE
USR 3 TWN S lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1062764229,kpp=1,kv=5,ver=2.1.0173.1,tpf=43f8a3c9de940c04e3740be46c4d1619

Lo que nos importa es el tercer parámetro. Lo tomamos y ahora tenemos que hacer una conexión con:

https://loginnet.passport.com/login2.srf"

Enviando la cabecera:
CODE
Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" + UrlEncode(tu_login) + ",pwd=" + UrlEncode(tu_password) + ",[b]el_string_tomado[/b]


Y si todo resulta bien nos devolverá algo parecido a esto:

QUOTE
Passport1.4 da-status=success,from-PP='t=9beIWf6w1DRfxjSoyStAnpn40EnGVjHn0mxOt4MY4Pi2syUB*Xki!31NyieFyej7bujHn*s04dOKKcqcAarDJcQfWYvp0HUdEavFOnh*fvIuLrssRjzfYc5man37myHwDq&p=96Iofc8utFKPCBcgcpvQ5CYqIt7Ons2plAy6G9V2XmdwXRAAuyeBVtLWuyinh0apWxumcKtqNY7tiqMdIwfNpUk9xZBDJ0nwPLjaXobVnfUIGMdlCoPOOzzXfNaTVXlI*pfgBd*Q9RoGJVd97FubSB6n8eJHMgUHyWNMFUb**fQqEF!unQ*CUN!E1!nOLltFyt!2782KtCalI$',ru=http://messenger.msn.com


Aquí lo que nos importa es la parte:
from-PP='(.+)', ya que es el ticket para iniciar sesión, asi que lo tomamos evaluando el string.

Teniéndolo ahora hay que notificar al server:

CODE
USR 7 TWN S (nuestro ticket)


Lo que nos devolverá:
CODE
USR 7 OK marioly@gmail.com 1 0



Listo, ¡estamos logueados!.


Ahora podemos sincronizar nuestra lista de contactos:
CODE
SYN 8 0


(0 es la versión de cache, si no existe te devolverá la lista completa)


Y cambiar nuestro estado:
CODE
CHG 9 NLN 0





Iniciando una conversación:

Cuando alguien inicia una conversación recibiremos un llamado RNG:


CODE
RNG 1445087126 64.4.45.64:1863 CKI 13104222.108235211 pepito@gmail.com Pepito


En el segundo parámetros nos envía una IP a la debemos conectar para aceptar la conversación, el cuarto parámetro es un string para autenticación, el quinto y sexto las identificaciones de quien inicio la conversación.

Nota: Las transacciones para esta conversación serán completamente independientes de la otra conexión.

* Conectamos al server.
Contestamos la llamada:

CODE
ANS 1 marioly@gmail.com 13104222.108235211 1445087126

Lo que nos devolvería algo como:
CODE
ANS 1 OK


Ya estamos listos para conversar con nuestro contacto.



Notas:
El server de tiempo en tiempo nos enviara llamadas PNG que seria el analogo a las llamadas PING/PONG que todos conocemos, solo debemos volver:
CODE
QNG


También después de un lapso nos puede enviar "challenges", algo como:

CODE
CHL 0 1557013157198894133


Se supone que para responder debes calcular el hash del código que se envía junto con tu ID de sesión, pero hoy por hoy solo con responder:

CODE
QRY


Te vale.

Debes responder en los próximos 20 segundos de recibir el CHL, y el comando de respuesta debe ir sin nueva linea ( \n ) al final.


En http://www.hypothetic.org/docs/msn/c contaban que este comando era para mantener fuera a los desarrollos de terceros, no se que tan cierto sea.




Bueno, esto es lo básico, perdona que sea breve, estoy corta de tiempo sad.gif



Attached File(s)
Attached File  minimsn.zip ( 7.01K ) Number of downloads: 29
 


--------------------
Go to the top of the page
 
+Quote Post
Bucio
post Mar 11 2009, 03:52 PM
Post #2


Descaradamente Guapo =Þ
Group Icon


Group: Colaborador
Posts: 4,522
Joined: 26-April 06
From: Chiapas México.
Member No.: 382



Gracias smile.gif


--------------------
Go to the top of the page
 
+Quote Post
phicar
post Mar 11 2009, 04:33 PM
Post #3


Recién llegado
*


Group: Hackerss Member
Posts: 9
Joined: 29-December 07
From: Bogotá
Member No.: 3,856



Hola, oye super que publicas esto, leo que tas grave de tiempo, estoy usando el msnp12 con java
Hago todo bien hasta el momento de pasar al passport...hago el factory con ssl, y pues mando lo siguiente

String tmp = "GET /login2.srf HTTP/1.1\n";
tmp += "Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in="+a+",pwd="+b+","+partes[partes.length-1].substring(partes[partes.length-1].indexOf("lc"),partes[partes.length-1].length())+"\n";


pd: lo mando con urlencode(password y mail)
pd2:programacion del ssl
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket log = (SSLSocket)factory.createSocket(InetAddress.getByName("login.passport.com"),443);
pd3:Nu veo el error!!!!!!!
pd4:aspera tu firma Bucio tongue.gif
pd5:Gracias de antemano smile.gif
Go to the top of the page
 
+Quote Post
pelu
post Mar 14 2009, 10:35 AM
Post #4


Talibán del software libre.
****


Group: Hackerss Member
Posts: 658
Joined: 21-April 06
From: La concha de la lora
Member No.: 164



gracias marioly.

nos os da la sensación, viendo un poco por encima, que el protocolo este está super mal optimizado???

saludos


--------------------
Go to the top of the page
 
+Quote Post
rkgarcia
post Mar 14 2009, 11:02 AM
Post #5


Conociendo el foro
**


Group: Hackerss Member
Posts: 29
Joined: 4-March 09
From: Oaxaca
Member No.: 7,133



Probé con netcat jajajaja pero no pude escribir lo suficientemente rápido y me desconecto después haré más pruebas y les cuento smile.gif


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic

 

RSS Lo-Fi Version Time is now: 6th September 2010 - 08:17 AM