whatsapp_300

Reverse Engineering WhatsApp

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.

Join the conversation

  • Jan - 6 years ago

    Hello, http://hammock.codeplex.com/ goes to “The page does not exist”. Is that a mistake?

    • florian - 6 years ago

      Hi Jan, yeah it looks like they changed the hosting. It’s hostet on ohloh now. Thank you

      • Jan - 6 years ago

        Thanks! There were a lot of people on forum asking for Whatsapp on Windows Mobile 7. Your code would have made them really happy. Although I am trying to figure out how to make one to work on PC, but you’re saying it’s not possible due to licensing issue (yeah I understand that sucks a bit) but it is technically possible right?

        What about a webapp? Since looks like it’s just using REST and WebRequest?

        So from what I understand (relying on Google translate), I do a REST to authenticate, then use HttpNotificationChannel for MPNS to send messages? May I ask what I need to send crash log for?

        Thanks! Good work and very interesting!

  • Daniel - 6 years ago

    Hoi Florian

    Danke für den interessanten Artikel. Hab inzwischen den Source mal ein wenig “nachgelesen” – möchte die Whatsapp-Funktionalität auf meinem Nokia N9 implementieren… – scheint mir aber fast zu aufwendig. Hast Du die Sache weiterverfolgt?

    Gruess

    • florian - 6 years ago

      Hallo Daniel

      Danke für dein Feedback. WhatsApp hat sich zum Glück die Rückmeldungen zu herzen genommen und eine neue Version für WP7 herausgebracht. Deshalb ist mein Interesse momentan etwas kleiner geworden, einen Desktop Client zu schreiben.

      Mein damaliger PoC ist leider fehlgeschlagen, habe aber auch nicht sonderlich viel Zeit investiert. Falls du aber etwas brauchst (Source Code usw.) kann ich es dir geben.

      Gruss Florian

      • Hans - 6 years ago

        Hallo Florian,

        ich habe grosses interesse an der portierung. Ich wäre dir sehr dankbar, wenn du mir deine bisherigen Bemühungen überlassen könntest um mir etwas Zeit zu ersparen.

        Gruss Hans

      • Daniel - 6 years ago

        Hoi Florian

        – PoC: Wenns keine Umstände macht gerne, würd mir bestimmt helfen.
        – source: Ich habe mit Reflector und ILSpy gearbeitet. Dein Resultat scheint kompletter. Liegt das an meiner IDE (VS Express), die von Reflector nicht erkannt wird?

        Gruess Daniel

  • Sasch - 6 years ago

    Hey leute, befasse mich auch mit dem reversing & portierung.
    habe schon einige ansätze fertig – wer fragen & interessen hat kann sich gerne bei mir melden :>

    Gruss

    • florian - 6 years ago

      Schick mir doch mal dein Blog oder so, damit man sich diese Ansätze auch anschauen kann.
      Gruss Florian

    • Tarek Galal - 6 years ago

      Hey, I’m porting whatsapp to python. Could you please share your findings with me? Thanks.

  • middey - 6 years ago

    Hi,
    dein Blogpost ist sehr intressant und aufklärend.
    Hast du eventuell das neuste Update von Whatsapp und könntest es mir per mail an middey@gmx.net schicken.
    Ich kann es mir aufgrund fehlendem Windows Phone nicht herunterladen.

    Mfg middey

  • Ich - 6 years ago

    Whatsapp has changed protocol, on old request its answers with:

  • Atzgi - 6 years ago

    Hey Florian,
    WhatsApp nutzt Jabber bzw. benutzt eine eigene verkleinerte Version von XMPP Protocol, welches sie eben FunXMPP genannt haben. Ein sehr netter und interessanter Aufbau muss ich echt sagen. Habe mich damit mal auseinander gesetzt, dass ich sogar schon durch die Hex-Werte im Wireshark erkennen konnte, um welches Packet es sich handelt xD Jedenfalls hatte ich meinen Client in C# geschrieben und es lief am Ende auch endlich. Konnte mich sowohl als Android als auch als iOS ausgeben und einloggen (Haben minimale Unterschiede im Protokol). Android brauchte jedoch ein Update raus, bei dem ich noch mithalten konnte und weiterhin mich als Android-Gerät einloggen. Auf den darauf folgenden Update ging es nur noch, wenn ich vorgab das ich iOS nutze, als Android nicht mehr. Seitdem habe ich keine Lust mehr gehabt. x’D Aber das mit dem Windows sieht recht interessant aus und viel lesbarer. :p