Idewavecore. Retrospectivo

Es genial programar un mecanismo o módulo de software para que haga tu voluntad. Con pensamientos similares a finales de 2018, estaba pensando que quiero hacer mi propio servidor WoW, que será completamente controlado por mí. Habiendo estudiado los códigos fuente de C ++ para MANGOS , llegué a la conclusión de que no puedo tomar e implementar todas mis ideas de esta manera, sin comprender cómo funciona un servidor MMO RPG de principio a fin. Y para ello, decidí implementar mi propio motor. Desde cero.






Para empezar, al principio solo tenía el código fuente de la documentación. Busqué en los foros poco a poco las respuestas a mis muchas preguntas (en este sentido, un gran respeto por la comunidad MANGOS , un equipo muy receptivo). En total, pasaron varios meses antes de que, por prueba y error, implementara mi primer prototipo funcional del servidor de inicio de sesión y pude acceder a la pantalla de selección de personajes.





En resumen, el servidor de inicio de sesión (como la autenticación en el cliente WoW) se basa en el uso del algoritmo SRP . La descripción del algoritmo está fuera del alcance del artículo, pero en resumen, le permite identificar al usuario sin enviar la contraseña al servidor, por lo que la contraseña (incluso en forma de caché) no se puede almacenar en el servidor. Incluso deseable .





El algoritmo de cifrado del servidor World probablemente difiera de un cliente a otro (llegué a esta conclusión cuando estudié brevemente el código fuente del servidor WoW 3.3.5a ). Estaba desarrollando un servidor para WoW versión 2.4.3. Allí se usa algo como el cifrado César . Aunque más a menudo (en la fuente) puedes encontrar el nombre HeaderCrypt o Wowcrypt.





En la versión 2.4.3, los primeros 6 bytes están encriptados: tamaño (2) y código de operación (4) de cada paquete en el servidor mundial ( excepto el primer paquete ). En consecuencia, si intercepta un paquete (sniff), no podrá determinar a qué código de operación se enviará. Y si el paquete es grande, entonces se puede dividir en varios, y para sacarlos del búfer correctamente, se necesitan estos primeros 2 bytes ( tamaño ).





El proceso de inicio de sesión en el servidor se puede describir brevemente de la siguiente manera:





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