Resulta que tras mucho pensar, no doy descubierto cual es la manera de autenticar el whats app, para que se conecte.
El whats utiliza el protocolo xmpp, pero cambiado, de forma que a todas las palabras clave se les asigna un número hexadecimal, y luego, se transforma como si fuese un diccionario.
La tabla: http://pastebin.com/EGmkazRj
El proceso de autentificacion es el mismo que xmpp con digest md5.
Primero se envia una peticion con los bytes:
Código:
0x57, 0x41, 0x01, 0x00
A continuación, se envía otro paquete con los datos del telefono, y los métodos de autentificacion disponibles (DIGEST-MD5-1)
Código:
0000 00 19 f8 05 01 a0 8a 84 fc 11 69 50 68 6f 6e 65 ..........iPhone
0010 2d 32 2e 36 2e 34 2d 35 32 32 32 00 08 f8 02 96 -2.6.4-5222.....
0020 f8 01 f8 01 7e 00 07 f8 05 0f 5a 2a bd a7 ....~.....Z*..
Despues de esto, recibimos 3 paquetes.
El primero:
Código:
0000 00 05 f8 03 01 38 8a .....8.
El segundo:
Código:
0000 00 08 f8 02 96 f8 01 f8 01 7e .........~
El tercero:
Código:
0000 00 5b f8 04 1a bd a7 fc 54 62 6d 39 75 59 32 55 .[......Tbm9uY2U
0010 39 49 6a 4d 34 4d 44 63 78 4d 54 45 79 4d 44 45 9IjM4MDcxMTEyMDE
0020 69 4c 48 46 76 63 44 30 69 59 58 56 30 61 43 49 iLHFvcD0iYXV0aCI
0030 73 59 32 68 68 63 6e 4e 6c 64 44 31 31 64 47 59 sY2hhcnNldD11dGY
0040 74 4f 43 78 68 62 47 64 76 63 6d 6c 30 61 47 30 tOCxhbGdvcml0aG0
0050 39 62 57 51 31 4c 58 4e 6c 63 33 4d 3d 9bWQ1LXNlc3M=
En el ultimo paquete hay una cadena codificada en base64, que contiene los siguientes datos:
Código:
nonce="3807111201",qop="auth",charset=utf-8,algorithm=md5-sess
A partir de aquí, una función se encarga de elaborar una cadena de texto, que sera la que realice la autentificación. El proceso es muy similar al descrito aqui:
http://www.cyberhades.com/2011/07/20/solucion-al-reto-zeropwn-wgsbd2/
Pero hay un pequeño problema, que no encuentro la contraseña por ningún sitio. Aqui la función que se encarga de ello, en el whats:
http://pastebin.com/nKxX3vzc
Llama a la variable password en Lwhatsapp/FunXMPP$Connection; Sin embargo, en esa clase, no se define por ninguna parte.
http://ifile.it/ifn396p
http://www.gigasize.com/get/2vn56xdffsc
Las clases de encuentran en la carpeta classes/Whatsapp
La funcion de la página de cyberhades, que interesa es:
Código:
def sasl_md5_chall(uname, pass, realm, nonce, cnonce, nc, digest_uri, qop)
hA1data = Digest::MD5.digest("#{uname}:#{realm}:#{pass}")
hA1data = hA1data + ":#{nonce}:#{cnonce}".force_encoding("UTF-8")
hA1 = Digest::MD5.hexdigest(hA1data)
hA2 = Digest::MD5.hexdigest("AUTHENTICATE:#{digest_uri}")
hash = Digest::MD5.hexdigest("#{hA1}:#{nonce}:#{nc}:#{cnonce}:#{qop}:#{hA2}")
return hash
end
A continuacion se forma el paquete donde va el response, que es el dato que me falta por generar, y que va cifrado en base64:
Código:
dXNlcm5hbWU9IlhYWFhYWFhYWFhYIixyZWFsbT0icy53aGF0c2FwcC5uZXQiLG5vbmNlPSIzODA3MTExMjAxIixjbm9uY2U9IjVBNzU4OUI4LTk0MkItNDlBRi1CMDJCLTdCREZBNjEzMjA0OSIsbmM9MDAwMDAwMDEscW9wPWF1dGgsZGlnZXN0LXVyaT0ieG1wcC9zLndoYXRzYXBwLm5ldCIscmVzcG9uc2U9NjhiMGYwMTQ2MjZhODBlYjcxN2FkYzE0M2I1NTdlMDksY2hhcnNldD11dGYtOA==
que si se descifra es:
Código:
username="XXXXXXXXXXX",realm="s.whatsapp.net",nonce="3807111201",cnonce="5A7589B8-942B-49AF-B02B-7BDFA6132049",nc=00000001,qop=auth,digest-uri="xmpp/s.whatsapp.net",response=68b0f014626a80eb717adc143b557e09,charset=utf-8
Donde obviamente en vez de XXXXXX pone tu número de teléfono.
Mi intención es hacer un programa que me permita enviar un mensaje a un móvil determinado usando el whatsapp.
Si alguien me puede ayudar en esto se lo agradecería