Was ich gelernt habe, das Facebook Messenger Soccer-Spiel zu hacken

Vor kurzem, während der letzten Fußball-Europameisterschaft, hat Facebook ein kleines Spiel in der Messenger-App eingeführt, mit dem Sie trotz seiner Einfachheit Stunden und Stunden verlieren.

Wenn Sie es nicht bemerkt haben, lesen Sie diesen Artikel über Mashable.

Ich muss zugeben… ich bin total begeistert von diesem Spiel, also war meine beste Punktzahl 9 .

Aber als Entwickler war das Beste, was ich tun konnte, meine Freunde zu schlagen, indem ich das Spiel hackte.

Ich dachte wirklich, das wäre einfach.

Der erste Weg: Hören Sie auf HTTP-Anfragen

Bei der Entwicklung von Apps wird Ihnen sofort klar, dass Sie ein HTTP-Debugger-Tool benötigen, um eingehenden / ausgehenden Datenverkehr für Ihre APIs zu analysieren.

Charlesist das beste Werkzeug, das ich gefunden habe, um diese Aufgabe zu erfüllen. Es verfügt über eine sehr intuitive Benutzeroberfläche, die Sie problemlos für Debugging- und Reverse Engineering-Zwecke verwenden können.

Es sollte an diesem Punkt enden: Ich müsste die von der Facebook-App verwendete API analysieren und sie einfach mit CURL wiedergeben, während ich die Daten und die an den Server gesendete Punktzahl bearbeite.

Natürlich sind die API-Aufrufe in HTTPS, daher sind sie verschlüsselt. Charles kann jedoch als Man-in-the-Middle-HTTPS-Proxy verwendet werden, sodass Sie die Kommunikation zwischen Webbrowser und SSL-Webserver im Klartext anzeigen können .

Perfekt! Also habe ich das Root-Charles-Zertifikat auf dem iPhone installiert und versucht, den Datenverkehr zu überprüfen. Alle HTTP-Anrufe an die Facebook-Server wurden jedoch während der SSL-Handshake-Phase im Voraus abgelehnt.

Bei einigen Nachforschungen stellte ich fest, dass einige Unternehmensanwendungen wie Facebook und Google eine zusätzliche Sicherheitsebene verwenden, um sicherzustellen, dass das vom Remoteserver bereitgestellte Zertifikat das erwartete ist. Diese Technik wird als Certificate Pinning bezeichnet.

Sie können dies einfach tun, indem Sie den öffentlichen Schlüssel des Remoteserverzertifikats in die Anwendung aufnehmen, sodass die Identität des Clients für jede HTTPS-Anforderung leicht überprüft werden kann.

Diese Technik macht den MITM-Angriff (Man in the Middle) ungültig.

Großartige Arbeit Facebook! Aber… (denken Sie daran, es gibt immer ein Aber) Es gibt eine Möglichkeit, das Anheften von SSL-Zertifikaten mithilfe einiger Systemverbesserungen zu deaktivieren, die nur auf einem Gerät mit defektem Gefängnis verfügbar sind.

Der erste Weg (erweitert): Jailbreak eines Geräts und Installation von iOS SSL Kill Switch

Auf meinem iPhone wird derzeit iOS 9.x ausgeführt, sodass zum Zeitpunkt des Schreibens kein Jailbreak möglich war. Also nahm ich ein altes iPad mini mit iOS 8.3.x und brach es einfach mit dem TaiG-Tool .

Bei der Suche im Internet fand ich SSL Kill Switch 2, ein Blackbox-Tool zum Deaktivieren der Überprüfung von SSL-Zertifikaten in iOS- und OS X-Apps.

Nach dem Laden in eine iOS- oder OS X-App patcht SSL Kill Switch 2 bestimmte SSL-Funktionen auf niedriger Ebene in der Secure Transport-API , um die Standardzertifikatsüberprüfung des Systems sowie jede Art von benutzerdefinierter Zertifikatsüberprüfung (z Anheften von Zertifikaten).

Der SSL Kill Switch verwendet MobileSubstrate, um Systemfunktionen wie die Secure Transport API zu patchen. Sie sind die TLS-Implementierung der niedrigsten Ebene unter iOS.

Dies bedeutet, dass das Deaktivieren der SSL-Zertifikatüberprüfung in der Secure Transport-API die meisten (wenn nicht alle) Netzwerk-APIs betreffen sollte, die im iOS-Framework verfügbar sind.

Bitte tun Sie sich selbst einen Gefallen und folgen Sie diesem Blog, der alle diese Konzepte behandelt.

Also habe ich mich über SSH mit dem iPad verbunden und das Paket installiert:

wget //github.com/nabla-c0d3/ssl-kill-switch2/releases/download/0.10/com.nablac0d3.SSLKillSwitch2_0.10.deb --no-check-certificatedpkg -i com.nablac0d3.SSLKillSwitch2_0.10.debkillall -HUP SpringBoard

Nach dem Neustart hatte ich erwartet, den normalen Datenverkehr zu sehen, aber es war eine optimistische Vision: Ich habe die gleichen Fehler erhalten.

Ich habe es noch eine Stunde lang versucht. Ich habe irgendwo gelesen, dass Facebook und Twitter das SPDY-Protokoll für ihre API-Aufrufe verwenden, und dies könnte ein Problem für Charles sein. Also habe ich eine weitere Optimierung installiert, die (theoretisch) das SPDY-Protokoll deaktiviert hat, aber nicht funktioniert hat.

Verhungern.

