Ir para conteúdo
Faça parte da equipe! (2024) ×

Começando um Servidor do ZERO


alexandrekva
 Compartilhar

Posts Recomendados

Um dia bateu a curiosidade sobre como seriam feito os servidores privados do WYD, e resolvi procurar para ver se encontrava algo sobre. Acabei encontrando o projeto do Open WYD e a série de vídeos "Emulador WYD em NodeJS" do @ Rechdan (fiquei inconformado quando cheguei no 5º vídeo e percebi que era o último :triste2: ).

Vim aqui compartilhar um pouco do que aprendi para aqueles que, assim como eu, não sabe nada de programação de jogos, mas sabe alguma coisa de programação no geral.

Início

Primeiramente, é importante escolher uma Client do WYD (ex: BR 7.54, 7.55 e assim por diante). Pra muitos pode parecer óbvio, mas a parte visual do jogo já está toda pronta, o que estaremos fazendo será apenas conectar nosso Client com o nosso próprio Servidor.

O jogo funciona a partir da comunicação entre o Client e o Servidor. Ao interagirmos com o jogo, o mesmo envia pacotes para o Servidor com as informações necessárias para que o mesmo processe a informação, enviando uma resposta ao jogo. Ou seja, durante o desenvolvimento do Servidor, precisamos ser capazes de receber um pacote do Cliente conectado, processarmos o pacote específico, e enviarmos uma resposta de volta para o cliente, atualizando-o.

1º Passo

O primeiro passo é escolhermos um Client como base, como dito anteriormente. Na minha tentativa, comecei com o 7.54. A lista de Clients pode ser encontrada neste link.

Tentei utilizar uma versão mais atual (se não me engano, a 7.62 foi utilizada na série pelo Rechdan), mas não conseguir iniciar o jogo com versões superiores a 7.55. Agradeceria se alguém puder disponibilizar o método de como atualizar os Clients através dos patches (entendi que seria essa a maneira de atualizar o jogo para versões posteriores, mas posso estar enganado).

Com um Client em mãos, precisamos descobrir o IP da sua máquina, que será responsável por hostear o Servidor. Para encontrar seu endereço abra o Prompt de Comando e digite "ipconfig -all" (sem aspas) e procure pelo "Endereço IPv4".

Agora será necessário editar o arquivo serverlist.bin dentro da pasta do WYD. Esse é o arquivo que armazena a informação dos servidores que o Client tentará se conectar. Se você baixar os Client da OnGame, por exemplo, lá estarão os servidores do antigo WYD BR, que obviamente não estão mais ativos, e por isso, todos os canais estarão offline. Existem alguns programas específicos para editarmos esse arquivo, já que você não consegue abrir esse arquivos e visualiza-los de maneira convencional. Perdi o link de onde baixei o meu, mas procurando na internet por "WYD serverlist editor" você também conseguirá encontrar. (adicionarei o link no post quando e se encontrar).

Ao abrir o arquivo com o editor, vemos alguns ip's, como por exemplo: "http://www.wyd.com.br/wyd_br/servers/serv01.asp".
Entendo que esse primeiro link seja responsável por retornar a quantidade de players no server. Você deve substituir pelo seu endpoint responsável por fazer o mesmo. No meu caso, coloquei como: "http://[meu ip]:3000/server".
Juntamente com esse primeiro link, teremos uma lista de IP's. Já nessa lista, entendo que seja o IP de cada canal. No meu caso, substitui apenas o primeiro IP por [meu ip], que será utilizado hostname no server socket.

(isso foi o que entendi vendo os vídeos e experimentando algumas coisas, por favor, se estiver errado, corrijam!)
(caso alguém saiba e queira compartilhar também, acharia interessante explicar como funciona o editor do serverlist.bin, o que precisaria ser feito para visualizar o arquivo como txt ou algo do tipo)

2º Passo

Tendo o serverlist editado, precisamos por no ar o nosso próprio servidor e você pode utilizar diversas tecnologias para isso. O Rechdan utilizou o NodeJS, mas no meu caso, por ter mais familiaridade com Kotlin, escolhi utilizar o KTOR. O primeiro passo é disponibilizar um endpoint responsável por retornar a quantidade de players no server. Esse endpoint deve ser o mesmo que você definiu na edição do serverlist. Nesse caso, criei um server na porta 3000 com o endpoint "http://[meu ip]:3000/server" que retorna um texto. Esse texto é a quantidade de players logados (acredito que seja entre 0 e 750), caso você mande 0, aparecerá um server vazio, e caso mande 750, o servidor aparecerá como FULL (pode ser que esses limites variem de acordo com cada Client, não tenho certeza). Inicialmente você pode deixar o endpoint retornando um valor fixo, como "100". Assim, ao menos um canal já deverá aparecer como disponível no jogo.

 

3º Passo

Agora devemos criar a parte responsável por gerenciar o servidor do game propriamente dito. Nesse caso, o servidor tenta se conectar a um Socket na porta 8281. O IP deverá ser o definido na serverlist também.

Caso tudo esteja correto, após preencher um ID e Senha, ao clicar em conectar, o Client se conectará com o seu server socket.

4º Passo

Crie um listener para ficar escutando as mensagens enviadas pelo Client, geralmente os pacotes serão armazenados em um Buffer. (atente-se na ordenação dos bytes no Buffer, eles devem estar ordenados em Little Endian. No meu caso estava em Big Endian, e demorei um tempinho até descobrir isso).
Ao tentar conectar, o client provavelmente enviará um pacote nas seguintes condições:
- Um pacote de tamanho 4 seguido de um pacote de tamanho 116.
- Um pacote de tamanho 120.

O pacote de 4 bytes pode ser ignorado, é apenas uma msg para dizer que se conectou ao server. Caso ele venha no formato de 120 bytes, apenas ignore os 4 primeiros.

São os 116 bytes que nos interessam. 

Todo pacote do WYD deve seguir a mesma estrutura.
Os primeiros 12 bytes são o cabeçalho do pacote, e contém as seguintes informações:
Os Bytes 0 e 1 são um Unsigned Short que indicam o tamanho do pacote. Nesse primeiro caso, será 116.

O Byte 2 é um Unsigned Byte que contem a key para criptografia.
O Byte 3 é um Unsigned Byte que contem a hash para verificação da criptografia/decriptografia.
Os Bytes 4 e 5 são um Short que indicam o código do pacote (cada pacote é identificado através desse código, o código do pacote de conexão, por exemplo, é o 525).
Os Bytes 6 e 7 são um Short que indicam o ID do cliente que enviou o pacote.
Os Bytes 8, 9, 10 e 11 são um Unsigned Int que indicam um timestamp.

Os demais Bytes são o conteúdo do pacote.

(mais infos sobre byte, short, int, long, signed e unsigned)

Os pacotes chegam ao seu servidor criptografados. Apenas os primeiros bytes não estão criptografados. Ou seja, as informações sobre o código do pacote, ID do cliente, timestamp e conteúdo estará completamente criptografado, e você não conseguirá manipula-lo.

5º Passo

Precisamos agora descriptografar/criptografar os nossos pacotes.
O algoritmo para tal está no repositório do Rechdan e também achei esse artigo interessante do @ raphaelts3 que fala um pouco mais a fundo sobre a criptografia do WYD (link do artigo).
Estude os códigos e tente implementar a criptografia. (No meu caso, utilizei o ChatGPT para me ajudar no entendimento do código e converter para Kotlin).

Para verificar se a criptografia está funcionando, descriptografe o pacote de conexão. Os 12 primeiros bytes do conteúdo do pacote (desconsiderando o header) são o login e os bytes 16 a 26 são a senha. Você pode transformar o pacote inteiro para uma string UTF-8. Se tudo estiver correto, você irá conseguir ver o ID e a Senha inseridos no cliente em seu pacote descriptografado.

6º Passo

Agora que estamos nos recebendo os pacotes do Client e conseguindo descriptografá-los, vamos tentar enviar um pacote para o Client.
Por enquanto, o único pacote que consegui enviar foi o que exibe um banner no topo da tela do Client com uma mensagem. Para o header desse pacote, utilize o código "257" e tamanho "108". Pode ser enviado um ID de cliente "0" e a chave de criptografia pode ser um Byte Unsigned aleatório entre 0 e 256. Para o conteúdo do pacote, converta uma string (sua mensagem) para um array de bytes. Após construir o seu pacote, criptográfe-o e envie para o Client, que deverá exibir a mensagem no topo da tela.


Próximos passos

 

Acredito que isso seja o básico do básico para que você seja capaz de criar um servidor de WYD inteiramente do zero. Para dar continuidade ao projeto, é importante entender o que o Client envia em cada pacote e o que ele espera receber como resposta. Até o momento, nem mesmo consegui ir para a tela de seleção de personagens (não sei se estou enviando um pacote diferente do que o Client 7.54 espera ou se há algum erro no mesmo).

Será necessário entender as estruturas dos dados utilizados no jogo (mobs, itens, status, etc...)

Também será necessário conectar-se com um banco de dados.

Ou seja, praticamente nada foi feito, mas achei interessante compartilhar essa informações para quem, assim como eu, soubesse alguma coisa de programação mas não soubesse nada de servidores privados de WYD. (usuários avançados provavelmente vão achar esse conteúdo bem inútil, haha)

Se eu conseguir avançar com algo além disso, volto aqui para atualizar o post.

Link para o meu repositório (precisa de java para rodar)


Dúvidas (minhas ou de vocês)

 

P: É viável construir um servidor inteiramente do zero dessa forma?
R: Não faço ideia, estou fazendo mais pela diversão.

P: E a performance de um servidor feito dessa maneira?
R: Também não sei como seria, afinal, nem ao menos consegui chegar na tela de personagens.

P: Como faço para descobrir todos os pacotes que o jogo envia e espera receber?
R: Gostaria muito de saber isso também, mas infelizmente não faço ideia. Espero que alguém possa dar uma luz nisso.


Provavelmente escrevi alguma coisa que pode estar errada, então sintam-se a vontade para corrigir! (por favor)
 

Editado por alexandrekva
erros ortográficos
Link para o comentário
Compartilhar em outros sites

22 horas atrás, alexandrekva disse:

Um dia bateu a curiosidade sobre como seriam feito os servidores privados do WYD, e resolvi procurar para ver se encontrava algo sobre. Acabei encontrando o projeto do Open WYD e a série de vídeos "Emulador WYD em NodeJS" do @ Rechdan (fiquei inconformado quando cheguei no 5º vídeo e percebi que era o último :triste2: ).

Vim aqui compartilhar um pouco do que aprendi para aqueles que, assim como eu, não sabe nada de programação de jogos, mas sabe alguma coisa de programação no geral.

Início

Primeiramente, é importante escolher uma Client do WYD (ex: BR 7.54, 7.55 e assim por diante). Pra muitos pode parecer óbvio, mas a parte visual do jogo já está toda pronta, o que estaremos fazendo será apenas conectar nosso Client com o nosso próprio Servidor.

O jogo funciona a partir da comunicação entre o Client e o Servidor. Ao interagirmos com o jogo, o mesmo envia pacotes para o Servidor com as informações necessárias para que o mesmo processe a informação, enviando uma resposta ao jogo. Ou seja, durante o desenvolvimento do Servidor, precisamos ser capazes de receber um pacote do Cliente conectado, processarmos o pacote específico, e enviarmos uma resposta de volta para o cliente, atualizando-o.

1º Passo

O primeiro passo é escolhermos um Client como base, como dito anteriormente. Na minha tentativa, comecei com o 7.54. A lista de Clients pode ser encontrada neste link.

Tentei utilizar uma versão mais atual (se não me engano, a 7.62 foi utilizada na série pelo Rechdan), mas não conseguir iniciar o jogo com versões superiores a 7.55. Agradeceria se alguém puder disponibilizar o método de como atualizar os Clients através dos patches (entendi que seria essa a maneira de atualizar o jogo para versões posteriores, mas posso estar enganado).

