VB/VB.Net Problème avec la classe du packet 42 MITM

Inscrit
17 Avril 2015
Messages
119
Reactions
0
#1
Bonjours, comme vous devais surement le savoir je continu mon bot MITM, mais il se trouve que ma classe du packet 42 ne passe pas ( erreur impossible de lire au delà du flux )
j'ai donc commencé par traduire celle dans le d@fus invoker, mais toujours la même erreur je vous donne ma classe :
Code:
Namespace Network.Connection.Server.Select

    Public Class SelectedServerDataMessage
        Public MyLog As LogConsole

        Private _isInitialized As Boolean = False
        Public serverId As Integer = 0
        Public address As String = ""
        Public port As UInteger = 0
        Public ssl As Boolean = False
        Public canCreateNewCharacter As Boolean = False
        Public ticket As String = ""
        Public Const protocolId As UInteger = 42

        Public Function init(ByVal param1 As Integer, ByVal param2 As String, ByVal param3 As UInteger, ByVal param4 As Boolean, ByVal param5 As String, ByVal param6 As String) As SelectedServerDataMessage

            Me.serverId = param1
            Me.address = param2
            Me.port = param3
            Me.ssl = param4
            Me.canCreateNewCharacter = param5
            Me.ticket = param6
            Me._isInitialized = True
            Return Me
        End Function

        Public Function pack(ByVal sock As Object)
            Dim _Writer As New BigEndianWriter()
            Me.serialize(_Writer)
            BigEndianWriter.Send(SelectedServerDataMessage.protocolId, sock)
        End Function

        Public Function unpack(ByVal param1 As BigEndianReader, ByVal param2 As Integer)
            Me.deserialize(param1)
        End Function

        Public Function serialize(ByVal param1 As BigEndianWriter)

            Me.serializeAs_SelectedServerDataMessage(param1)
        End Function

        Public Function serializeAs_SelectedServerDataMessage(ByVal param1 As BigEndianWriter)
            Dim _loc2_ As Integer
            _loc2_ = BooleanByteWrapper.SetFlag(_loc2_, 0, Me.ssl)
            _loc2_ = BooleanByteWrapper.SetFlag(_loc2_, 1, Me.canCreateNewCharacter)
            param1.WriteByte(_loc2_)
            If Me.serverId < 0 Then
                Throw New Exception("Forbidden value (" + Me.serverId + ") on element serverId")
            End If
            param1.WriteVarShort(Me.serverId)
            param1.WriteUTF(Me.address)
            If Me.port < 0 OrElse Me.port > 65535 Then
                Throw New Exception("Forbidden value (" + Me.port + ") on element serverId")
            End If
            param1.WriteShort(Me.port)
            param1.WriteUTF(Me.ticket)

        End Function

        Public Function deserialize(ByVal param1 As BigEndianReader)
            Me.deserializeAs_SelectedServerDataMessage(param1)
        End Function

        Public Function deserializeAs_SelectedServerDataMessage(ByVal param1 As BigEndianReader)

            Dim _loc2_ As Integer = param1.ReadByte
            Me.ssl = BooleanByteWrapper.GetFlag(_loc2_, 0)
            Me.canCreateNewCharacter = BooleanByteWrapper.GetFlag(_loc2_, 1)
            Me.serverId = param1.ReadVarUhShort
            If Me.serverId < 0 Then
                Throw New Exception("Forbidden value (" + Me.serverId + ") on element serverId")
            End If
            Me.address = param1.ReadUTF
            Me.port = param1.ReadShort

            If Me.port < 0 OrElse Me.port > 65535 Then
                Throw New Exception("Forbidden value (" + Me.port + ") on element serverId")
            End If
            Me.ticket = param1.ReadUTF
        End Function

    End Class
End Namespace
 
Inscrit
10 Mai 2015
Messages
357
Reactions
55
#2
tes IO sont à jour ?
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#3
Normalement oui, la classe est t-elle correcte ?

L'erreur se trouve sur le readbyte :
Code:
        Public Function ReadByte() As Byte Implements IDataReader.ReadByte
            Return m_reader.ReadByte()
        End Function



 Function ReadByte() As Byte
 
Inscrit
20 Juin 2016
Messages
41
Reactions
2
#4
C'est le premier ReadByte()

Code:
 Dim _loc2_ As Integer = param1.ReadByte
ou ça arrive plus tard ?
 

neross

Membre Actif
Inscrit
20 Decembre 2014
Messages
150
Reactions
0
#5
Euh byte en int c'est pas terrible :p

