sábado, 2 de agosto de 2008

[ES] introduccion al protocolo

En este primer post voy a cubrir la parte basica que se necesita saber para hablar con el server de MSN.

En una sesion normal se deben hacer requests a diferentes servers, pero una coneccion es basica y debe mantenerse activa
a traves de toda la sesion, esa coneccion es mantenida con el servidor de notificacion (NS) , inicialmente la coneccion
es realizada con el host messenger.hotmail.com en el puerto 1863 y es administrada a traves de comandos escritos en
texto plano.

Estos comandos tienen el siguiente formato

Command transaction_id [param1 param2 ... paramN] [payload_size]\r\n
[payload_body]

* command es generalmente una palabra de 3 letras como VER, MSG etc.
* transaction_id es un numero que representa el orden del comando, comienza con 1 y es incrementado cada vez que un comando se envia. Cuando se envia una respuesta a un comando enviado por el server, se debe establecer el tid (abreviacion de transaction_id de ahora en adelante) al valor que envio el server. Algunos comandos ponen otro contenido
como segundo parametro, pero son solo pocas excepciones.
* un numero de parametros opcionales separadas por un espacio vienen a continuacion, el numero de parametros depende del comando. Pueden contener cualquier informacion que sea util para el comando.
* payload_size es el numero de bytes (tamaño) del payload, el cual viene despues de \r\n (el payload existe solo en
comandos especificos como por ejemplo, GCF, MSG y otros..
* payload es el contenido del cuerpo del comando y contiene informacion referida al comando.

Dejemos de hablar y vamos a ponernos manos a la obra, enviemos el primer comando al server.
Para hacer este post una introduccion, solo voy a usar netcat, el proximo post va a explicar sockets en python los cuales son solo un wrapper sobre los sockets en C asi que es simple seguirlo para programadores de cualquier lenguaje.

para empezar, abri una terminal y tipea

$ netcat messenger.hotmail.com 1863[enter]

luego de ese comando, se va a ver una linea en blanco y nada mas, eso significa que estamos conectados con el server, a continuacion, ahora escribi:

VER 1 MSNP13 CVR0[enter]

y vas a obtener:

VER 1 MSNP13 CVR0

(el ultimo caracter es un cero)

que significa? es el primer mensaje al server y su respuesta, el comando es una introduccion y le dice al server algo como "Hola, deseo iniciar una nueva sesion, hablo la version 13 del protocolo (MSNP13)", entonces el server nos responde lo mismo, eso significa que habla la misma version, asi podemos continuar.

se puede enviar mas de una version y el server respondera las versiones que prefiere, solo le enviamos la version 13 del protocolo, pero aca hay un ejemplo con multiples versiones:

enviemosle 3 versiones

mariano@mousehouse:~$ netcat messenger.hotmail.com 1863
VER 1 MSNP13 MSNP14 MSNP15 CVR0
VER 1 MSNP15 MSNP14 MSNP13 CVR0

parece que prefiere MSNP15 :D

veamos por donde andan los desarrolladores de MSN

mariano@mousehouse:~$ netcat messenger.hotmail.com 1863
VER 1 MSNP13 MSNP14 MSNP15 MSNP16 MSNP17 CVR0
VER 1 MSNP17 MSNP16 MSNP15 MSNP14 MSNP13 CVR0

MSNP17?!? :D

veamos mas...

mariano@mousehouse:~$ netcat messenger.hotmail.com 1863
VER 1 MSNP13 MSNP14 MSNP15 MSNP16 MSNP17 MSNP18 CVR0
VER 1 MSNP17 MSNP16 MSNP15 MSNP14 MSNP13 CVR0

no, solo MSNP17

solo para que veas mas comandos, voy a enviar comandos extra que seran explicados luego.

nos conectamos de nuevo con el server y le enviamos algunos comandos.

mariano@mousehouse:~$ netcat messenger.hotmail.com 1863
VER 1 MSNP13 CVR0
VER 1 MSNP13 CVR0
CVR 2 0x0c0a winnt 5.1 i386 MSNMSGR 8.0.0792 msmsgs xmxsxn@hotmail.com
CVR 2 8.1.0178 8.1.0178 8.1.0178 http://msgruser.dlservice.microsoft.com/download/5/6/4/5646481F-33EF-4B08-AF00-4904F7677B89/ES/Install_WLMessenger.exe http://get.live.com/es
USR 3 TWN I xmxsxn@hotmail.com
XFR 3 NS 207.46.110.94:1863 U D

veamoslo por comando

>>> son mensajes enviados
<<< son mensajes recibidos

>>> VER 1 MSNP13 CVR0
<<< VER 1 MSNP13 CVR0

VER es igual a la explicacion anterior

>>> CVR 2 0x0c0a winnt 5.1 i386 MSNMSGR 8.0.0792 msmsgs xmxsxn@hotmail.com
<<< CVR 2 8.1.0178 8.1.0178 8.1.0178 http://msgruser.dlservice.microsoft.com/download/5/6/4/5646481F-33EF-4B08-AF00-4904F7677B89/ES/Install_WLMessenger.exe http://get.live.com/es

con el comando CVR enviamos nuestra informacion de version al servidor:

* 0x0c0a es un conjunto de banderas que indican nuestras capacidades, voy a explicar esto luego, pero con las banderas que envio aca se puede seguir desarrollando sin nungun problema.
* "winnt i386" es nuestro sistema operativo :D
* 8.0.0792 es la version de nuestro cliente ;)
* el ultimo campo es la cuenta con la cual nos estamos intentando conectar (esa cuenta es mi cuenta de pruebas)

recibimos una respuesta que no es muy util, luego nos presentamos, obtenemos una respuesta y somos desconectados (volvemos a la consola)

>>> USR 3 TWN I xmxsxn@hotmail.com
<<< XFR 3 NS 207.46.110.94:1863 U D

XFR es el comando de transferencia, y significa que el server quiere que nos conectemos con otro server ubicado en 207.46.110.94:1863

entonces corremos netcat de nuevo apuntando al nuevo servidor, y hacemos todo de nuevo

mariano@mousehouse:~$ netcat 207.46.110.94 1863
VER 1 MSNP13 CVR0
VER 1 MSNP13 CVR0
CVR 2 0x0c0a winnt 5.1 i386 MSNMSGR 8.0.0792 msmsgs xmxsxn@hotmail.com
CVR 2 8.1.0178 8.1.0178 8.1.0178 http://msgruser.dlservice.microsoft.com/download/5/6/4/5646481F-33EF-4B08-AF00-4904F7677B89/ES/Install_WLMessenger.exe http://get.live.com/es
USR 3 TWN I xmxsxn@hotmail.com

hasta aca todo es como antes, pero ahora no nos transfiere (podemos obtener mas de una transferencia, pero hoy tenemos suerte)

entonces recibimos
<<< GCF 0 6660

el comando GCF con payload_size en 6660 y despues recibimos 6660 bytes de xml que basicamente dicen que palabras debemos filtrar en el cliente (que lindo :P)

<<< GCF 0 6660
[mucho xml va aca]
<<< USR 3 TWN S ct=1216861501,rver=5.5.4177.0,wp=FS_40SEC_0_COMPACT,lc=1033,id=507,ru=http:%2F%2Fmessenger.msn.com,tw=0,kpp=1,kv=4,ver=2.1.6000.1,rn=1lgjBfIL,tpf=b0735e3a873dfb5e75054465095398e0

el ultimo comando sera usado luego para la autenticacion passport.

ok, eso es todo por hoy, la proxima vez voy a escribir sobre como hacerlo en python (y quizas otro lenguaje tambien)

No hay comentarios: