Onlinespiele mit UDP

Hallo zusammen,
gerade eben habe ich ein etwas älteres Spiel gespielt. Dabei handelt es sich um ein Onlinespiel, dass die Daten mittels UDP versendet und empfängt.
Da ich weiß, dass UDP die etwas unsicherere und einfachere Übertragung ist (als TCP), habe ich mich gefragt, ob man diese Pakete nicht manuell verschicken könnte (sodass der Server die akzeptiert und verarbeitet).

Ganz kurz zum Spiel:
Man muss mit kleinen Fliegern andere Flieger auf einem kleinen Spielfeld kaputt machen (2D). Alles sehr einfach gehalten.

Denke, dass das Spiel andauern die Koordinaten des eigenen Fliegers an den Server schickt, sodass alle anderen Clients sehen, wo sich dieser Flieger befindet.
Doch ob das wirklich so ist weiß ich nicht. Deshalb habe ich mir Wireshark runtergeladen und mal geschaut, was das Spiel so versendet. Innerhalb von ein paar Sekunden sind halt schon ziemlich viele UDP-Pakete versendet worden.
Wonach muss ich in dem Haufen suchen, um an die gewünschte Stelle zu gelangen? Wie könnte ich herausfinden, was das Spiel verschickt, wenn ich auf schießen drücke? Oder wie untersuche ich überhaupt diese Pakte am Besten?
Angenommen ich habe das Paket gefunden, indem die Koordinaten stecken. Was würde passieren, wenn ich die Koordinaten im Paket verändere und das wieder an den Server schicke?

Hoffe, dass ihr Antworten auf die Fragen habt. Danke!

Viele Grüße,
Littleben
 
Zuletzt bearbeitet:
Worauf du achten musst lässt sich ohne Quellcode nicht so genau sagen, da das jedes Spiel intern anders handhabt. Ein Paket das _nur_ die Koordinaten sendet wirst du denke ich nicht finden. Das wird eher ein klobiger Bytehaufen sein.

Falls du das aber hinkriegst könntest du ein eigenes Paket bei UDP AFAIK manuell senden, bin mir aber nicht sicher ob UDP trotz Verbindungslosigkeit eine Sicherungsfunktion wie Paket-IDs hat...
 
udp nicht ... aber das darauf laufende protokoll des spiels möglicherweise ...
Meinst du damit TCP?

Nagut, die Koordinaten zu finden ist also sogut wie unmöglich...
Aber in diesem Spiel kann man auch in einem Chat schreiben.
Und zwar habe ich das Paket gefunden, das das Spiel beim Abschicken der Nachricht dem Server schickt (im Anhang).
Jetzt wollte ich mal wissen, ob die Nachricht im Spiel angezeigt wird, wenn ich das gleiche Paket nochmal schicke.
Nur was muss ich dem Server davon schicken:
Code:
0000   00 1f 3f ba 96 ed 00 1f 3f 03 1e b3 08 00 45 00  ..?.....?.....E.
0010   00 31 37 6b 00 00 80 11 53 f8 c0 a8 b2 39 2e 89  .17k....S....9..
0020   0d ee 6a 88 c4 1b 00 1d 18 f3 1c 71 79 10 02 01  ..j........qy...
0030   0c 9a 01 08 00 65 69 6e 20 54 65 73 74 04 00     .....ein Test..
Wenn ich nur die Hexadezimalen schicke oder nur den Text, dann funktioniert es nicht.
In Delphi schicke ich das Zeugs so weg:
Code:
IdUDPClient1.Send('46.137.13.238',27272,cCode);
Kann das funktionieren? Und wenn, was muss ich dahin schicken?
 
