VB/VB.Net Le serveur me kick à la réception du AuthenticationTicketMessage

Inscrit
17 Avril 2015
Messages
119
Reactions
0
#1
Bonjours,
Toujours dans mon apprentissage, j'avance grâce à toute les personnes sur Cadernis. Merci encore.

Aujourd’hui dans mon bot MITM je gère le packet 42. ( Vérification log : [11:41:17:944] [ServerConnection] Connecting to 127.0.0.1:443... ).

Mais à la réception donc du packet 110 j'ai l'erreur : [11:41:19] Le thread a été abandonné.

Ma classe GameSock:
Dim _SSD As New Network.Connection.Server.Select.SelectedServerDataMessage
_SSD.Deserialize(New BigEndianReader(New System.IO.MemoryStream(packet)))

Main.GameIp = _SSD.address
Main.GamePort = _SSD.port

Dim SSD As New Network.Connection.Server.Select.SelectedServerDataMessage
SSD.init(_SSD.serverId, "127.0.0.1", 443, _SSD.canCreateNewCharacter, _SSD.ticket)
SSD.pack(MySock)

ServerSock.Close()
MySock.Close()

Public Class GameSock
Public WithEvents MySock As New BazSocket.BazSocket
Public WithEvents ServerSock As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Public MyLog As LogBot
Public ConsoleLog As LogConsole
Public Main As MainForm
Public FormBot As FormBot

Private ListenServerSock As New Thread(New ThreadStart(AddressOf ListenServer))
Public IsDisconnectWant As Boolean = False

Private buffer(8191) As Byte
Private Data_Out(0) As Byte
Private Waiting As Integer
Private Packet As Integer = 0

'#############Socket##############

Public Sub Initialize(ByVal Ip As String, ByVal port As Integer)
ListenServerSock = New Thread(New ThreadStart(AddressOf ListenServer))
ServerSock = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
ServerSock.Connect(Ip, port)
ListenServerSock.Start()



End Sub

Public Sub Close()
Try
ServerSock.Close()
ListenServerSock.Abort()
ListenServerSock.Join()
IsDisconnectWant = True
MySock.Disconnect()
MySock.Close()
Catch exe As Exception
ConsoleLog.WriteError(exe.Message)
End Try
MyLog.WriteError("Client déconnecté du socket de jeu")
End Sub

Private Sub Client_Close(ByVal sender As Object, ByVal e As System.EventArgs) Handles MySock.Closed
If IsDisconnectWant = False Then
Close()
FormBot.Close()
End If
End Sub

Private Sub Client_DataArrival(ByVal sender As Object, ByVal data() As Byte) Handles MySock.DataArrival
ServerSock.Send(data)
parsing(data, False)
End Sub

Private Sub ListenServer()
While ServerSock.Connected ' boucle infinie tant que connecté
Dim i = ServerSock.Receive(buffer) ' on met dans i le nombre d'octets recu
Dim data(i - 1) As Byte ' on créé un tableau de bytes du nombre de bytes recus
Array.Copy(buffer, data, i) ' on copie buffer dans data
MySock.Send(data)
parsing(data, True)

If i = 0 Then
Close()
FormBot.Close()
Return
End If
End While
End Sub

Public Sub parsing(ByVal data() As Byte, ByVal IsServer As Boolean)
Dim packetid As UShort
Dim index As Integer ' pour savoir ou on est
Dim id_and_length As UShort ' les 2 premiers octets (16 bits)
Dim packet_id As UShort ' les 14 premiers bits des 16
Dim packet_length_of As Byte ' les 2 derniers bits des 16
Dim packet_length As Integer ' la longueur du packet
Dim Packet_Start As Integer
Dim Packet_End As Integer

If Waiting > 1 Then ' le buffer etait trop petit ?
Dim data_temps(data.Length + Data_Out.Length - 1) As Byte ' on créé un tableau de byte temporaire
Array.Copy(Data_Out, 0, data_temps, 0, Data_Out.Length) ' on met le debut du paquet trop long dans le tableau temporaire
Array.Copy(data, 0, data_temps, Data_Out.Length, data.Length) ' on met la reception a la suite
data = data_temps ' on met le tableau temporaire dans le tableau de travail
End If

