C'est très cool de programmer un mécanisme ou un module logiciel pour qu'il fasse votre volonté. Avec des pensées similaires à la fin de 2018, je pensais que je voulais créer mon propre serveur WoW, qui sera entièrement contrôlé par moi. Après avoir étudié les codes sources C ++ pour MANGOS , je suis arrivé à la conclusion que je ne peux pas prendre et mettre en œuvre toutes mes idées comme celle-ci, sans comprendre comment un serveur MMO RPG fonctionne du début à la fin. Et pour cela, j'ai décidé de mettre en place mon propre moteur. De zéro.
Pour commencer, au début je n'avais que le code source de la documentation. J'ai cherché petit à petit dans les forums des réponses à mes nombreuses questions (à ce propos - un immense respect pour la communauté MANGOS , - une équipe très réactive). Au total, cela a pris plusieurs mois avant, par essais et erreurs, j'ai implémenté mon premier prototype fonctionnel du serveur de connexion - et j'ai pu accéder à l'écran de sélection de personnage.
En bref, le serveur de connexion (comme l'authentification dans le client WoW) repose sur l'utilisation de l'algorithme SRP . La description de l'algorithme dépasse le cadre de l'article, mais en bref, elle vous permet d'identifier l'utilisateur sans envoyer le mot de passe au serveur, de sorte que le mot de passe (même sous forme de cache) ne puisse pas être stocké sur le serveur. Même souhaitable .
L'algorithme de cryptage du serveur World diffère très probablement d'un client à l'autre (j'ai fait cette conclusion lorsque j'ai brièvement étudié le code source du serveur WoW 3.3.5a ). Je développais un serveur pour WoW version 2.4.3. Quelque chose comme le chiffre César y est utilisé . Bien que plus souvent (dans la source), vous pouvez trouver le nom HeaderCrypt ou Wowcrypt.
En version 2.4.3, les 6 premiers octets sont cryptés: size (2) et opcode (4) de chaque paquet sur le serveur World ( sauf pour le premier paquet ). Par conséquent, si vous interceptez un paquet (sniff), vous ne pourrez pas déterminer à quel opcode il sera envoyé. Et si le paquet est volumineux, il peut être divisé en plusieurs, et pour les sortir correctement du tampon, ces 2 premiers octets ( taille ) sont nécessaires .
Le processus de connexion au serveur peut être brièvement décrit comme suit:
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.
, , .
,
/
/
/ (/)
-
MMO RPG , (, Login + World , - , - ..), , (, web , ). ( ). .
, , , . , , . .