Bei der Betrachtung der Projektprobleme stellte ich fest, dass jemand anderes das gleiche Problem hatte (//github.com/nabla-c0d3/ssl-kill-switch2/issues/13), ohne Lösung.

Pause.

Der zweite Weg: Simulieren Sie Berührungsereignisse innerhalb der Anwendung

Ich erkannte, dass es viele Spiel-Cheats gibt, die einen „menschlichen“ Ansatz verwenden: Simulieren von Berührungsereignissen (eines der beliebtesten Spiele, bei denen viele Spiel-Cheats diese Strategie anwenden, ist Clash of Clans).

Als ich im Internet nach einem Tool suchte, das diese Vorgänge automatisiert, fand ich diese großartige Optimierung - AutoTouch. Es kann menschliche Berührungsereignisse aufzeichnen und die Daten in einem LUA-Skript speichern. Sie können dieses erstellte Skript dann bearbeiten und überall auf Ihrem Gerät simulieren, was Sie wollen.

Nach der Installation mit Cydia habe ich einen BMP-Screenshot der Messenger-Anwendung mit dem sichtbaren Ball gespeichert und die Koordinaten für das Klicken ermittelt.

Was ich dachte ist, dass ich durch genaues Klicken in die Mitte der X-Achse des Balls nur sich wiederholende Berührungsereignisse in denselben Koordinaten simulieren und dann das Skript stoppen musste, wenn ich eine Punktzahl hatte, mit der ich zufrieden war.

Folgendes habe ich geschrieben, um dieses Ziel zu erreichen:

adaptResolution(768, 1024);adaptOrientation(ORIENTATION_TYPE.PORTRAIT);
for i=1,2000 do
 touchDown(1, 544, 954); usleep(66000); touchUp(1, 544, 954);
 usleep(10000);
end

Nein, es hat nicht funktioniert.

Wahrscheinlich haben Facebook-Entwickler einen zufälligen Fehler bei den Touch-Koordinaten eingeführt, um das Spiel besser zu simulieren oder diese Art von Skripten zu verhindern.

Oder vielleicht habe ich einfach auf das falsche Pixel geklickt.

Für eine zweite Chance habe ich versucht, mehrere Klicks in einem größeren Bereich zu simulieren, aber ohne Glück. Manchmal habe ich so viele Berührungsereignisse simuliert, dass das Springboard nur aufgrund von Speicherfehlern abgestürzt ist .

Anstatt jedes Mal auf die gleichen Koordinaten zu klicken, habe ich einen besseren Ansatz versucht.

Reading the AutoTouch documentation, I found the following two methods:

  • findColor (color, count, region) - Search the coordinates of the pixel points matching the specified color on the current screen.
  • getColor (x, y) - Get the color value of the pixel point of the specified coordinate on the current screen.

The idea was to find a unique color inside the ball, and use the findColor method to get the coordinates of the ball in that moment, to simulate a touch event.

adaptResolution(768, 1024);adaptOrientation(ORIENTATION_TYPE.PORTRAIT);
local c = getColor(544, 954);
for i=1,2000 do local r = findColor(c, 0, {400, 500, 768, 1024});
 for i, v in pairs(r) do touchDown(1, v[1], v[2]); usleep(66000); touchUp(1, v[1], v[2]); usleep(10000); end
end

I don’t know why, but it simply didn’t work. Maybe the findColor is too slow to intercept the ball, which then makes the script useless.

The third way: Reverse engineer the app

I don’t have good native skills in Objective C, but I remember (when I played with the jailbreak ~4 years ago) that there was a tool by Saurik that could inject itself into iOS processes.

It is released along with Cydia and was called Cycript.It allowed developers to explore and modify running applications on iOS, by injecting code at run time.

I read some basic tutorials on how to use it, and after a few struggles, I decided to follow this (another) way.

Once you login via SSH into your iOS device, you can easily attach to a process just by typing:

cycript -p Messenger

I tried to inspect some basic UI classes like UIApp, but didn’t find anything interesting. Then I made a complete class dump, filtering it for the keyword soccer.

var C = Object.keys(ObjectiveC.classes);var soccer_classes = []; for (var i = 0; i < C.length; i++) C[i].match(/soccer/i) && soccer_classes.push( C[i] );

It was a slow process.

Ich habe festgestellt, dass Facebook Messenger eine sehr große Anzahl von Klassen hat.

Aber am Ende habe ich eine kleine Liste bekommen.

Nachdem ich die Klassennamen erhalten hatte, druckte ich alle Methoden der Klasse mithilfe eines Skripts. Bei der Überprüfung der MNSoccerGame- Klasse ergaben sich folgende Methoden:

Hinweis: Ich verstehe immer noch nicht, was die Methode wasCheatDetected ist.

Nachdem ich eine vollständige Liste der Klassenmethoden hatte, entschied ich mich, die _setScore- Methode zu überschreiben , in der Hoffnung, dass andere Methoden dies nicht bemerkten.

Dazu habe ich das MobileSubstrate und seine MS.hookMessage- Methode verwendet.

@import com.saurik.substrate.MS; 
var _setScore_pointer = {}; MS.hookMessage(MNSoccerGame, @selector(_setScore:), function(arg0) { return _setScore_pointer->call(this, 9999); }, _setScore_pointer);

Jetzt können Sie einfach spielen, verlieren und trotzdem einen neuen Rekord erzielen.

Was ich gelernt habe

Never stop yourself. Always try and discover new way to accomplish the same thing. I know, it’s just a game, but if you treat the problem you’re trying to solve like a challenge, you’ll get much more than the satisfaction of beating your friends.