Zuletzt bearbeitet:
Meinst du damit TCP?
nein ... ich meine ein propäritäres protokoll dass vom spiel verwendet wird, und auf UDP aufsetzt
Nagut, die Koordinaten zu finden ist also sogut wie unmöglich...
das stimmt so nicht...
Aber in diesem Spiel kann man auch in einem Chat schreiben.
Und zwar habe ich das Paket gefunden, das das Spiel beim Abschicken der Nachricht dem Server schickt (im Anhang).
Jetzt wollte ich mal wissen, ob die Nachricht im Spiel angezeigt wird, wenn ich das gleiche Paket nochmal schicke.
Nur was muss ich dem Server davon schicken:
Code:
0000   00 1f 3f ba 96 ed 00 1f 3f 03 1e b3 08 00 45 00  ..?.....?.....E.
0010   00 31 37 6b 00 00 80 11 53 f8 c0 a8 b2 39 2e 89  .17k....S....9..
0020   0d ee 6a 88 c4 1b 00 1d 18 f3 1c 71 79 10 02 01  ..j........qy...
0030   0c 9a 01 08 00 65 69 6e 20 54 65 73 74 04 00     .....ein Test..
Wenn ich nur die Hexadezimalen schicke oder nur den Text, dann funktioniert es nicht.
In Delphi schicke ich das Zeugs so weg:
Code:
IdUDPClient1.Send('46.137.13.238',27272,cCode);
Kann das funktionieren? Und wenn, was muss ich dahin schicken?
was du zunächst mal verstehen musst, ist die art und weise in der client und server miteinander sprechen ...

protokoll analyse ist angesagt ... das ist nicht unbedingt einfach ...

betrachtet man z.B. die letzten paar bytes von dem ausschnitt, könnte man spekulationen über den aufbau anstellen:

0032 könnte ein SOH(start of header) sein, da 003c ein EOT(end of transmission) ist ... (allgemein, es werden ascii control chars eingesetzt)
0033 und 0034 könnte ein little endian short sein, da der gesendete text 8 zeichen hat ... (länge der nachricht)
0035 - 003b ist offensichtlich der text

verifizieren kann man das aber nur wenn man nun entweder den code zerlegt, der das ganze erzeugt/verarbeitet, oder es mit weiteren samples vergleicht ... codeanalyse wäre aber vorzuziehen ...
 
Verstehe...also müsste man die gleiche Nachrichte (oder eine andere) mehrmals im Spiel verschicken, und all die anfallenden Pakte vergleichen (alle Pakete, die fürs Senden sind).
Kann es sein, dass beim senden mehrere Pakete gesendet werden?

Ich habe nun mehrere Pakete verglichen:
Server 1:
Code:
0x00   00 1F 3F BA 96 ED 00 1F 3F 03 1E B3 08 00 45 00
0x10   00 2D 3F 86 00 00 80 11 4B E1 C0 A8 B2 39 2E 89
0x20   0D EE 6A 88 C3 B7 00 19 0A B9 1C D5 75 0A A2 00
0x30   08 9A 01 04 00 74 65 73 74 04 00
Text = test

Server 1:
Code:
0x00   00 1F 3F BA 96 ED 00 1F 3F 03 1E B3 08 00 45 00
0x10   00 33 42 D2 00 00 80 11 48 8F C0 A8 B2 39 2E 89
0x20   0D EE 6A 88 C3 B7 00 1F DD 56 1C E5 A6 0A AA 00
0x30   0E 9A 01 0A 00 68 61 6C 6C 6F 20 77 65 6C 74 04
0x40   00
Text = "hallo welt"

Server 1:
Code:
0x00   00 1F 3F BA 96 ED 00 1F 3F 03 1E B3 08 00 45 00
0x10   00 31 50 39 00 00 80 11 3B 2A C0 A8 B2 39 2E 89
0x20   0D EE 6A 88 C3 B7 00 1D 0C 8A 1C 19 F1 05 5A 00
0x30   0C 9A 01 08 00 66 6C 75 67 7A 65 75 67 04 00
Text = "flugzeug"

Server 2:
Code:
0x00   00 1F 3F BA 96 ED 00 1F 3F 03 1E B3 08 00 45 00
0x10   00 37 72 0B 00 00 80 11 EE F0 C0 A8 B2 39 4B 66
0x20   1B 72 6A 88 9C 55 00 23 96 E1 1C 09 7E 03 32 00
0x30   12 1A 02 0E 00 61 6E 64 65 72 65 72 20 73 65 72
0x40   76 65 72 04 00
Text = "anderer server"

