Mein Anliegen ist es den Login Prozess eines MMORPGs mit Wireshark aufzuzeichnen und zu analysieren. Hinterher möchte ich diese Packets ohne einen Client an den Server senden, um mich einzuloggen. Das Spiel (Kal Online) ist schon etwas älter und es Verschlüsselt die Daten nicht, deshalb habe ich es mir zum testen ausgesucht.
Im folgenden zeige ich meine Beobachtungen, die sich bisher auf die ersten drei Login Schritte beziehen. Nachdem der Client gestartet wurde wird mit einem Klick auf "Ok" die Verbindung zum Server hergestellt. Dann folgt ein 3 Way Handshake (zumindest glaube ich das).
Quote:
Die erste Anfrage an den Server:
19:00:ee:88:66:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:0 0:00:01:02
Darauf folgt eine Antwort:
57:00:2a:ed:9a:9b:52:19:d4:4c:7e:44:ea:fd:42:56:61:1e:00:00:36:00:00:00:0 0:00:00:00:01:12:02: [Hier folgen noch weitere Nullen]
Danach schicke ich wieder ein Paket:
08:00:ed:01:ca:28:00:00 [Dieses Paket ist jedesmal gleich]
ROT steht für die Anzahl an Bytes
Grün ist [glaube ich zumindest] der Packet-Header
BLAU sind Variable Daten, welche sich von Versuch zu Versuch unterscheiden.
|
Ein Blick auf
netstat -n zeigt, dass die Verbindung zum Server hergestellt ist. Hier meine erste Frage:
Muss ich diesen Handshake simulieren, wenn ich mit einem Python Script einen Socket erstelle und mich so mit dem Server Verbinde?
Quote:
import socket
GAME_IP = ""
GAME_PORT =
BUFFER_SIZE = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((GAME_IP, GAME_PORT))
|
Wenn ich dieses Programm ausführe zeigt mir
netstat -n, dass die Verbindung zum Server hergestellt wurde. Wireshark zeigt jedoch, dass kein Handshake stattgefunden hat. Ist das ein Problem?
Und wenn dieser Handshake stattfinden muss, wie könnte ich ihn simulieren? Die Anfrage im ersten Paket, dass gesendet wird, hat immer einen anderen Inhalt.
Nun ist die Verbindung hergestellt und ich stehe vor dem nächsten Problem. Der Server schickt alle 30 Sekunden ein Paket der Form:
Quote:
Und der Client Antwortet:
Quote:
07:00:05:40:aa:00:00
Diese Antwort ist sehr interessant. Die BLAUEN Bytes sind wieder variabel. Das orangene Byte ist auch variabel. Es hat allerdings eine interessante Eigenschaft. Wenn es mit 00 initialisiert wurde, wird es [nachdem die Login Daten Übertragen wurden] bei jedem zweiten Paket inkrementiert.
Bevor die Login Daten Übertragen wurden sieht die Kommunikation also beispielsweise so aus:
<- 03:00:1e
-> 07:00:05:40:aa:00:00
<- 03:00:1e
-> 07:00:05:20:c1:00:00
<- 03:00:1e
-> 07:00:05:20:c1:00:00
<- 03:00:1e
-> 07:00:05:20:c1:00:00
<- 03:00:1e
-> 07:00:05:20:c1:00:00
|
Ich kann bisher mit dieser Kommunikation nichts anfangen. Ich stelle mir vor, dass der Server meinen Client alle 30 Sekunden anpingt, um zu testen, ob die Verbindung noch besteht. Sicher bin ich mir allerdings nicht. Auch hier stellt sich mir die Frage, ob ich diese Kommunikation simulieren muss. Und wenn, womit fülle ich die variablen Bytes?
Es geht also weiter und ich übertrage meine Login Daten. Das funktioniert nebenbei bemerkt auch schon mit meinem Python Code. Das habe ich getestet, indem ich die Antwort abgefangen habe. In dieser Antwort wurde der Charaktername übergeben.
Quote:
11:00:f4:XX:XX:XX:XX:XX:XX:XX:00:XX:XX:XX:XX:XX:00
In diesem Login Paket stecken unverschlüsselt der Username und das Passwort. Als Antwort kommen zwei Pakete:
27:00:11:00:00:00:00:00:01:86:a8:00:00:XX:XX:XX:XX:XX:00:00:03:1e:00:00:00:00:12:00:15:00:08:00:08:00:0 a:00:01:01:00 [Das Paket mit dem Charakternamen]
und:
04:00:19:00 [Dieses Paket ist immer gleich. ich habe keine Ahnung, wozu es da ist.]
|
Quote:
Es folgt wieder im 30 Sekundentakt die Anfrage mit dem Paket:
03:00:1e
Mit der selben Antwort wie vorher, mit dem Unterschied, dass bei jedem zweiten Paket jetzt inkrementiert wird. Im Beispiel von vorhin sehe das nun so aus:
<- 03:00:1e
-> 07:00:05:XX:XX:00:00
<- 03:00:1e
-> 07:00:05:XX:XX:00:00
<- 03:00:1e
-> 07:00:05:XX:XX:01:00
<- 03:00:1e
-> 07:00:05:XX:XX:01:00
<- 03:00:1e
-> 07:00:05:XX:XX:02:00
Ich gehe davon aus, dass die letzten beiden Bytes zur Inkrementation verwendet werden. Was noch interessanter ist, ist dass die BLAUEN variablen Bytes sich jetzt bei jeder gesendeten Antwort verändern. Bevor die Login Daten übertragen wurden waren sie zwar auch beliebig, wurden aber festgesetzt, als die Verbindung hergestellt wurde. Es gilt weiterhin die Frage, ob ich diese Kommunikation manuell handhaben muss.
|
In meinem Python Script habe ich bisher mit dem Socket die Verbindung hergestellt. Danach habe ich das Login Paket mit Username und Passwort übertragen, worauf ich eine Antwort mit dem Charakternamen erhalten habe. Danach habe ich ein weiteres Paket übertragen, welches den Login bestätigen sollte [im Client habe ich hier einfach 'ENTER' gedrückt]. Daraufhin wird mir der Charakter als online angezeigt und kann auch Nachrichten empfangen. Allerdings ist er in der Welt nicht zu sehen.