VB/VB.Net Déconnexion après reception du 42.

Inscrit
29 Juin 2015
Messages
10
Reactions
0
#1
Bonsoir, j'espère que vous allez bien ! Bon, j'ai repris Rebirth1 il y a peu afin de le rendre compatible avec la version actuel Dofus. Dans un premier lieu, j'ai réussi à me connecter à la liste du serveur, cependant en essayant de me connecter à un serveur D2, on me déconnecte systématiquement après la reception du 42.

Alors, j'ai suivi le code en mettant des points d'arrêt afin de me renseigner sur l'emplacement du bug, apparemment c'est lors du deserialize du 42
ElseIf (PacketID = 42 Or PacketID = 6469) Then
Dim Message As New SelectedServerDataMessage
If (PacketID = 6469) Then
Message = New SelectedServerDataExtendedMessage
End If
Message.Deserialize(Reader)

J'ai reverifié les readers ( ceux d'BlueDream que j'ai traduit en VB) mais ils sont bel et bien corrects. Les voilà ainsi que le 42 :

42 :
Imports RebirthAPI.Network
Namespace Dofus.Network.Messages.Connection
Public Class SelectedServerDataMessage
Inherits NetworkMessage

Public Overrides Property ProtocolID As UInteger = 42
Private _ServerId As UShort
Private _Address As String
Private _Port As UShort
Private _CanCreateNewCharacter As Boolean
Private _Ticket As SByte()

Public Property [ServerId] As UShort
Get
Return Me._ServerId
End Get
Set(value As UShort)
Me._ServerId = value
End Set
End Property
Public Property [Address] As String
Get
Return Me._Address
End Get
Set(value As String)
Me._Address = value
End Set
End Property
Public Property [Port] As UShort
Get
Return Me._Port
End Get
Set(value As UShort)
Me._Port = value
End Set
End Property
Public Property [CanCreateNewCharacter] As Boolean
Get
Return Me._CanCreateNewCharacter
End Get
Set(value As Boolean)
Me._CanCreateNewCharacter = value
End Set
End Property
Public Property [Ticket] As SByte()
Get
Return Me._Ticket
End Get
Set(value As SByte())
Me._Ticket = value
End Set
End Property

Public Overrides Sub Serialize(ByVal Writer As DofusMessage)
Writer.WriteVaruhshort(Me._ServerId)
Writer.WriteString(Me._Address)
Writer.WriteUInt16(Me._Port)
Writer.WriteBoolean(Me._CanCreateNewCharacter)
Writer.WriteVarint(CInt(CUShort(Ticket.Length)))
For Each entry As SByte In Ticket
Writer.WriteSByte(entry)
Next
End Sub

Public Overrides Sub Deserialize(ByVal Reader As DofusReader)
Me._ServerId = Reader.ReadVaruhshort
Me._Address = Reader.ReadString
Me._Port = Reader.ReadUInt16
Me._CanCreateNewCharacter = Reader.ReadBoolean
Dim limit = CUShort(Reader.ReadVarInt())
_Ticket = New SByte(limit - 1) {}
For i As Integer = 0 To limit - 1
_Ticket(i) = Reader.ReadSByte()
Next
End Sub
End Class
End Namespace


Readers concernés ( ceux d'BlueDream que j'ai traduit en VB) :
Public Function ReadVarShort() As Short
Dim local_4 = 0
Dim local_1 = 0
Dim local_2 = 0
Dim local_3 = False

While local_2 < SHORT_SIZE
local_4 = ReadByte()
local_3 = (local_4 And MASK_1) = MASK_1

If local_2 > 0 Then
local_1 += ((local_4 And MASK_0) << local_2)
Else
local_1 += (local_4 And MASK_0)
End If

local_2 += CHUNCK_BIT_SIZE

If Not local_3 Then
If local_1 > SHORT_MAX_VALUE Then
local_1 -= UNSIGNED_SHORT_MAX_VALUE
End If
Return local_1
End If
End While

Throw New System.Exception("Too much data")
End Function

Public Function ReadVarUhShort() As UShort
Return CUShort(ReadVarShort())
End Function

Une autre chose bizarre remarquée c'est qu'en analysant les datas du 42 , le canCreateNewCharacter n'a pas de bytes correspondants et l'adresse est 213.248.126.94 alors que c'est en local normalement. Voilà le screen corresponsant "pas de bytes pour le canCreateNewCharacter" :
 
Dernière édition par un modérateur:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Bonsoir,

il faut savoir que ma manière d'interpréter les paquets n'est pas la même que celle de dofus, tu devrais peut être essayer de faire comme eux:

Deserialize