Server 2:
Code:
0x00   00 1F 3F BA 96 ED 00 1F 3F 03 1E B3 08 00 45 00
0x10   00 35 02 4E 00 00 80 11 5E B0 C0 A8 B2 39 4B 66
0x20   1B 72 6A 88 9C 55 00 21 3A E8 1C 6D 70 01 12 00
0x30   10 1A 02 0C 00 6E 6F 63 68 6D 61 6C 20 74 65 73
0x40   74 04 00
Text = "nochmal test"

Server 1:
Code:
0x00   00 1F 3F BA 96 ED 00 1F 3F 03 1E B3 08 00 45 00
0x10   00 39 0D A8 00 00 80 11 7D B3 C0 A8 B2 39 2E 89
0x20   0D EE 6A 88 C3 B7 00 25 76 C3 1C 39 94 00 0A 00
0x30   14 9A 01 10 00 64 65 72 20 65 72 73 74 65 20 73
0x40   65 72 76 65 72 04 00
Text = "der erste server"

Dabei sind mir folgende Unterschiede aufgefallen (die immer anderst sind):
- 11-13
- 18-19
- 1E-21, 24-25 ist abhängig vom Server (wahrscheinlich welcher Server)
- 27-29
- 2B-2E
- 30
- 33 (Gibt wie du schon gesagt hast die Länge an)
- Und dann kommt der Text

Die Bytes, die hier nicht aufgezählt sind, sind immer gleich.
Du hast ja schon angefangen zu erklären, was die einzelnen Bytes machen. Wie könnte ich jetzt bei den Unterschieden herausfinden, welche Bytes was bedeuten?
 
