Seit ungefähr einer Woche ist es nun auch für Windows Phone 7 Benutzer möglich, WhatsApp zu benutzen. Das Mango Update hat es ermöglicht die App auf das WP7 zu bringen.
Nach kurzem einarbeiten, musste ich Festellen, dass die Performance sehr zu wünschen übrig lässt. Am Computer wäre deswegen ein Desktop App viel praktischer. Dabei kam mir der Gedanke, dass ein WP7 App ja eine Silverlight Applikation ist. Also mit .NET Entwickelt und dadurch auch deompilierbar.
Hier eine kurze Zusammenfassung meines Reverse Engineering der WhatsApp_v1.1.xap:
Rest Service
Um einen eigene Desktop Client zu schreiben, brauche ich die Informationen über die Connection. Durch den Sourcecode kann man an alle wichtigen Daten und Informationen herankommen.
WhatsApp funktioniert, für die Registrierung und Authentifikation, mit einem Rest Service, welcher über die Hammock Library angesprochen wird.
Den Code dazu findet man im Ordner /verify/. Da gibts es verschiedene Klassen (Alle für die Registrierung), welche an den Restservice von WhatsApp Daten schicken:
/*File: VerfiyStart.cs Zeile: 152*/
string str = ((byte[]) DeviceExtendedProperties.GetValue("DeviceUniqueId")).ToPassword();
System.Net.WebRequest that = System.Net.WebRequest.Create(
string.Format("https://r.whatsapp.net/v1/exist.php?cc={0}&in={1}&udid={2}",
Settings.CountryCode, Settings.PhoneNumber, str));
that.Headers[System.Net.HttpRequestHeader.UserAgent] = App.GetUserAgent();
Microsoft Push Notification Service (MPNS)
Die Push Nachrichten werden über den MPNS Service, von WhatsApp abgerufen:
/*File: App.cs Zeile: 222*/
string channelName = "message";
string serviceName = "mpns.whatsapp.net";
HttpNotificationChannel that = HttpNotificationChannel.Find(channelName);
if (that == null)
{
that = new HttpNotificationChannel(channelName, serviceName);
that.Open();
}
FunXMPP, FunRunner und FunEventHandler
Diese drei Klassen sind für die Kommunikation mit dem eigentlich WhatsApp Server zuständig. In der FunXMPP.cs sind verschiedenste weitere Klassen enthalten, wie zum Beispiel die Connection Klasse.
Die FunEventHandler.cs beinhaltet alle Eventhandler welche in WhatsApp benötigt werden und die FunRunner.cs ist eine Klasse, welche die Connection aus der FunXMPP etwas vereinfacht.

Jabber & WhatsApp
In der Klasse FunXMPP findet man auch ein Array mit verschiedensten Einträgen. Unter anderem zwei Jabber URL’s:
/*File: FunXMPP.cs Zeile: 83*/
strArray[0x41] = "http://etherx.jabber.org/streams";
strArray[0x42] = "http://jabber.org/protocol/chatstates";
Basiert WhatsApp eigentlich auf Jabber? Oder was wird da genau abgefragt? Denn diese etherx.jabber.org Adresse wird an ganz vielen anderen Stellen in der FunXMPP.cs verwendet!
Crash-log
Zum Schluss, will ich noch erwähnen, dass das Crash-log direkt an folgende Adresse geschickt wird:
https://crashlog.whatsapp.net/upload.php
RestClient client2 = new RestClient {
Authority = "https://crashlog.whatsapp.net",
UserAgent = userAgent,
Path = "upload.php"
};
RestClient client = client2;
client.AddField("from", Settings.CountryCode + Settings.PhoneNumber);
client.AddFile("file", "log.gz", baseOutputStream);
client.BeginRequest();
Ich frage mich, wie lange es dauert, bis Sie eine ZipBomb zugeschickt bekommen…
Ist ein App möglich?
Die Frage ist jetzt natürlich, ob ein App möglich ist und es sich Lohnen würde, eines zu entwickeln. Ich werde den Source Code noch mehr unter die Lupe nehmen und eventuell einen kleinen PoC erstellen, aber wirklich eine App für den Desktop ist rein aus Lizenz technischen Gründen nicht möglich.
Ich will auch noch anmerken, dass ich den Code nur ganz kurz angeschaut habe, es könnten sich in meiner Beschreibung auch Interpretationsfehler eingeschlichen haben.