Do Until index = data.Length ' on traite jusque la fin
Packet_Start = index
id_and_length = data(index) * 256 + data(index + 1) ' les 2 premiers octets
packet_length_of = id_and_length And 3 ' on veut les 2 derniers bits donc on masque (and) avec 11 en binaire (3 en decimal)
packet_id = id_and_length >> 2 ' on veut les 14 premiers bits donc on decale les 16 bits de 2 bits vers la droite
index += 2 + packet_length_of ' on avance des 2 octets de id_and_length + du nombre d'octets de la taille de taille

Select Case packet_length_of ' on lit le bon nombre d'octet pour connaitre la taille des données
Case 0
packet_length = 0
Case 1
packet_length = data(index - 1)
Case 2
packet_length = 256 * data(index - 2) + data(index - 1)
Case 3
packet_length = 65536 * data(index - 3) + 256 * data(index - 2) + data(index - 1)
End Select

If index + packet_length > data.Length Then ' buffer trop petit ?
Waiting = packet_length + index - Packet_Start ' alors on le signale
ReDim Data_Out(data.Length - Packet_Start - 1) ' on redimensionne le tableau de debut du paquet trop long
Array.Copy(data, Packet_Start, Data_Out, 0, data.Length - Packet_Start) ' on copie le debut du paquet trop long
Exit Sub ' on sort
End If

Dim debug As String = "recu : id = " & packet_id & ", taille = " & packet_length & vbCrLf ' on ecrit l'ID et la taille
packetid = packet_id
Dim packet(0) As Byte ' on prepare le paquet
If packet_length > 0 Then ' si sa taille est plus grande que 0 on redimensionne
ReDim packet(packet_length - 1)
Array.Copy(data, index, packet, 0, packet_length) ' et on copie les donnée
End If
Dim j As Integer = 1
For i = 0 To packet_length - 1 ' on fait defiler tout les octets recus
debug &= packet(i).ToString("X2") ' on ecrit l'octet proprement pour de bon ce coup ci
j += 1
If j = 16 Then
debug &= vbCrLf
j = 1
End If
Next ' au suivant

If IsServer = True Then
MyLog.WritePaquet(packet_id, packet_length, True)
Dim PI As New PacketIdentificator
MyLog.WriteLog("Reception id -> " & packet_id & ", Class Name -> " & PI.GetClasseName(packet_id) & ", Lenght -> " & packet_length)
'ReceiveId(packet_id, New BigEndianReader(New System.IO.MemoryStream(packet)))
Else
MyLog.WritePaquet(packet_id, packet_length, False)
Dim PI As New PacketIdentificator
MyLog.WriteLog("Envoi id -> " & packet_id & ", Class Name -> " & PI.GetClasseName(packet_id) & ", Lenght -> " & packet_length)
'ReceiveId(packet_id, New BigEndianReader(New System.IO.MemoryStream(packet)))
End If

index += packet_length ' on met l'index a jour
Packet_End = index
If Packet_End = data.Length Then ' si ca tombe pile poil alors le buffer etait assez grand
Waiting = 0 ' on reset
ReDim Data_Out(0) ' on reset
End If
Loop


End Sub

'#############Paquets##############

'Private Sub ReceiveId(ByVal ID As Integer, ByVal PacketData As BigEndianReader)
' Packet = ID
'Select Case ID
'Case
'End Select
' End Sub

End Class

Et un petit screen de la console:
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#2
Essaye de lire le contenu du AuthentificationTicketMessage.
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#3
Voila j'ai screen :


Voici le packet 110 sniffer ( si je me trompe pas ).
Je pense pas me tromper dans la langue je vois " fr " mais après j'ai pas décoder le rester :/
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#4
Bonjours, j'ai peut être une petite idée si l'erreur est lors de la sérialisation de mon Paquet 42 que mon ticket est mal transférer ?

