Tutorials

[Game Other] Starter Guide um einen Server Emulator zu erstellen

 

 

1.Vorwort

Willkommen bei meinem ersten Tutorial daß sich mit dem Thema der Serverseitigen Emulation von Online Spielen beschäftigt.
Wenn du nicht genau weißt wie du es anfangen kannst, was du alles wissen must – dann ist dieses Tutorial garantiert das richtige für dich.

Doch vorher noch ein paar Dinge die geklärt werden müssen : Dieses Tutorial sollte als Wegweiser verstanden werden und wird nicht im kompletten Detail erklären wie ihr einen Server schreibt, da dies den Rahmen sprengen würde.

 


2. Legalität
Oft werdet ihr es gehört haben, daß Server Emulatoren illegal seien. Tatsächlich ist dies nur halbwegs wahr .

Es hängt von verschiedenen Faktoren ab :
1. Sind Server Emulatoren explizit in den AGBs/Terms of Conditions untersagt ?
2. Müsst ihr den Client verändern/ mit einem Disassembler reversen um an die Daten zu kommen die ihr benötigt?
3. Nutz ihr Server Files die selbst geschrieben wurden und nicht von dem Publisher/Entwickler entwendet wurden?

Wenn dies alles zutrifft dürfte man wenig zu befürchten haben.

 



2.1 Gründe einen Server Emulator zu schreiben
In der Regel gibt es dafür viele Gründe, der am meisten genutzte Grund ist der, dass man nicht für Güter zahlen möchte die kostenpflichtig sind oder um einen Monatsbeitrag zur Nutzung des Online Spiels zu umgehen.

Allerdings gibt es einen Grund der in meinen Augen viel wichtiger ist – nämlich der dass ein Publisher ein Spiel abschalten kann wann er will. Und wenn dies geschieht, ist es in der Regel nicht mehr möglich sein Lieblingsspiel zu zocken, denn kaum ein Publisher wird die Server Files veröffentlichen bzw. darf es auch nicht da diese dem Entwickler gehören.

Die besten Beispiele dafür sind zum Beispiel Tabula Rasa , Auto Assault und The Sims Online.

Ich persönlich bin der Meinung dass es für so etwas ein Gesetz geben sollte – das wenn ein Publisher ein Spiel abschalten muss und dieses nirgendswo auf der Welt noch verfügbar ist, er verpflichtet ist die Server Dateien rauszugeben.

Nun gut, da dies nicht der Fall ist, bleibt uns nur eins: Selbst einen Server erstellen.
 

 

 


2.2 Vorbereitung
Bevor es nun richtig losgeht, solltet ihr einige Dinge wissen und vorbereiten.
Zu allererst wäre es wichtig daß ihr eine Programmiersprache relativ gut beherscht.
Für den Anfang wenn ihr euch erstmal nur einen Testserver schreiben wollt, reicht eine Sprache aus die folgende Kriterien erfüllen muss :

- es muss als Applikation zu starten sein
- es sollte Sockets (UDP/TCP) unterstützen
- die Sprache sollte zudem Multithreading Fähig sein

Außerdem sollte die Sprache über eine Datenbank Library verfügen (vorzugsweise MySQL) und diese solltet ihr auch ein wenig beherschen.

Je nach Spiel können noch Faktoren hinzukommen, Beispielsweise wenn euer Spiel eine Packet Verschlüsselung benutzt muss es für eure Programmiersprache auch eine dementsprechende Kryptographie Library geben.


 

2.3 Ok wie starte ich meinen eigenen Emulator ?
Eine einfache Frage, allerdings wird die Antwort alles andere als einfach sein.

Zuerst einmal müsst ihr euch die korrekten Tools besorgen .

Ich empfehle euch einen Sniffer (NetworkActiv ist ganz gut, Etherreal soll auch ganz gut sein).
Solltet ihr zudem verschlüsselte Packete haben wäre ein Debugger nicht verkehrt. Olly Dbg und IDA Pro sollten euch da weiterhelfen.

Auch filemon kann hilfreich sein von http://www.sysinernals.com um bei einem Spiel zu überwachen auf welche Dateien zugegriffen werden bzw. versucht wird zuzugreifen.

 

