lunes, 23 de diciembre de 2013

Entendiendo el protocolo de WhatsApp: FunXMPP (II)

En la primera parte Entendiendo el protocolo de WhatsApp: FunXPP vimos como funciona el protocolo de comunicación, sus orígenes, la sustitución gracias a una tabla hash para todas las palabras reservadas y la representación de los mensajes enviados, tanto por cliente como servidor.

FunXMPP está basado en XMPP, por lo que la mayoría de los mensajes que observamos en la comunicación siguen las especificaciones de XMPP.

En este post os mostraré los diferentes tipos de mensajes que he podido encontrar, tanto que envíen el terminal a los servidores de WhatsApp, como al revés.

Inicio de Stream: Cliente>Servidor
<stream:stream to="s.whatsapp.net" resource="iPhone-2.6.9-5222">

Inicio de Stream (respuesta): Servidor>Cliente
<stream:stream from="s.whatsapp.net">

Características soportadas: C>S, C>S
<stream:features>
    <receipt_acks />
</stream:features>

Muestra el estado de la cuenta, tipo, si es gratuíta etc. después de acceder: S>C
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"
          status="active"
          kind="free"
          creation="1338578234"
          expiration="1370114234" />

Modificar Status y Nombre: C>S
<presence type="unavailable"
          name="segofensiva" />

Obtener lista de privacidad (Contactos Bloqueados): C>S
<iq  id="1"
     type="get">
    <query xmlns="jabber:iq:privacy">
        <list name="default" />
    </query>
</iq>

Añadir usuario a favoritos: C>S
<presence to="34XXXXXXXXX@s.whatsapp.net"
          type="subscribe" />

Estado del chat (la otra persona está escribiendo): S>C
<message from="34XXXXXXXXX@s.whatsapp.net"
         type="chat"
         t="1343924436">
    <composing xmlns="http://jabber.org/protocol/chatstates" />
</message>

Solicitar última conexión: C>S
<iq  id="1343842817-1"
     to="[email protected]"
     type="get">
    <query xmlns="jabber:iq:last" />
</iq>

Respuesta a petición de última conexión: S>C
<iq  from="34XXXXXXXXX@s.whatsapp.net"
     id="1343842817-1"
     type="result">
    <query xmlns="jabber:iq:last"
           seconds="402" />
</iq>

Ping: S>C
<iq  from="s.whatsapp.net"
     id="1343064803-ping"
     type="get">
    <ping xmlns="urn:xmpp:ping" />
</iq>

Pong should be: C>S
<iq to='s.whatsapp.net'
    id='1343064803-ping'
    type='result'/>

Enviar Mensaje: C>S
<message to="34XXXXXXXXX@s.whatsapp.net"
         type="chat"
         id="1343676064-1">
    <x xmlns="jabber:x:event">
        <server />
    </x>
    <body>
        Hi there!
    </body>
</message>

Marcar mensaje como recibido: C>S
<message to="34XXXXXXXXX@s.whatsapp.net"
         type="chat"
         id="1343062013-1">
    <received xmlns="urn:xmpp:receipts" />
</message>

El mensaje ha llegado al servidor: S>C
<message from="34XXXXXXXXX@s.whatsapp.net"
         id="1343776021-1"
         type="chat"
         t="1343776024">
    <x xmlns="jabber:x:event">
        <id>1343776021-1</id>
        <server />
    </x>
</message>

El mensaje ha llegado al destinatario: S>C
<message from="34XXXXXXXXX@s.whatsapp.net"
         id="1343062012-1"
         type="chat"
         t="1343062013">
    <received xmlns="urn:xmpp:receipts" />
</message>

Noticia del Servidor: S>C
<message from="[email protected]"
         id="15553"
         type="chat"
         t="1343826407">
    <body>
        New version of WhatsApp Messenger is now available. Please visit
        http://www.whatsapp.com/appstore/ and upgrade to the latest version.
        Your upgrade will be free and will bring bug fixes and new features such
        as Group Icons!
    </body>
</message>

Mensaje para envío de localización: S>C
<message from="34XXXXXXXXX@s.whatsapp.net"
         id="1343828342-24"
         type="chat"
         t="1343862000">
    <notify xmlns="urn:xmpp:whatsapp"
            name="segofensiva" />
    <request xmlns="urn:xmpp:receipts" />
    <media xmlns="urn:xmpp:whatsapp:mms"
           type="location"
           url="https://maps.google.com/maps/place?cid=xxxxxxxxxxxxxx"
           latitude="xx.xxxxxx"
           longitude="x.xxxxxx"
           name="Nombre de localizacion">
        [base64 preview image]
    </media>