Ma petite classe 42 :
Code:
    Public Class SelectedServerDataMessage

        Public Const Id As UInteger = 42
        Public ReadOnly Property MessageId() As UInteger
            Get
                Return Id
            End Get
        End Property

        Public serverId As UInteger
        Public address As String
        Public port As UShort
        Public canCreateNewCharacter As Boolean
        Public ticket As Byte()


        Public Sub New()
        End Sub

        Public Sub init(serverId As UInteger, address As String, port As UShort, canCreateNewCharacter As Boolean, ticket As Byte())
            Me.serverId = serverId
            Me.address = address
            Me.port = port
            Me.canCreateNewCharacter = canCreateNewCharacter
            Me.ticket = ticket
        End Sub



        Public Sub pack(ByVal sock As Object)
            Dim _Writer As New BigEndianWriter()
            Me.Serialize(_Writer)
            DofusWriter.Send(Id, sock, _Writer)
        End Sub

        Public Sub Serialize(ByVal Writer As BigEndianWriter)
            Writer.WriteVarShort(Me.serverId)
            Writer.WriteUTF(Me.address)
            Writer.WriteShort(Me.port)
            Writer.WriteBoolean(Me.canCreateNewCharacter)
            Writer.WriteVarInt(ticket.Length)
            For Each entry As Byte In ticket
                Writer.WriteSByte(entry)
            Next
        End Sub

        Public Sub Deserialize(reader As BigEndianReader)

            serverId = reader.ReadVarUhShort()
            address = reader.ReadUTF()
            port = reader.ReadUShort()
            canCreateNewCharacter = reader.ReadBoolean()
            Dim limit = reader.ReadVarInt()
            ticket = New Byte(limit - 1) {}
            For i As Integer = 0 To limit - 1
                ticket(i) = reader.ReadByte()
            Next


        End Sub


    End Class
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#5
A priori non puisque les données sont renvoyées tel quel, mais tu peux essayer de deserialize puis serialize le message vers le serveur.
Ta classe est correcte.
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#6
Je viens d’implémenter une classe authentificationticketmessage, quand je la déserialized je trouve une valeur bizard du ticket, qui ne ressemble pas du tout à un ticket.

Je lis le Ticket avec un readString "U!" & ChrW(134) & vbBack & "ÄÍ" & ChrW(1) & "x[" & ChrW(158) & "Ùé?íÑI" & ChrW(150) & "²ó$" & vbCr & "Cå" & ChrW(141) & "-0" & ChrW(134) & "s,§ÉÎ".
 
Dernière édition:
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#7
Modifies tu le identifications message en y ajoutant un clef différente de celle du client Dofus ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#8
Je viens d’implémenter une classe authentificationticketmessage, quand je la déserialized je trouve une valeur bizard du ticket, qui ne ressemble pas du tout à un ticket.