2.4 Die Community
Ganz ehrlich : Am Anfang solltet ihr euch nicht soviel um die Community kümmern. Die Community ist natürlich wichtig für einen Server Emulator, allerdings tut ihr dies ja in erster Linie nicht für die Community als solches, sondern weil euch an dem Spiel etwas liegt.

Allerdings kann man später die Community gut mit einbinden wenn es darum geht, Packets zu sammeln und sie zu analysieren.

Ihr solltet daher der Community später einen geeigneten, selbst geschriebenen Packet Sniffer zur Verfügung stellen.
Dazu später mehr.

 

 

3. Aufbau eines MMORPG Servers
In der Regel ist ein Server in verschiedene Bereiche aufgeteilt :

Patcher
Ist meistens nur ein Webspace auf dem die Patch Dateien liegen. Man kann versuchen hier rauszufinden wie er aufgebaut ist – habt ihr allerdings die Möglichkeit das Spiel ohne den Patcher zu starten, könnt ihr euren eigenen Patcher davor schalten.

Ein guter Open Source Patcher dem man verwenden kann, ist daher neonCube (ursprünglich für RO Server entwickelt, ist dieser Patcher für jedes Spiel einsetzbar).

Login Server
Hier werden eure Zugangsdaten zum Server übermittelt und verifiziert.
Stimmt User und Passwort überein, werdet ihr angemeldet. Ansonsten gibt es eine Fehlermeldung.


Charakter Server
Der Character Server verwaltet eure Server Charaktere. Meistens ist dies ein eigener Server Part (wie der Login Server).


Game/World Server
Das Herzstück des Servers. Dies ist der wichtigste und zugleich auch größte Part eures Projektes.

Der Game / World Server ist dafür zuständig die Kommunikation mit allen Spielern zu ermöglichen, Koordinaten zu broadcasten, Monster zu spawnen – halt alles was du im Spiel siehst.

 

4. Entwicklung – Ein eigener Sniffer muss her
Das erste was ihr tun solltet ist einen eigenen Sniffer zu schreiben. Viele werden denken „Wieso ? Ich kann doch auch Etherreal benutzen“.

Das ist zu einem bestimmten Punkt auch richtig – es hängt davon ab ob euer Spiel Packet Verschlüsselung benutzt oder nicht. Denn dann – sofern ihr die Verschlüsselung geknackt habt – könnt ihr euren Sniffer so schreiben dass er direkt die Packete entschlüsselt und so auch mitloggt.

Sollte eure Spiel keine Packet Verschlüsselung benutzen, tut es auch jeder normale Sniffer.

Es g ibt diverse Möglichkeiten einen Sniffer zu schreiben :

Proxy Sniffer
Der Proxy Sniffer schaltet sich dazwischen und euer Client verbindet zum Proxy anstatt direkt zum Server.
Der Proxy holt sich die Packete , entschlüsselt sie und loggt sie mit.
 


Winsock Hooking
Es wird ein Sniffer gestartet der im Speicher an der Winsock API läuft und sich so die Packete aneignet.

5. Paket Verschlüsselung
Bevor ihr euch überhaupt an die Paket Analyse machen könnt, müsst ihr ersteinmal feststellen ob das Spiel Paket Verschlüsselung benutzt oder nicht.

Dazu solltet ihr einfach etherreal oder einen anderen sniffer starten, und zu allererst mal schauen welche Ports das Spiel überhaupt benutzt. Damit man nicht irregeführt wird, empfehle ich alle anderen Internet Programme zu schliesen damit der Sniffer wirklich nur die Pakete aus dem Spiel bekommt.

Nun das Spiel starten , einloggen und bis zur Spielwelt starten. Sniffer nun anhalten und nachsehen welche Ports benutzt wurden. Diese würde ich nun an eurer Stelle in den Filter Optionen des Sniffers hinterlegen damit wirklich nur die Pakete mitprotokolliert werden, falls ihr später wieder andere Internet Programme starten wollt.

Nun habt ihr die Ports.
Jetzt wäre es an der Zeit rauszufinden ob Verschlüsselung im Spiel ist oder nicht.
Dazu einfach das Spiel beenden, den Paket verlauf des Sniffers leeren und den Sniffer wieder starten.

Startet nun das Spiel und loggt euch ein.
Beim Login sollten einige Pakete im Log auftauchen. Schaut euch die Pakete genauer an.

Solltet ihr bei den Login Paketen Strings sehen, wie zum Beispiel euren Usernamen – dann könnte man schon mal glück haben.