Zuletzt bearbeitet:
Sind leider unterschiedlich :(

1. "hallo welt"
Code:
0x00   00 1f 3f ba 96 ed 00 1f 3f 03 1e b3 08 00 45 00
0x10   00 33 7b e7 00 00 80 11 e5 18 c0 a8 b2 39 4b 66
0x20   1b 72 6a 88 9c 48 00 1f bf 87 1c c1 b1 0b ba 00
0x30   0e 9a 01 0a 00 68 61 6c 6c 6f 20 77 65 6c 74 04
0x40   00
2. "hallo welt"
Code:
0x00   00 1f 3f ba 96 ed 00 1f 3f 03 1e b3 08 00 45 00
0x10   00 33 7c 52 00 00 80 11 e4 ad c0 a8 b2 39 4b 66
0x20   1b 72 6a 88 9c 48 00 1f 31 47 1c 01 38 0c c2 00
0x30   0e 9a 01 0a 00 68 61 6c 6c 6f 20 77 65 6c 74 04
0x40   00

EDIT: War irgendwie etwas falsch...
 
Zuletzt bearbeitet:
Das habe ich mir schon gedacht. :wink:

Gerade auf soetwas kommt es nämlich oft an. Das kann an mehreren Ursachen liegen.
Es kann sein, dass dieses Paket eben NICHT nur das Kontrollkommando für eine Textnachricht ist, sondern vorher noch andere Informationen/Kommandos vorraus geschickt werden. (Haben sich die Koordinaten zwischen beiden Nachrichten geändert?)
Es ist zudem wahrscheinlich, dass Laufnummern, Transaktionsnummern, Timecodes oder ähnliches im Protokoll mitgeschickt werden, welche sich natürlich von Paket zu Paket unterscheiden.

Letztendlich solltest du tatsächlich einen Debugger ranhängen um die Stelle zu finden an denen das Paket zusammengesetzt und abgeschickt wird. Also _send und _recv von der jeweiligen Socket-Library die benutzt wird.

Natürlich könntest du auch probieren die veränderlichen Bytes auf verschiedene Datentypen (Single-, Double-Floats, signed/unsigned words, dwords usw.) testen und schauen ob du etwas wiedererkennst, was im spiel ähnlich ist. Koordinaten mal verändern, mal in eine ecke fliegen wenns geht. Gibt's eine Zeitanzeige?

Beides nimmt natürlich Zeit in Anspruch. Ersteres führt definitiv zum Erfolg, weil man das Zusammensetzen der Pakete manschinennah nachvollziehen kann, wenn man denn in der Lage dazu ist.
Zweiteres benötigt etwas mehr Geschick im Knobeln, logischem Schließen, Wissen wie versch. Datentypen kodiert werden und es bleibt unsicher ob man alles entdeckt.

Ist das Protokoll vernünftig aufgebaut, wird es schwierig eigene Pakete zu injezieren. Denn dann läuft man Gefahr das Spiel zu desynchronisieren. Man muss eben schauen wie sich die Netcode-Engine des Spiels dazu verhält.
Vor allem braucht man aber auf jedenfall die vorigen Pakete, muss also die zumindest softwaretechnisch abfangen, weil die Veränderlichen Informationen sehr sicher abhängig von den Informationen in den vorangegangen Paketen sind.
 
Zuerst mal: Danke!!!

(Haben sich die Koordinaten zwischen beiden Nachrichten geändert?)
Zwischen diesen zwei Nachrichten, die ich sehr schnell hintereinander abegschickt habe, sind die Koordinaten auf jeden fall verschieden, da es bei diesem Spiel sogut wie unmöglich ist, stehen zu bleiben.

Koordinaten mal verändern, mal in eine ecke fliegen wenns geht. Gibt's eine Zeitanzeige?
Stimmt. Es gibt eine Zeitanzeige. Und es gibt auch eine Anzeige für Punkte. Jedoch sind die Punkte bei beiden Nachrichten gleich geblieben.

Vor allem braucht man aber auf jedenfall die vorigen Pakete, muss also die zumindest softwaretechnisch abfangen, weil die Veränderlichen Informationen sehr sicher abhängig von den Informationen in den vorangegangen Paketen sind.
Hier finde ich etwas komisch...
Es werden pro Sekunden 149 Pakete versendet. Und alle sind gleich aufgebaut:
Spiel - Server
Code:
0000  00 1f 3f ba 96 ed 00 1f  3f 03 1e b3 08 00 45 00   ..?..... ?.....E.
0010  00 22 42 f2 00 00 80 11  1e 1f c0 a8 b2 39 4b 66   ."B..... .....9Kf
0020  1b 72 6a 88 9c 48 00 0e  4d 70 1c d1 95 05 20 00   .rj..H.. Mp.... .
Server - Spiel
Code:
0000  00 1f 3f 03 1e b3 00 1f  3f ba 96 ed 08 00 45 00   ..?..... ?.....E.
0010  00 24 00 00 40 00 36 11  6b 0f 4b 66 1b 72 c0 a8   .$..@.6. k.Kf.r..
0020  b2 39 9c 48 6a 88 00 10  02 af 1c 81 95 0e 60 00   .9.Hj... ......`.
0030  0b 04                                              ..
Und diese Reihenfolge (Spiel -Server dann Server - Spiel) kann man 1000 Pakete lang beobachten (manchmal gibt es kleine Abweichungen).
Die Länge ist beim Paket Spiel - Server immer 48 Bytes und Server - Spiel immer 50 Bytes. Ach, da sehe ich gerade, dass im Abstand von 5 Paket noch ein Drittes mit der größe 65 Bytes vom Server - Spiel gesendet wird. Habe noch ein Bild in den Anhang gemacht, wo man das Muster gut erkennen kann.
Ich denke, dass in diesen Paketen die Koordinaten stehen. Was würde es eig. für einen Sinn ergeben, wenn in den Pakten, die vom Spiel gesendet werden, die Spielzeit (die übrigens herunterläuft) und die Punkte stehen? Das sendet doch nur der Server zum Spiel.
Manchmal findet man doch noch andere Pakete, die eine Länge von 77 oder 66 Bytes haben. Der Aufbau ist jedoch der gleiche.

Bei den Nachrichten kann man dieses Muster auch beobachten:
Wenn man nach dem Paket sucht, dass vom Spiel geschickt wurde und die gesendete nachricht enthält, dann sieht man ein paar Pakete weiter das Paket, das vom Server - Spiel geschickt wurde (dort steht auch die Nachricht). So kann man auch nach anderen Nachrichten von anderen Spielern suchen.

Würde es vielleicht etwas bringen, wenn man einfach das versendete Paket mit der Nachricht nocheinmal sendet?

Und jetzt ist mir aufeinmal noch etwas aufgefallen:
Code:
0000  00 1f 3f ba 96 ed 00 1f  3f 03 1e b3 08 00 45 00   ..?..... ?.....E.
0010  00 22 0a 61 00 00 80 11  56 b0 c0 a8 b2 39 4b 66   .".a.... V....9Kf
0020  1b 72 6a 88 9c 48 00 0e  05 71 1c c9 dd 0c 20 00   .rj..H.. .q.... .
Code:
0000  00 1f 3f ba 96 ed 00 1f  3f 03 1e b3 08 00 45 00   ..?..... ?.....E.
0010  00 22 0a 62 00 00 80 11  56 af c0 a8 b2 39 4b 66   .".b.... V....9Kf
0020  1b 72 6a 88 9c 48 00 0e  05 61 1c d9 dd 0c 20 00   .rj..H.. .a.... .
Code:
0000  00 1f 3f ba 96 ed 00 1f  3f 03 1e b3 08 00 45 00   ..?..... ?.....E.
0010  00 22 0a 63 00 00 80 11  56 ae c0 a8 b2 39 4b 66   .".c.... V....9Kf
0020  1b 72 6a 88 9c 48 00 0e  05 51 1c e9 dd 0c 20 00   .rj..H.. .Q.... .
Code:
0000  00 1f 3f ba 96 ed 00 1f  3f 03 1e b3 08 00 45 00   ..?..... ?.....E.
0010  00 22 0a 64 00 00 80 11  56 ad c0 a8 b2 39 4b 66   .".d.... V....9Kf
0020  1b 72 6a 88 9c 48 00 0e  05 41 1c f9 dd 0c 20 00   .rj..H.. .A.... .
Das sind immer die Pakete Spiel - Server von Anfang bis Ende auf der aufgezeichneten Liste. Man kann dort erkennen, dass das 13 Byte immer "inkrementiert" wird (oder immer ein Buchstabe höher). Was bedeutet das?

EDIT: Da werden ja noch mehr Bytes "inkrementiert" und "dekrementiert"
 
Zuletzt bearbeitet:
Will (kann) mir denn keiner mehr helfen? :(
Habe im Spiel noch herrausgefunden, wie man die aktuellen Koordinaten anzeigen lassen kann. Auserdem werden dann noch viele andere Daten angezeigt. Z.B die Beschleunigung und die Player-ID. Die meisten Daten ändert sich laufend(da man fliegt). Im Anhang die komplette Liste als Screenshot.
Hoffe, dass nun wieder neue Ideen kommen...
 
Nagut, andere Frage: Wäre es möglich, die Pakete (wenn man weiß welche), die sagen, dass man gekilled wurde, einfach zu filtern und nicht raus zu lassen?
 
Das kommt darauf an ob du Zugriff auf eine Firewall-API hast (und dann auch nur wenn die Firewall auf Paketbasis und nicht auf Verbindungsbasis arbeitet). Der normale WinPcap-Treiber erlaubt nur Zugriff auf bereits abgefertigte Pakete, und bietet keinerlei Möglcihkeiten zu filtern.

Falls du die Daten allerdings wirklich paketweise manipulierst, bzw. löschst ist es sehr wahrscheinlich dass du inkonsistente Daten erzeugst, da du auf deinem lokalen Rechner bereits "tot" bist, der Remote-Rechner dich jedoch als "lebend" einstuft. Die Folgen für den Programmfluss wären somit nicht absehbar.

EDIT: @GrafZahl. Wo wir beim Thema synchron sind ;)
 
Nagut, andere Frage: Wäre es möglich, die Pakete (wenn man weiß welche), die sagen, dass man gekilled wurde, einfach zu filtern und nicht raus zu lassen?

Sofern die Serverimplementierung ernstzunehmen ist, werden alle Spielregeln serverseitig validiert. Bedeutet folglich, dass du bereits gekillt bist, dein Client dies aber nicht wahrhaben will :)

Oder @GrafZahl: "aber es würde mit ziemlicher sicherheit zur desynchronisation führen ..."
 
Zurück
Oben