Code:
Dim _loc2_ as Integer = Convert.ToInt32(byteValue)
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#7
Mon bigendianreader
Code:
 Public Class BigEndianReader
        Implements IDataReader
        Implements IDisposable
#Region "Properties"

        Private m_reader As BinaryReader

        Public ReadOnly Property BytesAvailable() As Long Implements IDataReader.BytesAvailable
            Get
                Return m_reader.BaseStream.Length - m_reader.BaseStream.Position
            End Get
        End Property

        Public ReadOnly Property Position As Long Implements IDataReader.Position
            Get
                Return m_reader.BaseStream.Position
            End Get
        End Property


        Public ReadOnly Property BaseStream() As Stream
            Get
                Return m_reader.BaseStream
            End Get
        End Property

#End Region

#Region "Initialisation"

        Public Sub New()
            m_reader = New BinaryReader(New MemoryStream(), Encoding.UTF8)
        End Sub

        Public Sub New(stream As Stream)
            m_reader = New BinaryReader(stream, Encoding.UTF8)
        End Sub

        Public Sub New(tab As Byte())
            m_reader = New BinaryReader(New MemoryStream(tab), Encoding.UTF8)
        End Sub

#End Region

#Region "Private Methods"

        ''' <returns></returns>
        Private Function ReadBigEndianBytes(count As Integer) As Byte()
            Dim bytes(count) As Byte
            For i As Integer = 0 To count - 1
                bytes(i) = BaseStream.ReadByte()
            Next
            Return bytes
        End Function

#End Region
        Public Function CustomDataWrapper(param1)
            Dim _data = param1
        End Function

        Public Function readUnsignedByte() As Integer
            Return readUnsignedByte
        End Function
#Region "Public Method"

        Public Function ReadShort() As Short Implements IDataReader.ReadShort
            Dim Value As UShort = ReadUInt16()
            If Value > Short.MaxValue Then
                Dim Value2 As Short = -(UShort.MaxValue - Value) - 1
                Return Value2
            End If
            Return Value
        End Function

        Public Function ReadInt() As Integer Implements IDataReader.ReadInt
            Dim Value As UInteger = ReadUInt32()
            If Value > Integer.MaxValue Then
                Dim Value2 As Integer = -(UInteger.MaxValue - Value) - 1
                Return Value2
            End If
            Return Value
        End Function

        Public Function ReadLong() As Int64 Implements IDataReader.ReadLong
            Return BitConverter.ToInt64(ReadBigEndianBytes(8), 0)
        End Function

        Public Function ReadFloat() As Single Implements IDataReader.ReadFloat
            Return BitConverter.ToSingle(ReadBigEndianBytes(4), 0)
        End Function

        Public Function ReadUShort() As UShort Implements IDataReader.ReadUShort
            Return (CUShort(ReadByte()) << 8) + ReadByte()
        End Function

        Public Function ReadUInt() As UInt32 Implements IDataReader.ReadUInt
            Return (CUInt(ReadByte()) << 24) + (CUInt(ReadByte()) << 16) + (CUInt(ReadByte()) << 8) + ReadByte()
        End Function

        Public Function ReadULong() As UInt64 Implements IDataReader.ReadULong
            Return BitConverter.ToUInt64(ReadBigEndianBytes(8), 0)
        End Function

        Public Function ReadByte() As Byte Implements IDataReader.ReadByte
            Return m_reader.ReadByte()
        End Function
        Public Function ReadUnSignedshort()
            Return ReadUInt16()
        End Function


        Public Function ReadSByte() As SByte Implements IDataReader.ReadSByte
            Return m_reader.ReadSByte()
        End Function

        Public ReadOnly Property Data() As Byte()
            Get
                Dim pos As Long = BaseStream.Position

                Dim data__1 As Byte() = New Byte(BaseStream.Length - 1) {}
                BaseStream.Position = 0
                BaseStream.Read(data__1, 0, CInt(BaseStream.Length))

                BaseStream.Position = pos

                Return data__1
            End Get
        End Property

        Public Function ReadBytes(n As Integer) As Byte() Implements IDataReader.ReadBytes
            Return m_reader.ReadBytes(n)
        End Function

        Public Function ReadBytesInNewBigEndianReader(n As Integer) As BigEndianReader
            Return New BigEndianReader(m_reader.ReadBytes(n))
        End Function

        Public Function ReadBoolean() As [Boolean] Implements IDataReader.ReadBoolean
            Return m_reader.ReadByte() = 1
        End Function

        Public Function ReadChar() As [Char] Implements IDataReader.ReadChar
            Return ChrW(ReadUShort())
        End Function

        Public Function ReadDouble() As [Double] Implements IDataReader.ReadDouble
            Dim Bytes() As Byte = ReadBytes(8)
            Array.Reverse(Bytes)
            Return BitConverter.ToDouble(Bytes, 0)
        End Function

        Public Function ReadSingle() As [Single]
            Return BitConverter.ToSingle(ReadBigEndianBytes(4), 0)
        End Function

        Public Function ReadUTF() As String Implements IDataReader.ReadUTF
            Dim length As UShort = ReadUShort()

            Dim bytes As Byte() = ReadBytes(length)
            Return Encoding.UTF8.GetString(bytes)
        End Function

        Public Function ReadUTF7BitLength() As String
            Dim length As Integer = ReadInt()

            Dim bytes As Byte() = ReadBytes(length)
            Return Encoding.UTF8.GetString(bytes)
        End Function

        Public Function ReadUTFBytes(len As UShort) As String Implements IDataReader.ReadUTFBytes
            Dim bytes As Byte() = ReadBytes(len)

            Return Encoding.UTF8.GetString(bytes)
        End Function

        Public Sub SkipBytes(n As Integer) Implements IDataReader.SkipBytes
            Dim i As Integer
            For i = 0 To n - 1
                m_reader.ReadByte()
            Next
        End Sub

        Public Sub SetPosition(Position As Integer)
            Seek(Position, SeekOrigin.Begin)
        End Sub

        Public Sub Seek(offset As Integer, seekOrigin As SeekOrigin) Implements IDataReader.Seek
            m_reader.BaseStream.Seek(offset, seekOrigin)
        End Sub

        Public Sub Add(data As Byte(), offset As Integer, count As Integer)
            Dim pos As Long = m_reader.BaseStream.Position

            m_reader.BaseStream.Position = m_reader.BaseStream.Length
            m_reader.BaseStream.Write(data, offset, count)
            m_reader.BaseStream.Position = pos
        End Sub

        Public Sub Close()
            BaseStream.Close()
        End Sub

#End Region

#Region "Alternatives Methods"
        Public Function ReadInt16() As Short
            Return ReadShort()
        End Function

        Public Function ReadInt32() As Integer
            Return ReadInt()
        End Function

        Public Function ReadInt64() As Long
            Return ReadLong()
        End Function

        Public Function ReadUInt16() As UShort
            Return ReadUShort()
        End Function

        Public Function ReadUInt32() As UInteger
            Return ReadUInt()
        End Function

        Public Function ReadUInt64() As ULong
            Return ReadULong()
        End Function

        Public Function ReadString() As String
            Return ReadUTF()
        End Function
#End Region

#Region "Custom Methods"

        Private Const INT_SIZE As Integer = 32
        Private Const SHORT_SIZE As Integer = 16
        Private Const SHORT_MIN_VALUE As Integer = -32768
        Private Const SHORT_MAX_VALUE As Integer = 32767
        Private Const UNSIGNED_SHORT_MAX_VALUE As Integer = 65536
        Private Const CHUNCK_BIT_SIZE As Integer = 7

        Private Const MASK_10000000 As Integer = 128
        Private Const MASK_01111111 As Integer = 127


        Public Function ReadVarInt() As Integer Implements IDataReader.ReadVarInt
            'rien'
            Dim local_4 = 0
            Dim local_1 = 0
            Dim local_2 = 0
            Dim local_3 = False

            While local_2 < INT_SIZE
                local_4 = Me.ReadByte()
                local_3 = (local_4 And MASK_10000000) = MASK_10000000

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

                local_2 += CHUNCK_BIT_SIZE

                If Not local_3 Then
                    Return local_1
                End If
            End While

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

        Public Function ReadVarUhInt() As UInteger Implements IDataReader.ReadVarUhInt
            Return CUInt(ReadVarInt())
        End Function

        Public Function ReadVarShort() As Integer Implements IDataReader.ReadVarShort
            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_10000000) = MASK_10000000

                If local_2 > 0 Then
                    local_1 += ((local_4 And MASK_01111111) << local_2)
                Else
                    local_1 += (local_4 And MASK_01111111)
                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 UInteger Implements IDataReader.ReadVarUhShort
            Return CUInt(ReadVarShort())
        End Function

        Public Function ReadVarLong() As Double Implements IDataReader.ReadVarLong
            Return ReadVarInt64(Me).ToNumber()
        End Function

        Public Class FinalInt64

#Region "Variables"

            Public Low As UInt64
            Public High As Integer

#End Region

#Region "Builder"

            Public Sub New(Optional param1 As UInt64 = 0, Optional param2 As Integer = 0)
                Low = param1
                High = param2
            End Sub

#End Region

#Region "Methods"

            Public Shared Function FromNumber(param1 As Double) As FinalInt64
                Return New FinalInt64(Convert.ToUInt64(param1), CInt(Math.Floor(param1 / 4294967296.0)))
            End Function

            Public Function ToNumber() As Double
                Return High * 4294967296.0 + Low
            End Function

#End Region

        End Class

        Public Function ReadVarUhLong() As Double Implements IDataReader.ReadVarUhLong
            Return ReadVarUInt64(Me).ToNumber()
        End Function

        Public Function ReadVarInt64(reader As BigEndianReader) As FinalInt64
            Dim local_3 As Integer = 0
            Dim local_2 As New FinalInt64()
            Dim local_4 As Integer = 0

            While True
                local_3 = reader.readUnsignedByte()
                If local_4 = 28 Then
                    Exit While
                End If
                If local_3 >= 128 Then
                    local_2.Low = local_2.Low Or CUInt((local_3 And 127) << local_4)
                    local_4 += 7
                    Continue While
                End If
                local_2.Low = local_2.Low Or CUInt(local_3 << local_4)
                Return local_2
            End While

            If local_3 >= 128 Then
                local_3 = local_3 And 127
                local_2.Low = local_2.Low Or CUInt(local_3 << local_4)
                local_2.High = CUInt(local_3 >> 4)
                local_4 = 3

                While True
                    local_3 = reader.readUnsignedByte()
                    If local_4 < 32 Then
                        If local_3 >= 128 Then
                            local_2.High = local_2.High Or CUInt((local_3 And 127) << local_4)
                        Else
                            Exit While
                        End If
                    End If
                    local_4 += 7
                End While
                local_2.High = local_2.High Or CUInt(local_3 << local_4)
                Return local_2
            End If
            local_2.Low = local_2.Low Or CUInt(local_3 << local_4)
            local_2.High = CUInt(local_3 >> 4)
            Return local_2
        End Function

        Public Function ReadVarUInt64(reader As BigEndianReader) As FinalUInt64
            Dim local_3 As Integer = 0
            Dim local_2 As New FinalUInt64()
            Dim local_4 As Integer = 0

            While True
                local_3 = reader.readUnsignedByte()
                If local_4 = 28 Then
                    Exit While
                End If
                If local_3 >= 128 Then
                    local_2.Low = local_2.Low Or CUInt((local_3 And 127) << local_4)
                    local_4 += 7
                    Continue While
                End If
                local_2.Low = local_2.Low Or CUInt(local_3 << local_4)
                Return local_2
            End While

            If local_3 >= 128 Then
                local_3 = local_3 And 127
                local_2.Low = local_2.Low Or CUInt(local_3 << local_4)
                local_2.High = CUInt(local_3 >> 4)
                local_4 = 3

                While True
                    local_3 = reader.ReadByte()
                    If local_4 < 32 Then
                        If local_3 >= 128 Then
                            local_2.High = local_2.High Or CUInt((local_3 And 127) << local_4)
                        Else
                            Exit While
                        End If
                    End If
                    local_4 += 7
                End While
                local_2.High = local_2.High Or CUInt(local_3 << local_4)
                Return local_2
            End If
            local_2.Low = local_2.Low Or CUInt(local_3 << local_4)
            local_2.High = CUInt(local_3 >> 4)
            Return local_2
        End Function
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#8
Je replace par ceci ?
non , ca sert a rien si c'est un byte (octet) de le convertir en integer (entier) , ca fait meme consommer plus de memoire pour rien (bon avec nos ordi qui ont au moins 4Go de ram on s'en fout un peu de consommer 3 octets de ram a la place d'un seul)
par contre si c'est un octet (enfin un Byte):
Dim _loc2_ As Byte = param1.ReadByte
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#9
Si je comprend bien alors le problème ne viens pas de ma classe mais de mon reader, j'ai beau vérifier je ne comprend pas ou peut être l'erreur.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#10
ca j'en sais rien , j'ai regardé ni l'un ni l'autre
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#12
si le flux est trop petit pour lire un seul byte (un seul octet) alors c'est que param1 est vide
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#13
Ok mais si il est vide cela veux dire que j'ai un problème dans mon bigendianreader ? puisque param1 = bigendianreader ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#14
non pas forcement , param1 AS bigendianreader c'est pas pareil que param1 = bigendianreader
de toute facon c'est simple a voir , tu poses un point d'arret (ou break point si version US) sur cette ligne :
Code:
        Public Function deserialize(ByVal param1 As BigEndianReader)
            Me.deserializeAs_SelectedServerDataMessage(param1) ' <============= cette ligne
        End Function
puis quand le programme va s'arreter sur la ligne tu mets ta souris sur param1 pour regarder ce qu'il y'a dedans , si il est pas vide a ce moment la tu fais un "pas a pas" jusque l'erreur (elle arrive juste apres) , si il est deja vide alors c'est soit que tu le remplis jamais ou que faut chercher avant pourquoi c'est vide
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#15
Voila j'ai fais comme vous me l'avez demander j'ai donc screen :


J'ai donc cibler de ou part mon erreur :
Code:
 Me.port = param1.ReadUnSignedshort  -- Cette ligne
Elle renvoie après a cette fonction :
Code:
 Public Function ReadUShort() As UShort Implements IDataReader.ReadUShort
            Return (CUShort(ReadByte()) << 8) + ReadByte()
        End Function
 
Dernière édition:

asyade

Membre Actif
Inscrit
26 Avril 2013
Messages
368
Reactions
1
#16
J'ais pas bien regarder le code mais j'ais l'impression que ta class n'est pas a jours mais avant tout le 42 est il le seule message que tu deserialize? essaye de voire si tu peut deserializer les messages précédent histoire de voir si ton system est ok
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#17
J'ais pas bien regarder le code mais j'ais l'impression que ta class n'est pas a jours mais avant tout le 42 est il le seule message que tu deserialize? essaye de voire si tu peut deserializer les messages précédent histoire de voir si ton system est ok
Comme je suis en mitm, je gère que le 42, si vous avez une class pour que je test ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#18
Public Function deserializeAs_SelectedServerDataMessage(ByVal param1 As BigEndianReader)

Dim _loc2_ As Integer = param1.ReadByte
Me.ssl = BooleanByteWrapper.GetFlag(_loc2_, 0)
Me.canCreateNewCharacter = BooleanByteWrapper.GetFlag(_loc2_, 1)
Me.serverId = param1.ReadVarUhShort
If Me.serverId < 0 Then
Throw New Exception("Forbidden value (" + Me.serverId + ") on element serverId")
End If
Me.address = param1.ReadUTF
Me.port = param1.ReadShort

If Me.port < 0 OrElse Me.port > 65535 Then
Throw New Exception("Forbidden value (" + Me.port + ") on element serverId")
End If
Me.ticket = param1.ReadUTF
End Function
ca je sais pas si c'est a jour , ca doit faire 4 ans que j'ai pas mis le nez la dedans mais ca bloque a "port" donc deja param1 est pas vide , regarde (avec la methode du "pas a pas") si la valeur juste avant est correcte (donc c'est "address" , ca doit donner un truc du genre ... une adresse ip lol : xxx.xxx.xxx.xxx ) puis si c'est pas correcte regarde encore celle d'avant (serverid) et remonte comme ca jusque trouver le truc qui semble correcte , ssl et cancreatenewcaracter ca doit pas etre autre chose que 0 ou 1
enfin bon si address est pas correct soit le truc qui va lire dans "data" (ce qu'ici ils appellent les IO , je sais toujours pas pourquoi , faudra qu'on m'explique ca un jour) est pourri ou soit la class "SelectedServerDataMessage" est perimée
 
Inscrit
20 Juin 2016
Messages
41
Reactions
2
#19
Déjà pour commencer tu as pris des sources qui sont plus à jour. Il n'y a plus de lecture à faire d'un boolean "ssl".

Il faut lire l'id du serveur, puis l'adresse ip puis le port puis le boolean "canCreateNewCharacter" (sans flag ou quoique ce soit) et enfin les bytes du ticket (avec bien sûr la taille qui précède).

Néanmoins il y a un byte "vide" qui faut lire entre l'id du serveur et l'adresse ip, je n'ai pas trouvé à quoi il correspond (peut être ssl ?).

Bien sûr pour la "serialization" il faut pas oublié ce byte "vide".
 
Inscrit
17 Avril 2015
Messages
119
Reactions
0
#20
Super effectivement ma classe n'étais pas à jours, j'ai modifier. Mais une chose bizard c'est que j'ai pas le messages envoie packet 42 la connexion se ferme par le client, c'est normal ? Voila je vous donne la fonction qui me permet de gérer le packet 42 :
Code:
If Not packet_id = 42 Then
                    MyLog.WriteLog("Reception id " & packet_id & ", Lenght -> " & packet_length)
                    MySock.Send(data)
                Else
                    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)
                    MyLog.WriteLog("Déconnecté")


                End If
 
Haut Bas