</message>

Recibiendo tarjeta de contacto: S>C
<message from="34XXXXXXXXX@s.whatsapp.net"
         id="1343828342-25"
         type="chat"
         t="1343862393">
    <notify xmlns="urn:xmpp:whatsapp"
            name="segofensiva" />
    <request xmlns="urn:xmpp:receipts" />
    <media xmlns="urn:xmpp:whatsapp:mms"
           type="vcard"
           encoding="text">
        <vcard name="segofensiva">
            BEGIN:VCARD
            VERSION:3.0
            (...)
            END:VCARD
        </vcard>
    </media>
</message>

Creación de conversación de grupo: S>C
<message from="34XXXXXXXXX[email protected]"
         id="2179389792"
         type="subject"
         t="1345475288"
         author="34XXXXXXXXX@s.whatsapp.net"
         event="add">
    <notify xmlns="urn:xmpp:whatsapp"
            name="segofensiva" />
    <request xmlns="urn:xmpp:receipts" />
    <body>The Subject</body>
</message>

Mensaje a un grupo: S>C
<message from="34XXXXXXXXX[email protected]"
         id="1345473395-5"
         type="chat"
         t="1345477624"
         author="34XXXXXXXXX@s.whatsapp.net">
    <notify xmlns="urn:xmpp:whatsapp"
            name="segofensiva" />
    <request xmlns="urn:xmpp:receipts" />
    <body>Ok</body>
</message>

Cambio de título a un grupo: S>C
<message from="34XXXXXXXXX[email protected]"
         id="1530660056"
         type="subject"
         t="1345593502"
         author="34XXXXXXXXX@s.whatsapp.net">
    <notify xmlns="urn:xmpp:whatsapp"
            name="segofensiva" />
    <request xmlns="urn:xmpp:receipts" />
    <body>WhatsPoke</body>
</message>

Un nuevo usuario accede al grupo: S>C
<presence from="34XXXXXXXXX[email protected]"
          type="available"
          xmlns="w"
          add="34XXXXXXXXX@s.whatsapp.net" />

Usuario es expulsado del grupo: S>C
<presence from="34XXXXXXXXX[email protected]"
          type="available"
          xmlns="w"
          remove="34XXXXXXXXX@s.whatsapp.net"
          author="34XXXXXXXXX@s.whatsapp.net" />

Nosotros somos expulsados del gruoi: S>C
<presence from="34XXXXXXXXX[email protected]"
          type="available"
          xmlns="w"
          remove="34XXXXXXXXX@s.whatsapp.net"
          author="34XXXXXXXXX@s.whatsapp.net" />

Solicitad información del grupo: C>S
<iq  id="1345684458-1"
     to="34XXXXXXXXX[email protected]"
     type="get">
    <query xmlns="w:g" />
</iq>

Recepción de información del grupo: S>C
<iq  from="34XXXXXXXXX[email protected]"
     id="1345684458-1"
     type="result">
    <group id="34XXXXXXXXX-1345475288"
           owner="34XXXXXXXXX@s.whatsapp.net"
           creation="1345475288"
           subject="WhatsPoke"
           s_t="1345593502"
           s_o="34XXXXXXXXX@s.whatsapp.net" />
</iq>

Solicitar información de los participantes del grupo: C>S
<iq  id="1345684623-1"
     to="34XXXXXXXXX[email protected]"
     type="get">
    <list xmlns="w:g" />
</iq>

Respuesta a la petición de información de participantes: S>C
<iq  from="34XXXXXXXXX[email protected]"
     id="1345684623-1"
     type="result">
    <participant jid="34XXXXXXXXX@s.whatsapp.net" />
    <participant jid="34XXXXXXXXX@s.whatsapp.net" />
    <participant jid="34XXXXXXXXX@s.whatsapp.net" />
</iq>


En la próxima entrega nos adentraremos en las particularidades del sistema de autenticación y cifrado de WhatsApp, así como en los errores detectados y cómo poder aprovecharlos, obteniendo las claves de sesión y pudiendo acceder a las conversaciones.

Nos os lo perdáis }:)