VB/VB.Net Problème lors de la mise à jour de Rebirth

Inscrit
29 Juin 2015
Messages
10
Reactions
0
#1
Salut, je viens d'intégrer votre communauté, j'ai lu pratiquement la majorité des tutos et j'ai de bonnes bases en programmation, bon je compte faire une mise à jour Rebirth "version MITM", alors tout d'abord j'ai maj les IO ainsi que les messages de "connection" en me basant sur les sources AS3 fraîchement décompilées. J'ai essayé de me connecter à dofus en session normale pour voir ce que ça donne sur WireShark, puis en session bot comme vous pouvez le voir sur les images.
D'une part, le 182 ne contient pas de données ormis l'id "02:d9 en session bot" et " 02:d9:01:01 en session normale" ce qui est louche et d'une autre part pas d'ack pour le 1 en session bot et ça bloque au 3 et donc le client essaie toujours de se connecter et reste bloqué sur la connexion.

Le 182 : BasicPingMessage
Imports RebirthAPI.Network
Namespace Dofus.Network.Messages.Common.Basic
Public Class BasicPingMessage
Inherits NetworkMessage

Public Overrides Property ProtocolID As UInteger = 182
Private _Quiet As Boolean = False

Public Property [Quiet] As Boolean
Get
Return Me._Quiet
End Get
Set(value As Boolean)
Me._Quiet = value
End Set
End Property

Public Overrides Sub Serialize(ByVal Writer As BigEndianWriter)
Writer.WriteBoolean(Me._quiet)
End Sub

Public Overrides Sub Deserialize(ByVal Reader As BigEndianReader)
Me._quiet = Reader.ReadBoolean
End Sub
End Class
End Namespace


Le 1 :protocolRequired
Imports RebirthAPI.Network
Namespace Dofus.Network.Messages.Handshake
Public Class ProtocolRequired
Inherits NetworkMessage

Public Overrides Property ProtocolID As UInteger = 1
Private _RequiredVersion As UInteger = 0
Private _CurrentVersion As UInteger = 0

Public Property [RequiredVersion] As Integer
Get
Return Me._RequiredVersion
End Get
Set(value As Integer)
Me._RequiredVersion = value
End Set
End Property
Public Property [CurrentVersion] As Integer
Get
Return Me._CurrentVersion
End Get
Set(value As Integer)
Me._CurrentVersion = value
End Set
End Property

Public Overrides Sub Serialize(ByVal Writer As BigEndianWriter)
Writer.WriteInt(Me._requiredVersion)
Writer.WriteInt(Me._currentVersion)
End Sub

Public Overrides Sub Deserialize(ByVal Reader As BigEndianReader)
Me._requiredVersion = Reader.ReadInt32
Me._currentVersion = Reader.ReadInt32
End Sub
End Class
End Namespace

Le 3 : HelloConnectMessage
Imports System.Collections.Generic
Imports RebirthAPI.Network
Namespace Dofus.Network.Messages.Connection
Public Class HelloConnectMessage
Inherits NetworkMessage

Public Overrides Property ProtocolID As UInteger = 3
Private _Salt As String = String.Empty
Private _Key As List(Of Byte) = New List(Of Byte)

Public Property [Salt] As String
Get
Return Me._Salt
End Get
Set(value As String)
Me._Salt = value
End Set
End Property
Public Property [Key] As List(Of Byte)
Get
Return Me._Key
End Get
Set(value As List(Of Byte))
Me._Key = value
End Set
End Property

Public Overrides Sub Serialize(ByVal Writer As BigEndianWriter)
Writer.WriteUTF(Me._salt)
Writer.WriteVarInt(Me._Key.Count)
Dim _loc_2 = Nothing
For _loc_2 = 0 To Me._key.Count - 1
Writer.WriteByte(Me._Key(_loc_2))
Next
End Sub

Public Overrides Sub Deserialize(ByVal Reader As BigEndianReader)
Dim _loc_4 = Nothing
Me._salt = Reader.ReadUTF
Dim _loc_2 = Reader.ReadVarInt()
Dim _loc_3 = Nothing
For _loc_3 = 0 To _loc_2 - 1
_loc_4 = Reader.ReadByte
Me._key.add(_loc_4)
Next
End Sub
End Class
End Namespace

Readers : Source SADIKK avec une petite adaptation et bien sûr traduction en Vb
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Text
Imports System.Net.Sockets


Namespace NETWORK
Public Class BigEndianReader
Implements IDisposable