Com um Client em mãos, precisamos descobrir o IP da sua máquina, que será responsável por hostear o Servidor. Para encontrar seu endereço abra o Prompt de Comando e digite "ipconfig -all" (sem aspas) e procure pelo "Endereço IPv4".

Agora será necessário editar o arquivo serverlist.bin dentro da pasta do WYD. Esse é o arquivo que armazena a informação dos servidores que o Client tentará se conectar. Se você baixar os Client da OnGame, por exemplo, lá estarão os servidores do antigo WYD BR, que obviamente não estão mais ativos, e por isso, todos os canais estarão offline. Existem alguns programas específicos para editarmos esse arquivo, já que você não consegue abrir esse arquivos e visualiza-los de maneira convencional. Perdi o link de onde baixei o meu, mas procurando na internet por "WYD serverlist editor" você também conseguirá encontrar. (adicionarei o link no post quando e se encontrar).

Ao abrir o arquivo com o editor, vemos alguns ip's, como por exemplo: "http://www.wyd.com.br/wyd_br/servers/serv01.asp".
Entendo que esse primeiro link seja responsável por retornar a quantidade de players no server. Você deve substituir pelo seu endpoint responsável por fazer o mesmo. No meu caso, coloquei como: "http://[meu ip]:3000/server".
Juntamente com esse primeiro link, teremos uma lista de IP's. Já nessa lista, entendo que seja o IP de cada canal. No meu caso, substitui apenas o primeiro IP por [meu ip], que será utilizado hostname no server socket.

(isso foi o que entendi vendo os vídeos e experimentando algumas coisas, por favor, se estiver errado, corrijam!)
(caso alguém saiba e queira compartilhar também, acharia interessante explicar como funciona o editor do serverlist.bin, o que precisaria ser feito para visualizar o arquivo como txt ou algo do tipo)

2º Passo

Tendo o serverlist editado, precisamos por no ar o nosso próprio servidor e você pode utilizar diversas tecnologias para isso. O Rechdan utilizou o NodeJS, mas no meu caso, por ter mais familiaridade com Kotlin, escolhi utilizar o KTOR. O primeiro passo é disponibilizar um endpoint responsável por retornar a quantidade de players no server. Esse endpoint deve ser o mesmo que você definiu na edição do serverlist. Nesse caso, criei um server na porta 3000 com o endpoint "http://[meu ip]:3000/server" que retorna um texto. Esse texto é a quantidade de players logados (acredito que seja entre 0 e 750), caso você mande 0, aparecerá um server vazio, e caso mande 750, o servidor aparecerá como FULL (pode ser que esses limites variem de acordo com cada Client, não tenho certeza). Inicialmente você pode deixar o endpoint retornando um valor fixo, como "100". Assim, ao menos um canal já deverá aparecer como disponível no jogo.

 

3º Passo

Agora devemos criar a parte responsável por gerenciar o servidor do game propriamente dito. Nesse caso, o servidor tenta se conectar a um Socket na porta 8281. O IP deverá ser o definido na serverlist também.

Caso tudo esteja correto, após preencher um ID e Senha, ao clicar em conectar, o Client se conectará com o seu server socket.

4º Passo

Crie um listener para ficar escutando as mensagens enviadas pelo Client, geralmente os pacotes serão armazenados em um Buffer. (atente-se na ordenação dos bytes no Buffer, eles devem estar ordenados em Little Endian. No meu caso estava em Big Endian, e demorei um tempinho até descobrir isso).
Ao tentar conectar, o client provavelmente enviará um pacote nas seguintes condições:
- Um pacote de tamanho 4 seguido de um pacote de tamanho 116.
- Um pacote de tamanho 120.

O pacote de 4 bytes pode ser ignorado, é apenas uma msg para dizer que se conectou ao server. Caso ele venha no formato de 120 bytes, apenas ignore os 4 primeiros.

São os 116 bytes que nos interessam. 

Todo pacote do WYD deve seguir a mesma estrutura.
Os primeiros 12 bytes são o cabeçalho do pacote, e contém as seguintes informações:
Os Bytes 0 e 1 são um Unsigned Short que indicam o tamanho do pacote. Nesse primeiro caso, será 116.