Code:
public function deserializeAs_SelectedServerDataMessage(param1:ICustomDataInput) : void
      {
         var _loc4_:* = 0;
         this.serverId = param1.readVarUhShort();
         if(this.serverId < 0)
         {
            throw new Error("Forbidden value (" + this.serverId + ") on element of SelectedServerDataMessage.serverId.");
         }
         else
         {
            this.address = param1.readUTF();
            this.port = param1.readUnsignedShort();
            if(this.port < 0 || this.port > 65535)
            {
               throw new Error("Forbidden value (" + this.port + ") on element of SelectedServerDataMessage.port.");
            }
            else
            {
               this.canCreateNewCharacter = param1.readBoolean();
               var _loc2_:uint = param1.readVarInt();
               var _loc3_:uint = 0;
               while(_loc3_ < _loc2_)
               {
                  _loc4_ = param1.readByte();
                  this.ticket.push(_loc4_);
                  _loc3_++;
               }
               return;
            }
         }
      }

Serialize

Code:
public function serializeAs_SelectedServerDataMessage(param1:ICustomDataOutput) : void
      {
         if(this.serverId < 0)
         {
            throw new Error("Forbidden value (" + this.serverId + ") on element serverId.");
         }
         else
         {
            param1.writeVarShort(this.serverId);
            param1.writeUTF(this.address);
            if(this.port < 0 || this.port > 65535)
            {
               throw new Error("Forbidden value (" + this.port + ") on element port.");
            }
            else
            {
               param1.writeShort(this.port);
               param1.writeBoolean(this.canCreateNewCharacter);
               param1.writeVarInt(this.ticket.length);
               var _loc2_:uint = 0;
               while(_loc2_ < this.ticket.length)
               {
                  param1.writeByte(this.ticket[_loc2_]);
                  _loc2_++;
               }
               return;
            }
         }
      }

En ce qui concerne l'adresse que tu reçois, c'est tout à fait normal, le serveur t'envoi ses données normalement, c'est à toi de trafiquer l'adresse et le port.

Bonne chance
 
Inscrit
29 Juin 2015
Messages
10
Reactions
0
#3
Le serialize et le deserialize sont bons, je les ai déjà utilisé pour réaliser une connexion sur un autre bot. Même les readers / writers, j'ai pris les tiens et je les ai traduit en vb et j'ai bien vérifié la traduction ligne par ligne :/
Ce qui fait bizarre c'est le cancreatenewCharacter qui n'à aucun byte correspondant aux données du packet ... Cela fait plus d'une semaine que je bloque là dessus et je n'arrive vraiment pas à cerner le problème sachant qu'en utilisant des Points d'arrêt, le problème vient du deserialize du 42 :/ pourtant tout paraît bon
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#4
Moi j'utilise ceux de alex,
Mais je les ai pas traduits, j'ai gardé la version c#, renomé ReadByte en ReadUnsignedByte, ReadSbyte en ReadByte et Quels que ReadU* en ReadUnsigned* et ça marche parfaitement :)
 
Inscrit
29 Juin 2015
Messages
10
Reactions
0
#5
Tu parles de rebirth 1 ? Celui codé en vb ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#6
Ta fonction ReadVarShort est fausse.

>>> != >>
 
Inscrit
29 Juin 2015
Messages
10
Reactions
0
#7
Je viens de revérifier mon ReadVarShort en se basant sur le tien, et je ne vois pas ce qui pourrait être faux :/
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Après vérification, je me suis trompé, ta fonction est bonne. Le problème ne vient donc ni du reader, ni du deserialize.
Montres nous le traitement du paquet et les logs rebirth.

Il faut savoir qu'au par avant le ticket était envoyé pure, en string. Désormais il est crypté, ce qui nous empêche de reconnaître le client après la migration vu que la clé qui permet le décryptage est généré dans le client au début de la connexion.

Ce qui à mon avis pose problème, c'est lorsque tu envois le 42 trafiqué au client.
 
Inscrit
29 Juin 2015
Messages
10
Reactions
0
#9
Les voilà :
ClientReceivePacket:
Private Sub ClientReceivePacket(ByVal PacketID As Integer, ByVal PacketLength As Integer, ByVal Reader As DofusReader)
Try
If Not IsTransfertPacketFromClientCancelled(PacketID, Reader) Then
Dim message As New DofusMessage
If (Not Reader Is Nothing) Then
Reader.BaseStream.Position = 0
message.WriteBytes(Reader.ReadBytes(PacketLength))
End If
message.Send(Me.GetServerSocket, PacketID)

End If
Catch Ex As Exception
MsgBox(Ex.ToString)
End Try
End Sub