Private m_BinaryReader As IO.BinaryReader


' Methods
Public ReadOnly Property BaseStream() As IO.Stream
Get
Return m_BinaryReader.BaseStream
End Get
End Property

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


Public ReadOnly Property Position() As Long
Get
Return m_BinaryReader.BaseStream.Position
End Get
End Property

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

Public Sub New(content As Byte())
m_BinaryReader = New IO.BinaryReader(New IO.MemoryStream(content), Encoding.UTF8)
End Sub

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






Public Function ReadBytes(count As Integer) As Byte()
Return m_BinaryReader.ReadBytes(count)
End Function


Public Function ReadBoolean() As Boolean
Return m_BinaryReader.ReadByte() = 1
End Function

Public Function ReadVarShort() As Short
Dim resultVar = 0

For offset As Integer = 0 To 15 Step 7
Dim readByte As Byte = Me.ReadByte()
Dim hasContinuationFlag As Boolean = (readByte And 128) = 128
Dim extractedValue As Integer = (readByte And 127)
If offset > 0 Then
extractedValue = extractedValue << offset
End If

resultVar += extractedValue

If hasContinuationFlag = False Then
If resultVar > 32767 Then
resultVar -= 65536
End If

Return CShort(resultVar)
End If
Next
Throw New Exception("Too much data")
End Function


Public Function ReadVarInt() As Integer
Dim resultVar As Integer = 0
For offset As Integer = 0 To 31 Step 7
Dim readByte__1 As Byte = ReadByte()
Dim hasContinuationFlag As Boolean = (readByte__1 And 128) = 128
Dim extractedValue As Integer = (readByte__1 And 127)

If offset > 0 Then
'TODO: not sure if the if statement is needed
extractedValue = extractedValue << offset
End If

resultVar += extractedValue

If hasContinuationFlag = False Then
Return resultVar
End If
Next
Throw New Exception("Too much data")
End Function


Public Function ReadByte() As Byte
Return m_BinaryReader.ReadByte()
End Function
Public Function ReadDouble() As Double
Return BitConverter.ToDouble(ConvertToBigEndian(8), 0)
End Function

Public Function ReadShort() As Short
Return BitConverter.ToInt16(ConvertToBigEndian(2), 0)
End Function

Public Function ReadInt32() As Integer
Return BitConverter.ToInt32(ConvertToBigEndian(4), 0)
End Function

Public Function ReadSByte() As SByte
Return m_BinaryReader.ReadSByte()
End Function

Public Function ReadSingle() As Single
Return BitConverter.ToSingle(ConvertToBigEndian(4), 0)
End Function

Public Function ReadUTF() As String
Dim stringLength As UShort = ReadUShort()

Dim stringContentInByte As Byte() = ReadBytes(stringLength)

Return Encoding.UTF8.GetString(stringContentInByte)
End Function

Public Function ReadUShort() As UInt16
Return BitConverter.ToUInt16(ConvertToBigEndian(2), 0)
End Function

Public Function ReadUInt32() As UInt32
Return BitConverter.ToUInt32(ConvertToBigEndian(4), 0)
End Function


Public Sub Seek(position As Integer)
m_BinaryReader.BaseStream.Position = position
End Sub

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

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





Private Function ConvertToBigEndian(ByVal count As Integer) As Byte()
Dim convertedContent As Byte() = New Byte(count - 1) {}

For index As Integer = count - 1 To 0 Step -1
convertedContent(index) = CByte(m_BinaryReader.BaseStream.ReadByte())
Next

Return convertedContent
End Function

Public Sub Dispose() Implements IDisposable.Dispose
m_BinaryReader.Dispose()
m_BinaryReader = Nothing
End Sub

End Class
End Namespace

Merci d'avance, et j’espère que vous m'orienteriez sur la bonne voie !
 

BlueDream

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

J'ai un peu de mal à visualiser ton problème, il n'y a pas de paquet Ack sur le serveur de connexion. En ce qui concerne le BigEndianReader/Writer il a été fait par bouh2 en C# il faudrait vérifier la traduction.

Dans tout les cas il faut transmettre les données vers le client tel que tu les recois, le traitement des paquets est à faire après.

Sinon on peut voir le problème côté client, tu ajoutes un fichier 'debug.txt' vide dans le dossier app de dofus, tu relances le jeu et au moment du freese tu fais F11.
 