Solltet ihr im Paket allerdings viele wirre Zeichen und Chaos anstelle sehen und kein paket finden dass Klartext anbietet, dann könnt ihr davon ausgehen dass euer Spiel eine Verschlüsselung benutzt.

Dies solltet ihr natürlich auch für den Character und World Server durchführen, da es vorkommen kann, dass es beim Login, Character und Gameserver unterschiedlich sein kann was die Verschlüsselung betrifft.

Folgende Verschlüsselungen habe ich bisher in einem MMO gesehen:
- Public Key Verschlüsselung (RSA)
- XOR
- AES
- Cipher Key Verschlüsselung (wie Blowfish, Twofish etc.)
- Kombination aus RSA und Twofish – dabei wird RSA dafür genutzt den twofishkey auszutauschen der immer neu vom Server gesendet wird.
- Oftmals findet ihr auch einen Hash im Paket , meistens um zu prüfen ob ein Paket korrekt angekommen ist. Häufig genutzt wird hier : MD5, SHA1 oder CRC32.

Nun die einzige Möglichckeit die Verschlüsselung zu knacken ist den Client zu debuggen / disassemblieren. Ab hier wird IDA Pro dir helfen müssen weiterzukommen. Allerdings sei euch gesagt dass dieser Prozess langwierig ist und wirklich viel Assembler Know How benötigt. Denkt auch bitte daran dass ihr dass in der Regel nicht dürft bzw. prüft die EULA des Games.


 

6. Packet verstehen
Wenn ihr die ersten Packete mitsnifft, werde ihr so etwas sehen wie zum Beispiel :

Server->Client packet size: 28
0b 0f 00 00 00 00 00 a3 89 1f 00 00 00 00 00 0b 00 4d 6f 72 70 68 65 75 7a 7a 7a 00

.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  M  o  r  p  h  e  u  z  z  z  .
 

Das nennt sich Hex Dump und kann wahlweise auch ein „0x“ vor jedem Zeichen besitzen.
Wenn du keine Ahnung hast, was ein Hexadezimal System ist und wie es aufgebaut ist, solltest du diese Information erst einmal nachgooglen.

Nun habe ich dieses Beispiel aus einem Matrix Online Packet genommen, wie finden wir nun raus was die einzelnen Bytes für eine Bedeutung haben könnten?

Zunächst einmal sehen wir einen String welcher mit 0x00 terminiert wird (immer wenn ihr einen String findet achtet darauf ob ein 0x00 am Ende erfolgt).

Vor dem String sehen wir noch etwas interssantes , nämlich ein 0x0b, 0x00.
Geht nun zu http://easycalculation.com/hex-converter.php und lasst euch den Wert einmal in ein Decimal Wert ausrechnen.
Dabei müsst ihr drauf achten ob mit Endians gearbeitet wird, d.h. ob ihr den Hex Wert normal oder rückwärts lesen müsst.

In diesem Fall ist es ein uint16 und natürlich endian weswegen wir beim hexconverter einfach 00 0b eingeben.
Als Ergebniss bekommen wir nun 11.

Dies würde die Länge unseres Strings entsprechen + 0x00 Terminator.
 

Wenn wir nun das Packet weiter analysieren und uns mal den Anfang des Packetes anschauen, können wir sehen das 0b wohl der Header sein muss. 0f könnte ein die Größe sein, allerdings denke ich daß es für uint8 einfach zu klein ist.

Der „Header“ sind meistens ein oder zwei Bytes die dem Server oder Client mitteilen um welche Art von Packet es sich hier handelt. Dies kann auch auf einen Haupt Header und diverse Subheader unterteilt werden.

Zudem findet ihr oft am Anfang des Paketes die Paketgröße (meistens ist dies ein uint16 Wert).
 

6.1 Sonderfall : UDP Pakete
Ich möchte hier kurz auf UDP Pakete eingehen. Sollte beispielsweise euer Gameserver für die Kommunikation UDP benutzten, so müst ihr hier extra drauf achten ob im Header des Paketes evtl. Sequenzen auftauchen bzw. Information über die Reihenfolge. Da UDP ein Verbindungsloses Protokoll ist, haben die Entwickler von Onlinespielen ihr eigenes internes Protokoll geschrieben um festzustellen ob ein Paket angekommen ist oder nicht.