Serverreceivepacket:
Private Sub ServerReceivePacket(ByVal PacketID As Integer, ByVal PacketLength As Integer, ByVal Reader As DofusReader)
Try
If Not Me.IsTransfertPacketFromServerCancelled(PacketID, Reader) Then
Dim message As New DofusMessage
If (Not Reader Is Nothing) Then
Reader.BaseStream.Position = 0
message.WriteBytes(Reader.ReadBytes(PacketLength))
End If
message.Send(Me.GetClientSocket, PacketID)
End If
Catch Ex As Exception
MsgBox(Ex.ToString)
End Try
End Sub

IsTransfertPacketFromServerCancelled:
Private Function IsTransfertPacketFromServerCancelled(ByVal PacketID As Integer, ByVal Reader As DofusReader) As Boolean
If (PacketID = 22) Then
Dim IdentificationSuccessMessage As New IdentificationSuccessMessage
IdentificationSuccessMessage.Deserialize(Reader)
v_SavLogin = IdentificationSuccessMessage.Login
v_SavSubscriptionEndDate = IdentificationSuccessMessage.SubscriptionEndDate
Return False
ElseIf (PacketID = 42 Or PacketID = 6469) Then
Dim Message As New SelectedServerDataMessage
If (PacketID = 6469) Then
Message = New SelectedServerDataExtendedMessage
End If
Message.Deserialize(Reader)
If (v_IsMITM) Then
ParseurMITM1.ServerAddress = Message.Address
ParseurMITM1.ServerId = Message.ServerId
ParseurMITM1.TransfertLogin = Me.v_SavLogin
ParseurMITM1.TransfertSubscriptionEndDate = v_SavSubscriptionEndDate
Message.Address = "127.0.0.1"
Message.Port = 5556
Message.Pack(Me.GetClientSocket)
Ticket = Message.Ticket
Return True
Else
Message.Address = "127.0.0.1"
Message.Port = 5556
Message.Pack(Me.GetClientSocket)
Return False
End If
ElseIf PacketID = 50 Then
Dim msg As New ServerStatusUpdateMessage
msg.Deserialize(Reader)
Dim server As RebirthAPI.Dofus.Network.Types.Connection.GameServerInformations = msg.Server
ElseIf PacketID = 3 Then
Dim msg As New HelloConnectMessage
msg.Deserialize(Reader)
End If
Return False
End Function

Les logs sont sur le screen :
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#10
Tout est dans l'erreur je trouve que tu abuses un peu.
 
Inscrit
29 Juin 2015
Messages
10
Reactions
0
#11
J'ai bien suivi le code jusqu'au bug ( le deserialize du 42) avec des points d'arrêt et je n'arrive pas à trouver d'où viendrait le probleme mais surement lors du traitement des packets, je les vérifierai
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#12
Tu as une variable null, donc le serialize ne peut pas écrire la valeur, par conséquent le 42 trafiqué ne s'envoit pas et le client se déconnecte.
 
Inscrit
29 Juin 2015
Messages
10
Reactions
0
#13
Exactement, j'ai réussi à résoudre le problème en passant par tes IO non traduits ( dll externe). Cependant; en suivant le code avec des points d'arrêt, ça bloque lors de la lecture du ticket ce qui donne un null référence ce qui est normal vu que lors du writesbyte il n y a qu'une valeur nulle
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#14
ça peut venir du fait que dans les Reader il y a un problème de nom, ReadByte devrait normalement retourné un Sbyte et ReadUbyte(qui est ReadUnsignedByte dans les .as) devrait retourné un Byte. (Je ne sais pas si alex à modifier ces IO, après ça dépend de ton traducteur de packet aussi.)
 

neross

Membre Actif
Inscrit
20 Decembre 2014
Messages
150
Reactions
0
#17
Oublie je m'amuse pas à tout retraduire. ;)
Du coup je peux pas t'aider au niveau de ton paquet sorry. :3

Edit : Si je les traduirais quand je ferais mon Tuto sur les BigEndians.

BisEdit : Alexandre raconte de la merde entre la 2.27 et la 2.29 les reader et writer ne change pas. Donc tu peux utiliser le reader que je t'est envoyé. :)
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#18
neross a dit:
Alexandre raconte de la merde entre la 2.27 et la 2.29 les reader et writer ne change pas. Donc tu peux utiliser le reader que je t'est envoyé. :)
Je pense qu'il a édité (dans ces sources) ce que j'ai dit plus haut, (Problème de nom à cause du .Net ou "Byte" est un Ubyte alors que pour tout les autres types (int par exemple) c'est S(int))
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#19
Je n'ai pas touché à ton message nico, après vérification les dernières modifications ont eu lieu en 2.27.
 
Inscrit
31 Mars 2012
Messages
102
Reactions
0
#20
Ha non alex, je voulais dire éditer tes sources, pas mon message :p
 
Haut Bas