2.0 ServerSelectionMessage met fin à la connexion

Inscrit
1 Mai 2021
Messages
3
Reactions
0
#1
Bonjour,

Je me suis lancé il y a quelques jours dans la création d’un bot dofus socket (C#) afin d’automatiser des recherches de prix dans les hôtels de vente.
Je pense avoir bien réussi la partie authentification mais je me retrouve bloqué au message : ServerSelectionMessage

Voici la liste des paquets reçus/envoyés :
Reçu : ID=4048 ProtocolRequired
Reçu : ID=4319 HelloConnectMessage
Envoyé : ID=6391 IdentificationMessage
Reçu : ID=7722 LoginQueueStatusMessage
Reçu : ID=7348 CredentialsAcknowledgementMessage
Reçu : ID=7722 LoginQueueStatusMessage
Reçu : ID=3736 IdentificationSuccessMessage
Reçu : ID=5713 ServersListMessage

J’envoie alors le message : ID=9396 ServerSelectionMessage et là le serveur met fin à la connexion :
TCP 60 5555 → 65491 [FIN, ACK] Seq=923 Ack=297 Win=28160 Len=0

En analysant le reséau avec Wireshark en jeu quand je clique sur choisir son serveur et que je clique sur le serveur Merkator, voici le paquet envoyé :
92d1 00000048 02 d201
Id,typelen + instance_id + data.length + serverId

J’ai utilisé un compteur qui s’incrémente à chaque envoi/reçu de paquet pour calculer l'instance_id. J’envoie alors le paquet :
92d1 00000009 02 d201
(l’instance id changeant légèrement en fonction du nombre de paquets reçus).

Mais du coup dès que j’envoie ce paquet, le serveur met fin à la connexion et je ne comprends pas pourquoi.
Est-ce que vous pensez que le problème peut venir de l’instance_id ? Le serveur vérifie-t-il réellement si les instances_id se suivent parfaitement ? Mais même en essayant différentes valeurs entre 8 et 15 ça ne change rien.
Ou bien alors j’ai manqué une étape ?

Je ne sais pas si ça peut avoir son importance, mais voici ce que je place comme paramètres dans le IdentificationMessage:
C#:
writer.WriteByte(0);
writer.WriteByte(2);
writer.WriteByte(59);
writer.WriteByte(4);
writer.WriteInt(5);
writer.WriteByte(0);
writer.WriteUTF("fr");
writer.WriteVarInt(credLen);
writer.WriteBytes(credentials);
writer.WriteShort(0);
writer.WriteVarLong(0);
writer.WriteShort(0);
Est-ce que quelqu'un aurait déjà eu le problème ou bien verrait ce qui cloche?
Merci d'avance,

Bonne journée.
 

9True

Membre
Inscrit
1 Février 2017
Messages
24
Reactions
6
#2
Tu dois ouvrir une nouvelle connection avec l'IP du serveur que tu veux rejoindre (et, évidemment, fermer la connexion avec le serveur de login avant)
 
Inscrit
1 Mai 2021
Messages
3
Reactions
0
#3
Tu dois ouvrir une nouvelle connection avec l'IP du serveur que tu veux rejoindre (et, évidemment, fermer la connexion avec le serveur de login avant)
Mais comment je peux connaître à l'avance l'IP du serveur de jeu. J'ai l'impression que l'IP peut varier en fonction des jours.
Est ce que je suis pas censé recevoir le message : SelectedServerDataMessage ?
 

9True

Membre
Inscrit
1 Février 2017
Messages
24
Reactions
6
#4
Ce que je peux te conseiller, ne modifie pas les paquets pour debug. Essaies d'y aller en mode "vrai" MITM et fait que distribuer les paquets entre le client (ton jeu) et le serveur (Ankama). En arrière, tu log la communication des deux côtés pour te faire un portrait de ce qui se passe. Ensuite, tu peux comparer les paquets "normaux" que le client envoie avec ce que ton programme recrée. Ils devraient toujours être identiques, à l'exception d'une modification d'une valeur délibérément.

Si je ne me trompe pas, la connexion se ferme au SelectedServerDataMessage, donc si tu ne le reçoit pas avant que ça coupe, il y a probablement un paquet que tu envoies qui n'est pas valide. La première étape serait de valider le tout.
 
Inscrit
1 Mai 2021
Messages
3
Reactions
0
#5
Merci pour ta réponse!
Je t'avoue que je préfère rester sur l'idée de faire un bot full socket plutôt que de faire un vrai MITM pour le moment. J'ai analysé les paquets un peu plus en profondeur quand je lançais le jeu et je pense avoir réglé mon problème. Ça venait du IdentificationMessage:
De 1, au lieu de mettre 0 au premier byte, j'ai mis 1 pour activer l'autoconnect.
Et de 2, je mettais 0 pour le serverId... Donc j'ai écris en short l'id du serveur sur lequel je voulais me connecter.

Maintenant je reçois le paquet : SelectedServerDataExtendedMessage qui me permettra d'avoir l'ip et port du serveur et le ticket que je devrai décrypter avec ma clé AES si j'ai bien compris.
 
Haut Bas