É muito legal programar um mecanismo ou módulo de software para fazer sua vontade. Com pensamentos semelhantes no final de 2018, estava pensando que quero fazer meu próprio servidor WoW, que será totalmente controlado por mim. Tendo estudado os códigos-fonte C ++ para MANGOS , cheguei à conclusão que não posso pegar e implementar todas as minhas ideias assim, sem entender como um servidor MMO RPG funciona do início ao fim. E para isso resolvi implantar meu próprio motor. Do princípio.
Para começar, no início eu só tinha o código-fonte da documentação. Eu procurei nos fóruns aos poucos as respostas às minhas muitas perguntas (a este respeito - um grande respeito pela comunidade MANGOS , - uma equipe muito receptiva). No total, demorou vários meses antes de, por tentativa e erro, implementar meu primeiro protótipo funcional do servidor de Login - e conseguir chegar à tela de seleção de personagens.
Resumindo, o servidor de login (como a autenticação no cliente WoW) é baseado no uso do algoritmo SRP . A descrição do algoritmo foge ao escopo do artigo, mas em resumo, permite identificar o usuário sem enviar a senha ao servidor, de forma que a senha (mesmo em cache) não possa ser armazenada no servidor. Até desejável .
O algoritmo de criptografia do servidor World provavelmente difere de cliente para cliente (cheguei a essa conclusão quando estudei brevemente o código-fonte do servidor WoW 3.3.5a ). Estava desenvolvendo um servidor para WoW versão 2.4.3. Algo como a cifra de César é usada lá . Embora com mais freqüência (na fonte), você pode encontrar o nome HeaderCrypt ou Wowcrypt.
Na versão 2.4.3, os primeiros 6 bytes são criptografados: tamanho (2) e opcode (4) de cada pacote no servidor mundial ( exceto para o primeiro pacote ). Conseqüentemente, se você interceptar um pacote (sniff), não será capaz de determinar para qual opcode ele será enviado. E se o pacote for grande, ele pode ser dividido em vários e, para retirá-los do buffer corretamente, esses primeiros 2 bytes ( tamanho ) são necessários .
O processo de login no servidor pode ser descrito resumidamente da seguinte forma:
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 , ). ( ). .
, , , . , , . .