O Byte 2 é um Unsigned Byte que contem a key para criptografia.
O Byte 3 é um Unsigned Byte que contem a hash para verificação da criptografia/decriptografia.
Os Bytes 4 e 5 são um Short que indicam o código do pacote (cada pacote é identificado através desse código, o código do pacote de conexão, por exemplo, é o 525).
Os Bytes 6 e 7 são um Short que indicam o ID do cliente que enviou o pacote.
Os Bytes 8, 9, 10 e 11 são um Unsigned Int que indicam um timestamp.

Os demais Bytes são o conteúdo do pacote.

(mais infos sobre byte, short, int, long, signed e unsigned)

Os pacotes chegam ao seu servidor criptografados. Apenas os primeiros bytes não estão criptografados. Ou seja, as informações sobre o código do pacote, ID do cliente, timestamp e conteúdo estará completamente criptografado, e você não conseguirá manipula-lo.

5º Passo

Precisamos agora descriptografar/criptografar os nossos pacotes.
O algoritmo para tal está no repositório do Rechdan e também achei esse artigo interessante do @ raphaelts3 que fala um pouco mais a fundo sobre a criptografia do WYD (link do artigo).
Estude os códigos e tente implementar a criptografia. (No meu caso, utilizei o ChatGPT para me ajudar no entendimento do código e converter para Kotlin).

Para verificar se a criptografia está funcionando, descriptografe o pacote de conexão. Os 12 primeiros bytes do conteúdo do pacote (desconsiderando o header) são o login e os bytes 16 a 26 são a senha. Você pode transformar o pacote inteiro para uma string UTF-8. Se tudo estiver correto, você irá conseguir ver o ID e a Senha inseridos no cliente em seu pacote descriptografado.

6º Passo

Agora que estamos nos recebendo os pacotes do Client e conseguindo descriptografá-los, vamos tentar enviar um pacote para o Client.
Por enquanto, o único pacote que consegui enviar foi o que exibe um banner no topo da tela do Client com uma mensagem. Para o header desse pacote, utilize o código "257" e tamanho "108". Pode ser enviado um ID de cliente "0" e a chave de criptografia pode ser um Byte Unsigned aleatório entre 0 e 256. Para o conteúdo do pacote, converta uma string (sua mensagem) para um array de bytes. Após construir o seu pacote, criptográfe-o e envie para o Client, que deverá exibir a mensagem no topo da tela.


Próximos passos

 

Acredito que isso seja o básico do básico para que você seja capaz de criar um servidor de WYD inteiramente do zero. Para dar continuidade ao projeto, é importante entender o que o Client envia em cada pacote e o que ele espera receber como resposta. Até o momento, nem mesmo consegui ir para a tela de seleção de personagens (não sei se estou enviando um pacote diferente do que o Client 7.54 espera ou se há algum erro no mesmo).

Será necessário entender as estruturas dos dados utilizados no jogo (mobs, itens, status, etc...)

Também será necessário conectar-se com um banco de dados.

Ou seja, praticamente nada foi feito, mas achei interessante compartilhar essa informações para quem, assim como eu, soubesse alguma coisa de programação mas não soubesse nada de servidores privados de WYD. (usuários avançados provavelmente vão achar esse conteúdo bem inútil, haha)

Se eu conseguir avançar com algo além disso, volto aqui para atualizar o post.

Link para o meu repositório (precisa de java para rodar)


Dúvidas (minhas ou de vocês)

 

P: É viável construir um servidor inteiramente do zero dessa forma?
R: Não faço ideia, estou fazendo mais pela diversão.

P: E a performance de um servidor feito dessa maneira?
R: Também não sei como seria, afinal, nem ao menos consegui chegar na tela de personagens.

P: Como faço para descobrir todos os pacotes que o jogo envia e espera receber?
R: Gostaria muito de saber isso também, mas infelizmente não faço ideia. Espero que alguém possa dar uma luz nisso.


Provavelmente escrevi alguma coisa que pode estar errada, então sintam-se a vontade para corrigir! (por favor)
 