Inscrit
29 Juin 2015
Messages
10
Reactions
0
#3
Je viens de le faire, on me dit qu'il y a un problème dans le deserialize du 1, la méthode est pourtant correct.

Voilà la partie où ça bug :
<li class="l_16">[00:45:22:105] [ServerConnection] Failure while opening socket, timeout.</li>
<li class="l_4">[00:45:31:169] [GenericEventsManager] Dispatch validUi to login</li>
<li class="l_4">[00:45:31:219] [Worker] Adding frame: [object HandshakeFrame]</li>
<li class="l_4">[00:45:31:219] [ServerConnection] Connecting to 213.248.126.40:5555...</li>
<li class="l_1">[00:45:31:229] [ServerConnection] Connection opened.</li>
<li class="l_1">[00:45:34:249] [ServerConnection] [SND] > BasicPingMessage @1</li>
<li class="l_16">[00:45:34:354] [ServerConnection] Error while reading socket. Error: Error #2030: End of file was encountered.
at flash.net::Socket/readInt()
at com.ankamagames.jerakine.network::CustomDataWrapper/readInt()
at com.ankamagames.dofus.network.messages.handshake::protocolRequired/deserializeAs_ProtocolRequired()
at com.ankamagames.dofus.network.messages.handshake::protocolRequired/deserialize()
at com.ankamagames.dofus.network.messages.handshake::protocolRequired/unpack()
at com.ankamagames.dofus.network::MessageReceiver/parse()
at com.ankamagames.jerakine.network::ServerConnection/lowReceive()
at com.ankamagames.jerakine.network::ServerConnection/receive()
at com.ankamagames.jerakine.network::ServerConnection/onSocketData()</li>
<li class="l_2">[00:45:34:354] [ServerConnection] Closing socket! Error
at com.ankamagames.jerakine.network::ServerConnection/close()
at com.ankamagames.jerakine.network::ServerConnection/receive()
at com.ankamagames.jerakine.network::ServerConnection/onSocketData()</li>
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#4
Montre nous le traitement des données à la réception et le transfert vers le client.
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#5
Le dump pcap de Wireshark serais apprécié plutôt que des screens de celui-ci ^^'
 
Inscrit
29 Juin 2015
Messages
10
Reactions
0
#6
Merci BlueDream, les voilà :

Pour la reception :
Private Sub ClientReceivePacket(ByVal PacketID As Integer, ByVal PacketLength As Integer, ByVal Reader As BigEndianReader)
Try
If Not IsTransfertPacketFromClientCancelled(PacketID, Reader) Then
Dim message As New BigEndianWriter
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

Pour l'envoi :
Public Sub Send(ByVal Socket As DofusSocket, ByVal PacketID As Integer)
Try
If ((Not Socket Is Nothing) AndAlso Socket.Connected) Then
Dim collection As New List(Of Byte)
Dim count As Integer = Me.BytesToSend.Count
Dim TypeLength As Integer = BigEndianWriter.ComputeTypeLength(count)
Dim num3 As Short = CUShort(BigEndianWriter.ComputeStaticHeader(PacketID, TypeLength))
SyncLock Socket.SocketLock
Dim bytes As Byte() = BitConverter.GetBytes(num3)
Array.Reverse(bytes)
collection.AddRange(bytes)
Select Case TypeLength
Case 1
collection.Add(CByte(count))
Exit Select
Case 2
bytes = BitConverter.GetBytes(CUShort(count))
Array.Reverse(bytes)
collection.AddRange(bytes)
Exit Select
Case 3
collection.Add(CByte(count >> 16 And 255))
bytes = BitConverter.GetBytes(CUShort(count And 65535))
Array.Reverse(bytes)
collection.AddRange(bytes)
Exit Select
End Select
Me.BytesToSend.InsertRange(0, collection)
Socket.method_6(Me.BytesToSend.ToArray)
End SyncLock
End If
Catch Ex As Exception
MsgBox(Ex.ToString)
End Try
End Sub


Sorrow, oui tout à fait, je m'excuse, les voilà :

Session normale:
http://www.mediafire.com/download/in34onn8vqdtan6/Normale.pcap

Session mitm:
http://www.mediafire.com/download/02pjs9h32hrbq16/Session+bot.pcap
 
Dernière édition par un modérateur:

zahid98

Membre Actif
Inscrit
13 Decembre 2014
Messages
352
Reactions
2
#7
Les fonctions de réception/envoi sont clean , je les ai même remplacées par celles de LeafBot et ça me forme toujours de mauvais paquets .
 
Haut Bas