Auch auf Checksummen solltet ihr achten (da damit oft die Gültigkeit mithilfe eines hashwertes verifiziert wird).
 

 


6.2 Ein paar weitere Tips zu Paketen
- Wenn ihr einen String im Paket seht, prüft ob er 0x00 terminiert wird. Wenn dies nicht der Fall ist, dann ist irgendwo im Paket ein Wert über die Länge des Strings. Aber selbst wenn es 0x00 terminiert ist, kann es gut sein dass trotzdem ein Wert für die String länge existiert.
- Testet alle Werte die 4 Bytes haben ob der Wert ein Integer oder ein Float ist. Oftmals macht ein Wert mehr sinn als der andere. Das gleiche gilt auch für Werte die 8 Bytes haben.
- Wenn ihr ein Byte seht was sich konstant verändert sobald ihr etwas ingame tut aber dieser Wert keinen richtigen Sinn ergibt, kann es ein Bit Feld sein. Bit Felder werden meistens dazu genutzt Flags zu setzen (wie Rasse, Klasse, etc.).

 

7.Variablen und Datenformate erkennen
Gerade Anfänger fragen sich, wenn einer in einem Forum postet „gugg mal ich hab hier einen uint32 Wert gefunden“ oder einen float.

Es klingt erstmal komplizierter als es eigentlich ist.

uint steht für unsigned int und ist ein ganzzahlen Wert.
Die 32 definiert die mögliche Größe des INT Wertes.

Im Binär und Hexsystem sind diese recht einfach zu erkennen.

Da 8 Bits ein Byte sind, ist ein uint8 Wert auch nur ein Byte im Packet.
uint16 wären dann 2 Bytes, uint32 wären dann 4 Bytes und uint64 wären 8 Bytes.

Floats sind in der Regel ebenfalls 4 Bytes Groß.
Ein Float ist eine Fließkomma Wert. Beispiel : 183.111 .

Meistens werden diese Werte für Koordinaten benutzt.

8. Client Server Adresse
Eine wichtige Sache ist natürlich noch, dass ihr herausfinden müsst wo im Client die Adresse des/der Server gespeichert ist.
Dies ist dazu wichtig, da ihr ja wollt dass der Client später auf euren Server zugreift anstatt auf die offiziellen. Wenn ihr Glück habt, hat euer Spiel eine cfg, ini oder ähnliche Datei im Verzeichnis des Spiels liegen.
Wenn ihr noch mehr Glück habt, ist der Inhalt auch nicht verschlüsselt. Es kann allerdings vorkommen dass der inhalt verschlüsselt ist (beispielsweise gesehen bei Atlantica Online).

Dann gibt es mehrere Ansatzmöglichkeiten. Zum einen gibt es gerad bei Koreanischen Spielen eine Art „hintertür“ , d.h. der Client lässt sich entweder mit Server IP Parametern starten oder besser noch, der Client versucht eine unverschlüsselte Datei zu laden , die diese Information ebenfalls enthalten kann.

 

9. Programmierung
Ihr habt euch nun für eine Programmiersprache entschieden, die ersten Pakete gesnifft bzw. habt die Paketverschlüsselung geknackt ?

Dann geht es jetzt etwas an das eingemachte. Um ein wenig mit dem Paketen rumzuspielen und diese zu testen, empfehle ich zuerst einen „statischen“ Server zu schreiben.

Das ist nix anderes als ein Winsock Server, die auf Anfragen des clients die entsprechende Pakete schickt. Als Paket nehmt ihr die Packete die ihr gesnifft habt.
Das dient einfach dazu mal auszutesten ob alles soweit funktionieren würde, wenn ihr stumpf die Pakete zum Client senden würdet.

Solltet ihr das Format der Pakete verstanden haben und ihr wisst mit welchen Daten ihr die Pakete füttern müsst, könnt ihr anfangen die Pakete dynamisch zu generieren.


10. Schlusswort
Keine Sorge, dieser Guide ist noch nicht 100 % komplett und fertig.
Ich denke allerdings als kleine Einstiegshilfe um einen Überblick zu bekommen welche Arbeit gerade im Anfang auf einen zukommen, ist es doch recht hilfreich.
Dieser Guide wird auch permanent aktualisiert und für Kritik, Fragen etc. benutzt doch einfach das Kommentar Formular.

Kommentare
Keine Kommentare vorhanden