voce escreveu tudo certo porem procurou no lugar errado o conteudo do Redchan é um dos piores para se aprender , recomendo gamers designer mais antigos estes ai sim são feras , espero que seja uma critica construtiva apenas ... nada de defamar pq tudo que opino aqui no forum é motivo de ban , advertencia e blablabla pelo coordenador sabala jaja ele vem aqui e da advertencia porque comentei em sua postagem , espero que ache mais conteudo isto numca faltou procurado em locais certos .

Link para o comentário
Compartilhar em outros sites

  • Coordenador
1 hora atrás, Listsa disse:

voce escreveu tudo certo porem procurou no lugar errado o conteudo do Redchan é um dos piores para se aprender , recomendo gamers designer mais antigos estes ai sim são feras , espero que seja uma critica construtiva apenas ... nada de defamar pq tudo que opino aqui no forum é motivo de ban , advertencia e blablabla pelo coordenador sabala jaja ele vem aqui e da advertencia porque comentei em sua postagem , espero que ache mais conteudo isto numca faltou procurado em locais certos .

O bom filho a casa torna. 

Link para o comentário
Compartilhar em outros sites

Ótima iniciativa, comunidade agradece ♥️

Somos responsáveis por aquilo que fazemos, o que não fazemos e o que impedimos de ser feito.- Albert Camus

.:: ϟOdinϟ ::.
[Equipe WebCheats]

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois...

@ alexandrekva que bom que curtiu, esse emulador em Node tem muito o que poderia melhorar, quem sabe um dia não dou um tapa :) 

 

  

Em 08/07/2023 em 12:41, Listsa disse:

voce escreveu tudo certo porem procurou no lugar errado o conteudo do Redchan é um dos piores para se aprender , recomendo gamers designer mais antigos estes ai sim são feras , espero que seja uma critica construtiva apenas ... nada de defamar pq tudo que opino aqui no forum é motivo de ban , advertencia e blablabla pelo coordenador sabala jaja ele vem aqui e da advertencia porque comentei em sua postagem , espero que ache mais conteudo isto numca faltou procurado em locais certos .

Cuitado de mim .-.

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...
Em 08/07/2023 em 12:41, Listsa disse:

voce escreveu tudo certo porem procurou no lugar errado o conteudo do Redchan é um dos piores para se aprender , recomendo gamers designer mais antigos estes ai sim são feras , espero que seja uma critica construtiva apenas ... nada de defamar pq tudo que opino aqui no forum é motivo de ban , advertencia e blablabla pelo coordenador sabala jaja ele vem aqui e da advertencia porque comentei em sua postagem , espero que ache mais conteudo isto numca faltou procurado em locais certos .

qual você indicaria?

Link para o comentário
Compartilhar em outros sites

P: É viável construir um servidor inteiramente do zero dessa forma?
Não sei bem que forma você quis dizer, mas, é possível construir um servidor de qualquer forma que você tiver ideia, provavelmente. De maneiras boas, maneiras ruins, maneiras foda-se.

 

P: Como faço para descobrir todos os pacotes que o jogo envia e espera receber?
Analisando mesmo. Mas todos os pacotes já foram disponibilizados de alguma forma. O TMProject tem todos eles, acredito.

Link para o comentário
Compartilhar em outros sites

5 horas atrás, Shepher disse:

P: É viável construir um servidor inteiramente do zero dessa forma?
Não sei bem que forma você quis dizer, mas, é possível construir um servidor de qualquer forma que você tiver ideia, provavelmente. De maneiras boas, maneiras ruins, maneiras foda-se.

 

P: Como faço para descobrir todos os pacotes que o jogo envia e espera receber?
Analisando mesmo. Mas todos os pacotes já foram disponibilizados de alguma forma. O TMProject tem todos eles, acredito.

tem que fazer a desconpilação do asp.shor assim libera as criptografias dele o mesmo pode ser reconstruido o envio das tabelas 1 a 1 ou vice versa .

Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Cadastre-se Agora para publicar com Sua Conta.
Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

 Compartilhar

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.