Idewavecore. Rückblick

Es ist sehr cool, einen Mechanismus oder ein Softwaremodul so zu programmieren, dass es Ihrem Willen entspricht. Mit ähnlichen Gedanken dachte ich Ende 2018, dass ich meinen eigenen WoW-Server bauen möchte , der vollständig von mir gesteuert wird. Nachdem ich die C ++ - Quellcodes für MANGOS studiert hatte , kam ich zu dem Schluss, dass ich nicht alle meine Ideen wie diese übernehmen und umsetzen kann, ohne zu verstehen, wie ein MMO-RPG-Server von Anfang bis Ende funktioniert. Zu diesem Zweck habe ich beschlossen, meinen eigenen Motor zu implementieren . Von Grund auf neu.






Anfangs hatte ich nur den Quellcode aus der Dokumentation. Ich suchte Stück für Stück in den Foren nach Antworten auf meine vielen Fragen (in dieser Hinsicht - ein großer Respekt für die MANGOS- Community - ein sehr reaktionsschnelles Team). Insgesamt dauerte es einige Monate, bis ich durch Ausprobieren meinen ersten funktionierenden Prototyp des Anmeldeservers implementierte - und zum Zeichenauswahlbildschirm gelangen konnte.





Kurz gesagt, der Anmeldeserver (wie die Authentifizierung im WoW-Client) basiert auf der Verwendung des SRP- Algorithmus . Die Beschreibung des Algorithmus geht über den Rahmen des Artikels hinaus. Kurz gesagt, Sie können den Benutzer identifizieren, ohne das Kennwort an den Server zu senden, sodass das Kennwort (auch in zwischengespeicherter Form) nicht auf dem Server gespeichert werden kann. Sogar wünschenswert .





Der Verschlüsselungsalgorithmus des World-Servers unterscheidet sich höchstwahrscheinlich von Client zu Client (diese Schlussfolgerung habe ich gezogen, als ich den Quellcode des WoW 3.3.5a-Servers kurz untersucht habe ). Ich habe einen Server für WoW Version 2.4.3 entwickelt. Dort wird so etwas wie die Caesar-Chiffre verwendet . Obwohl häufiger (in der Quelle) finden Sie den Namen HeaderCrypt oder Wowcrypt.





In Version 2.4.3 werden die ersten 6 Bytes verschlüsselt: Größe (2) und Opcode (4) jedes Pakets auf dem World Server (mit Ausnahme des ersten Pakets ). Wenn Sie ein Paket abfangen (Sniff), können Sie dementsprechend nicht bestimmen, an welchen Opcode es gesendet wird. Und wenn das Paket groß ist, kann es in mehrere aufgeteilt werden. Um sie korrekt aus dem Puffer zu entfernen, werden diese ersten 2 Bytes ( Größe ) benötigt .





Der Vorgang der Anmeldung am Server kann kurz wie folgt beschrieben werden:





Login SRP (session key), / (crypto key). "send auth request" (. ). auth response, - , . Auth response - , crypto key. - .





World - , , ( ), (size) (opcode) >= size, ( ) size . . Update Packet. .





. - , ( ) . .





-, Python 3 (asyncio + SQLAlchemy). , SQLAlchemy - , , - ( ). .





-, . ( ) (manager), , : Item, Player, Unit .. .. Player, PlayerManager, . . , MANGOS ( C++, ). - SQLAlchemy - , . , , .





-, - handler - . . () ( + - ), .





-, MANGOS , ( ?). (, ). , - , , ( blizzlike) WoW.





-, , , , - . , - , . .





, , .





  1. ,





  2. /













  3. /





  4. / (/)













MMO RPG , (, Login + World , - , - ..), , (, web , ). ( ). .





, , , . , , . .





P.S. . , , , , - .








All Articles