Je lis le Ticket avec un readString "U!" & ChrW(134) & vbBack & "ÄÍ" & ChrW(1) & "x[" & ChrW(158) & "Ùé?íÑI" & ChrW(150) & "²ó$" & vbCr & "Cå" & ChrW(141) & "-0" & ChrW(134) & "s,§ÉÎ".
Le tiquet est une liste de bytes et non un string. Pourtant ta classe network est correcte.
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#9
Modifies tu le identifications message en y ajoutant un clef différente de celle du client Dofus ?
Non, il me semblais que l'on n’étais pas obliger comme c'est un MITM.
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#10
Visiblement, il me semble ce sont tes IO, je te conseil un breakpoint tu le place apres le désérialise du paquet 42 tu regardes les variables qui te semble étrange et tu les mets à jour.
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#11
ok je vais voir un peut.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#12
Les IOs sont les miens.
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#13
J'ai une petite information qui pourrais peut être nous aider, des fois par chances le paquets passe et je peux passer à l'écran des personnages. Peut être le parseur ?
Code:
 Dim index As Integer ' pour savoir ou on est
            Dim id_and_length As UShort ' les 2 premiers octets (16 bits)
            Dim packet_id As UShort ' les 14 premiers bits des 16
            Dim packet_length_of As Byte ' les 2 derniers bits des 16
            Dim packet_length As Integer ' la longueur du packet
            Dim Packet_Start As Integer
            Dim Packet_End As Integer

            If Waiting > 1 Then ' le buffer etait trop petit ?
                Dim data_temps(data.Length + Data_Out.Length - 1) As Byte ' on créé un tableau de byte temporaire
                Array.Copy(Data_Out, 0, data_temps, 0, Data_Out.Length) ' on met le debut du paquet trop long dans le tableau temporaire
                Array.Copy(data, 0, data_temps, Data_Out.Length, data.Length) ' on met la reception a la suite
                data = data_temps ' on met le tableau temporaire dans le tableau de travail
            End If

            Do Until index = data.Length ' on traite jusque la fin
                Packet_Start = index
                id_and_length = data(index) * 256 + data(index + 1) ' les 2 premiers octets
                packet_length_of = id_and_length And 3 ' on veut les 2 derniers bits donc on masque (and) avec 11 en binaire (3 en decimal)
                packet_id = id_and_length >> 2 ' on veut les 14 premiers bits donc on decale les 16 bits de 2 bits vers la droite
                index += 2 + packet_length_of  ' on avance des 2 octets de id_and_length + du nombre d'octets de la taille de taille

                Select Case packet_length_of ' on lit le bon nombre d'octet pour connaitre la taille des données
                    Case 0
                        packet_length = 0
                    Case 1
                        packet_length = data(index - 1)
                    Case 2
                        packet_length = 256 * data(index - 2) + data(index - 1)
                    Case 3
                        packet_length = 65536 * data(index - 3) + 256 * data(index - 2) + data(index - 1)
                End Select

                If index + packet_length > data.Length Then ' buffer trop petit ?
                    Waiting = packet_length + index - Packet_Start ' alors on le signale
                    ReDim Data_Out(data.Length - Packet_Start - 1) ' on redimensionne le tableau de debut du paquet trop long
                    Array.Copy(data, Packet_Start, Data_Out, 0, data.Length - Packet_Start) ' on copie le debut du paquet trop long
                    Exit Sub ' on sort
                End If
                Dim packet(0) As Byte ' on prepare le paquet
                If packet_length > 0 Then ' si sa taille est plus grande que 0 on redimensionne
                    ReDim packet(packet_length - 1)
                    Array.Copy(data, index, packet, 0, packet_length) ' et on copie les donnée
                End If

                If IsServer = True Then
                    MyLog.WritePaquet(packet_id, packet_length, True)
                    Dim PI As New PacketIdentificator
                    Console.WriteLine("Reception id -> " & packet_id & ", Class Name -> " & PI.GetClasseName(packet_id) & ", Lenght -> " & packet_length)
                    ReceiveId(packet_id, New BigEndianReader(New System.IO.MemoryStream(packet)))
                Else
                    MyLog.WritePaquet(packet_id, packet_length, False)
                    Dim PI As New PacketIdentificator
                    Console.WriteLine("Envoi id -> " & packet_id & ", Class Name -> " & PI.GetClasseName(packet_id) & ", Lenght -> " & packet_length)
                    ReceiveId(packet_id, New BigEndianReader(New System.IO.MemoryStream(packet)))
                End If

                index += packet_length ' on met l'index a jour
                Packet_End = index
                If Packet_End = data.Length Then ' si ca tombe pile poil alors le buffer etait assez grand
                    Waiting = 0 ' on reset
                    ReDim Data_Out(0) ' on reset
                End If
            Loop
Je viens de faire quelque test je ne pense pas que cela vienne de la.
 
Dernière édition:
Inscrit
18 Février 2015
Messages
228
Reactions
7
#14
Dit toi que le ticket que tu recois est crypté en AES si tu ne le décrypte pas tu auras des problèmes ^^
grace à la clé que tu as envoyé à la connexion avec les identifiants
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#15
Dit toi que le ticket que tu recois est crypté en AES si tu ne le décrypte pas tu auras des problèmes ^^
grace à la clé que tu as envoyé à la connexion avec les identifiants
Mais c'est un MITM pas besoin non ?
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#16
Mais c'est un MITM pas besoin non ?
bah ça dépends est ce que tu en as besoin ou pas ?
car si tu te fait kicker et que tu renvoi le messages sans modifications c'est qu'il te manque alors quelque chose dans ton protocol quand tu lis

Edit : Essaye de renvoyer le packet 42 sans passer par le parser renvoi directement ce que tu recois pour voir si ça te connecte ou pas
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#17
Edit : Essaye de renvoyer le packet 42 sans passer par le parser renvoi directement ce que tu recois pour voir si ça te connecte ou pas
Non cela ne me connecte pas.
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#19
moi rien mais le client en lui même sans occupe à ma place.
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#20
moi rien mais le client en lui même sans occupe à ma place.
si tu ne touche à rien u niveau packet pour le ticket c'est qu'il y a un problème de transfert des données à un moment donné les logs du client donne quoi ?

aussi pourquoi c'est l'ip 127.0.0.1 ? tu es pas censé renvoyé les données tel quel ? ensuite pourquoi tu ferme la connexion comme c'est e client qui le fait à ta place ?

il y a beaucoup de choses que je comprends pas bien dans ton code ^^"
 
Haut Bas