C# [Résolu]Problème de reception de packets

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Bonjour les gens,

Cela fait deux trois jours que je suis là-dessus,
J'ai commencé à developper un petit bot dofus en socket , hélas, je ne recois pas les bons packets...
Je m'explique:

J'ai sniffé sur le client officiel, et je reçois un packet ProtocolRequired , puis normalement un packet HelloConnectMessage , (et ensuite je dois envoyer un packet IdentifiactionMessage )
Le problème , c'est que bizarrement, quand je lance mon programme , j'arrive à me connecter au serveur du jeu, mais je recois dans l'ordre ces deux packets:
-ProtocolRequired(ce qui est bon)
-HelloGameMessage (id = 101 )

C'est ce dernier packet qui me semble bizarre... Y'a t- il quelque chose que je loupe ? Je voudrais recevoir le HelloConnectMessage moi , pas celui ci ^^ .
En tout cas je ne sais pas quoi faire pour y remedier. Dois-je envoyer un packet spécifique pour recevoir un packet HelloConnectMessage en retour? Ou dois-je recommencer mon programme à zéro ?

Merci d'avance pour votre aide, :D


Edit : Résolu , voir mon dernier message
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#2
Re: Problème de reception de packets

Tu es sûr que tu te connectes bien au serveur d'authentification et non à un serveur de jeu ?
 
A

Anonymous

Invité
#3
Re: Problème de reception de packets

Et bien je pense que c'est sûrement ça le problème, je ne sais pas vraiment quelle ip utiliser pour me connecter au serveur d'authentification :
Actuellement j'utilise l'ip 213.248.126.84 sur le port 5555 pour me connecter, mais je suppose que c'est de là que vient mon erreur....

Je dois utiliser une autre ip donc pour me connecter au serveur d'auth?

(Désolé si la question parait bête, en tout cas merci de ta réponse rapide)


EDIT : Merci pour ta réponse, j'ai fini par trouver la bonne adresse ip :)
Mon problème est donc résolu !
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#4
Re: [Resolu] Problème de reception de packets

Les IP sont dans le fichier config.xml
 
A

Anonymous

Invité
#5
Re: Problème de reception de packets

Nouvelle journée , nouveau probleme :/

J'ai bien réussi à contacter le serveur, récuperer le HelloGameMessage , et je suis à l'étape ou je renvoie l'IdentificationMessage (le fameux).
Cependant , même si mon id et mot de passe sont bons, je recoit le packet d'id : 20 , IdentificationFailedMessage .
Voila comment je me connecte au serveur dans mon code :

Code:
using BotFramework.Core.Auth;
using BotFramework.IO;
using BotFramework.Packet.Types.connection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BotFramework.Packet.Messages.connection
{
    class HelloConnectMessage : IServerPacket
    {
        private bool _isInitialized = false;
        public String _salt = "";
        public List<byte> key = new List<byte>();

        public ServerPacketEnum PacketType
        {
            get
            {
                return ServerPacketEnum.HelloConnectMessage;
            }
        }



    public void Deserialize(Reader reader)
        {
            byte currentKey = 0;
            this._salt = reader.ReadUTF();
            int keycount = reader.ReadVarInt();
            Console.WriteLine("Taille clé : " + keycount);
			for(int i = 0; i < keycount; i++)
            {
                currentKey = reader.ReadByte();
                this.key.Add(currentKey);
            }

            Console.WriteLine("salt : " + _salt + " , clé : " + this.key.ToString());
            // [Envoi] IdentificationMessage
            IdentificationMessage identificationMessage = new IdentificationMessage();
            byte[] credentials = RSAManager.Encrypt(this.key , this._salt, "login","password");
            byte[] unsigned = (byte[])(Array)credentials;
            VersionExtended versionExtended = new VersionExtended();
            versionExtended.initVersionExtended(2, 27, 5, 93304, 1, 0, 1, 1);

            identificationMessage.Init(true, false, false, versionExtended, "fr", unsigned, 0, 0);

            Writer writer = new Writer();

            Program.socketInstance.Send(identificationMessage);
        }
    }
}
En fait c'est très sale mais je procède à l'envoi de mon packet à la fin de la déserialization du packet HelloConnectMessage .

Voici aussi le code de mon IdentificationMessage :
Code:
using BotFramework.IO;
using BotFramework.Packet.Types.connection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BotFramework.Packet.Messages.connection
{
    public class IdentificationMessage : IClientPacket
    {

        public const int Id = 4;
        public bool m_autoconnect;
        public bool m_useCertificate;
        public bool m_useLoginToken;
        public VersionExtended m_version;
        public string m_lang;
        public byte[] m_credentials;
        public short m_serverId;
        public double m_sessionOptionalSalt;

        public ClientPacketEnum PacketType
        {
            get
            {
                return ClientPacketEnum.IdentificationMessage;
            }
        }

        public void Init(bool autoconnect, bool useCertificate, bool useLoginToken, VersionExtended version, string lang, byte[] credentials, short serverId, double sessionOptionalSalt)
        {
            m_autoconnect = autoconnect;
            m_useCertificate = useCertificate;
            m_useLoginToken = useLoginToken;
            m_version = version;
            m_lang = lang;
            m_credentials = credentials;
            m_serverId = serverId;
            m_sessionOptionalSalt = sessionOptionalSalt;
        }

        public void Serialize(Writer writer)
        {
            byte flag = new byte();
            BooleanByteWrapper.SetFlag(0, flag, m_autoconnect);
            BooleanByteWrapper.SetFlag(1, flag, m_useCertificate);
            BooleanByteWrapper.SetFlag(2, flag, m_useLoginToken);
            writer.WriteByte(flag);
            m_version.Serialize(writer);
            writer.WriteString(m_lang);
            writer.WriteVarInt(m_credentials.Length);
            int credentialsIndex;
            for (credentialsIndex = 0; (credentialsIndex < m_credentials.Length); credentialsIndex ++)
            {
                writer.WriteByte(m_credentials[credentialsIndex]);
            }
            writer.WriteShort(m_serverId);
            writer.WriteDouble(m_sessionOptionalSalt);
        }
}
Ainsi que le code de VersionExtended:
Code:
 public class VersionExtended : Version , IClientPacket
    {
        public uint install = 0;
        public uint technology = 0;

        public VersionExtended initVersionExtended(uint major = 0, uint minor = 0, uint release = 0, uint revision = 0, uint patch = 0, uint buildType =0, uint install = 0, uint technology = 0)
        {
            base.initVersion(major, minor, release, revision, patch, buildType);
            this.install = install;
            this.technology = technology;
            return (this);
        }


        new public ClientPacketEnum PacketType
        {
            get
            {
                return ClientPacketEnum.VersionExtended;
            }
        }

        new public void Deserialize(Reader reader)
        {
            base.Deserialize(reader);
            this.install = reader.ReadByte();
            if (this.install < 0)
            {
                throw (new Exception((("Forbidden value (" + this.install) + ") on element of VersionExtended.install.")));
            };
            this.technology =   reader.ReadByte();
            if (this.technology < 0)
            {
                throw (new Exception((("Forbidden value (" + this.technology) + ") on element of VersionExtended.technology.")));
            };
        }

        new public void Serialize(Writer writer)
        {
            base.Serialize(writer);
            writer.WriteByte((byte)this.install);
            writer.WriteByte((byte)this.technology);
        }
    }

En sniffant ma propre application j'ai essayé d'analyser le packet envoyé (si ca peut aider):
00 12 02 00 00 02 1B 05 00 01 6C 78 01 00 01 01
00 02 66 72 A6 02 2D EB FB 8C DE 2C F7 21 82 30
EC 15 51 BC D1 5E 79 7D 33 80 9E 6F 82 84 FC 39
87 07 4B 78 2B 1B 27 53 F2 94 0D 5C AA B9 51 B3
C8 FE 1A 1A F8 54 08 A7 09 DE 45 0B B4 99 8F 08
89 9C EE 66 A5 72 26 35 89 97 71 E2 87 3D F8 7F
89 60 83 B8 23 35 88 FE 38 5D 13 B0 CE 09 03 EE
03 32 77 00 E0 C2 FB 2C B5 64 1F 61 89 44 7D 99
D7 F4 2A 7C 1D DB C2 4E D6 6A 95 79 41 D7 E7 43
76 98 7F 8D 81 5F 1B 3A B9 4D 50 FF 26 D7 EC E1
3A C6 71 CE CB 72 2C 03 D4 57 13 87 5E AA FB D1
7D 53 FE A5 B1 27 79 CB 01 B2 C1 7F A2 40 CA 67
E4 73 75 22 DF 8C E7 25 89 3E D1 54 9B F7 CB CA
04 8C 72 2E 97 AA BF 31 9A 0A AE 57 FB C9 7A 7F
B1 84 5A C1 4B 9C 7D 3E 8B 9A 2C 2D 3D 6F E8 D9
C6 55 C3 E9 5E A0 13 60 CE 85 85 CE 9B 69 FD F8
24 A5 26 CC E0 36 F5 C3 17 23 2F 00 3A 80 48 BC
45 6C 3A CD 6F 80 C2 96 EF 51 A8 40 78 7C 88 10 8E
64 69 AE 47 67 BB 52 04 A4 4A 45 2B 0D 27 4D 50
D1 64 06 9B 12 53 C6 B1 BA 94 0E 00 00 00 00

Enfin j'ai utilisé la classe RSA Manager provenant de Moonlight-Angel sans modifier aucune chose, sauf peut être la clé publique
(que j'ai trouvé en cherchant mon problème sur ce même forum)

Code:
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.Numerics;

namespace BotFramework.Core.Auth
{
    public static class RSAManager
    {
        private const string _RSAPublicKey =
           "MIIBUzANBgkqhkiG9w0BAQEFAAOCAUAAMIIBOwKCATIAq8EYkkGCUg86Bf2CHaM1z1Q2ahQgVXkx49I0igwTVCIqG86jsgNb22na1DThZ+IP7DfyBszIecVSP8nwbYPbx6Z7dwq4pnMVx/lx5lyMZUO1n/HGEkw1S06AlfXzSg58ci5DL9RJ9ZIa1oMDKtrZiNYA5C3L+7NSCVp/2H/yypWkDjzkFan65+TNRExo/2O3+MytJtQ/BXVkbYD58+iiZegddNTNGvz8WlPz2cZvPQt4x1TN+KOgJRKZH5imNAxCtRg6l1OLVxfwwUjKFgM4uAsto8vJv5DUFZQMO1Sh9gMpmzeMwXIF4fDD4O1TNiVmu3ABybt2Y4EdaQhs/ponC0SNcWbrY0stYbX+Wpk9/Hcxmo3zoduf1ZAdGM01E1g3IjQMd0gOP4v1KQtBjoHim2MCAwEAAQ==";


        public static byte[] Encrypt(List<byte> key, string Salt, string UserName, string Password)
        {

            RSACryptoServiceProvider RSA = GetRSA();
            string NewSalt = GetSalt(Salt);

            byte[] DecryptedData = PublicDecrypt(key.ToArray(), RSA.ExportParameters(false));

            RSACryptoServiceProvider newRSA = new RSACryptoServiceProvider();
            RSAParameters RSAKeyInfo = newRSA.ExportParameters(false);
            RSAKeyInfo.Modulus = DecryptedData;
            newRSA.ImportParameters(RSAKeyInfo);

            List<byte> Credentials = new List<byte>();

            Credentials.AddRange(Encoding.UTF8.GetBytes(NewSalt));
            Credentials.Add((byte)UserName.Length);
            Credentials.AddRange(Encoding.UTF8.GetBytes(UserName));
            Credentials.AddRange(Encoding.UTF8.GetBytes(Password));

            byte[] Encrypted = newRSA.Encrypt(Credentials.ToArray(), false);

            System.Diagnostics.Debug.WriteLine("Encrypted = " + Convert.ToBase64String(Encrypted) + " - Taille : " + Encrypted.Length + "\r\n");
            return Encrypted;
        }

        private static RSACryptoServiceProvider GetRSA()
        {
            RSACryptoServiceProvider RSA = DecodeX509PublicKey(Convert.FromBase64String(_RSAPublicKey));
            return RSA;
        }

        private static string GetSalt(string Salt)
        {
            if (Salt.Length < 32)
            {
                while (Salt.Length < 32)
                {
                    Salt += " ";
                }
            }

            return Salt;
        }

        private static byte[] PublicDecrypt(byte[] Data, RSAParameters RSAParameters)
        {
            BigInteger Exponent = new BigInteger(RSAParameters.Exponent.Reverse().Concat(new byte[] { 0 }).ToArray());
            BigInteger Modulus = new BigInteger(RSAParameters.Modulus.Reverse().Concat(new byte[] { 0 }).ToArray());

            BigInteger PreparedData = new BigInteger(Data   // Our data block
                .Reverse()  // BigInteger has another byte order
                .Concat(new byte[] { 0 })   // Append 0 so we are always handling positive numbers
                .ToArray()  // Constructor wants an array
            );

            byte[] DecryptedData = BigInteger.ModPow(PreparedData, Exponent, Modulus)   // The RSA operation itself
                .ToByteArray()  // Make bytes from BigInteger
                .Reverse()  // Back to "normal" byte order
                .ToArray(); // Return as byte array

            return DecryptedData.SkipWhile(x => x != 0).Skip(1).ToArray(); // PKCS#1 padding
        }

        private static RSACryptoServiceProvider DecodeX509PublicKey(byte[] X509Key)
        {
            // Encoded OID sequence for  PKCS#1 RSAEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1"
            byte[] SeqOID = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };
            byte[] Seq = new byte[15];

            // ---------  Set up stream to read the ASN.1 encoded SubjectPublicKeyInfo blob  ------

            MemoryStream MemoryStream = new MemoryStream(X509Key);
            BinaryReader BinaryReader = new BinaryReader(MemoryStream); // Wrap Memory Stream with BinaryReader for easy reading

            byte Byte = 0;
            ushort TwoBytes = 0;

            try
            {
                TwoBytes = BinaryReader.ReadUInt16();

                if (TwoBytes == 0x8130) // Data read as little endian order (actual data order for Sequence is 30 81)
                    BinaryReader.ReadByte();   // Advance 1 byte
                else if (TwoBytes == 0x8230)
                    BinaryReader.ReadInt16();   // Advance 2 bytes
                else
                    return null;

                Seq = BinaryReader.ReadBytes(15);   // Read the Sequence OID

                if (!CompareByteArrays(Seq, SeqOID))    // Make sure Sequence for OID is correct
                    return null;

                TwoBytes = BinaryReader.ReadUInt16();

                if (TwoBytes == 0x8103) // Data read as little endian order (actual data order for Bit String is 03 81)
                    BinaryReader.ReadByte();   // Advance 1 byte
                else if (TwoBytes == 0x8203)
                    BinaryReader.ReadInt16();   // Advance 2 bytes
                else
                    return null;

                Byte = BinaryReader.ReadByte();

                if (Byte != 0x00)   // Expect null byte next
                    return null;

                TwoBytes = BinaryReader.ReadUInt16();

                if (TwoBytes == 0x8130) // Data read as little endian order (actual data order for Sequence is 30 81)
                    BinaryReader.ReadByte();   // Advance 1 byte
                else if (TwoBytes == 0x8230)
                    BinaryReader.ReadInt16();   // Advance 2 bytes
                else
                    return null;

                TwoBytes = BinaryReader.ReadUInt16();

                byte LowByte = 0x00;
                byte HighByte = 0x00;

                if (TwoBytes == 0x8102) // Data read as little endian order (actual data order for Integer is 02 81)
                {
                    LowByte = BinaryReader.ReadByte();  // Read next bytes which is bytes in modulus
                }
                else if (TwoBytes == 0x8202)
                {
                    HighByte = BinaryReader.ReadByte(); // Advance 2 bytes
                    LowByte = BinaryReader.ReadByte();
                }
                else
                {
                    return null;
                }

                byte[] ModInt = { LowByte, HighByte, 0x00, 0x00 };  // Reverse byte order since ASN.1 key uses big endian order
                int ModSize = BitConverter.ToInt32(ModInt, 0);

                byte FirstByte = BinaryReader.ReadByte();
                BinaryReader.BaseStream.Seek(-1, SeekOrigin.Current);

                if (FirstByte == 0x00)  // If first byte (highest order) of modulus is zero, don't include it
                {
                    BinaryReader.ReadByte();    // Skip this null byte
                    ModSize -= 1;   // Reduce modulus buffer size by 1
                }

                byte[] Modulus = BinaryReader.ReadBytes(ModSize);   // Read the modulus bytes

                if (BinaryReader.ReadByte() != 0x02)    // Expect an Integer for the exponent data
                    return null;

                int ExponentBytes = (int)BinaryReader.ReadByte();   // Should only need one byte for actual exponent data (for all useful values)
                byte[] Exponent = BinaryReader.ReadBytes(ExponentBytes);

                // ------- Create RSACryptoServiceProvider instance and initialize with public key -----

                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                RSAParameters RSAKeyInfo = new RSAParameters()
                {
                    Modulus = Modulus,
                    Exponent = Exponent
                };

                RSA.ImportParameters(RSAKeyInfo);

                return RSA;
            }
            catch (Exception)
            {
                return null;
            }
            finally
            {
                BinaryReader.Close();
            }
        }

        private static bool CompareByteArrays(byte[] FirstArray, byte[] SecondArray)
        {
            if (FirstArray.Length != SecondArray.Length)
                return false;

            int i = 0;
            foreach (byte Byte in FirstArray)
            {
                if (Byte != SecondArray[i])
                    return false;

                i++;
            }

            return true;
        }
    }
}

Du coup j'suis pas sur de tout de où peut venir mon problème...
J'ai plusieurs idées , et j'aimerai savoir votre avis , soit:

- Ma clé publique n'est plus bonne dans la classe RSA Manager (je ne suis pas trop sur, j'ai vu qu'on pouvait verifier en décompilant le client, et que dans le dossier
binaries il etait codé en "PEM" (je n'ai pas encore bien compris tout cela)

- Je n'envoie pas le packet au bon endroit (je ne sais pas si le fait que je l'envoie à la fin de la déserialisation de HelloConnectMessage influe, j'essaye de changer actuellement)

- Mon Writer n'est pas bon ( ou je n'utilise pas les bonnes méthodes d'ecriture dans la Serialization ) , cependant j'ai essayé de reproduire le plus fidèlement possible le code .as des packets.

- J'ai merdé autre part dans mon ecriture de packet.


Aussi , pour information , la clé que j'obtiens dans HelloConnectMessage est composée de 305 bytes (il me semble que c'est bon) , d'autant que la valeur de _salt que j'obtiens me "semble" correcte .

Voila je m'en remets à vous pour n'importe quelle piste :'(

Merci d'avance à ceux qui auront eu le courage de me lire et de me répondre :)
 
Inscrit
7 Avril 2010
Messages
151
Reactions
2
#6
Re: Problème de reception de packets

Salut,
Déjà pour commencer, modifie la clé RSA qui n'est plus la même :
Code:
"MIIBUzANBgkqhkiG9w0BAQEFAAOCAUAAMIIBOwKCATIAq8EYkkGCUg86Bf2CHaM1z1Q2ahQgVXkx"
+ "49I0igwTVCIqG86jsgNb22na1DThZ+IP7DfyBszIecVSP8nwbYPbx6Z7dwq4pnMVx/lx5lyMZUO1"
+ "n/HGEkw1S06AlfXzSg58ci5DL9RJ9ZIa1oMDKtrZiNYA5C3L+7NSCVp/2H/yypWkDjzkFan65+TN"
+ "RExo/2O3+MytJtQ/BXVkbYD58+iiZegddNTNGvz8WlPz2cZvPQt4x1TN+KOgJRKZH5imNAxCtRg6"
+ "l1OLVxfwwUjKFgM4uAsto8vJv5DUFZQMO1Sh9gMpmzeMwXIF4fDD4O1TNiVmu3ABybt2Y4EdaQhs"
+ "/ponC0SNcWbrY0stYbX+Wpk9/Hcxmo3zoduf1ZAdGM01E1g3IjQMd0gOP4v1KQtBjoHim2MCAwEA"
+ "AQ==";
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#7
Re: Problème de reception de packets

Déjà pour commencer, enlève vite ton nom de compte et ton identifiant en dur comme ça, ou ne les mentionne pas dans un post comme ici, la plupart des gens actifs du forum ne viendront pas te faire chier, mais nous ne sommes pas seul.

Ensuite, ta clef publique est bonne.

Le placement de l'envoi de l'IM importe peu à partir du moment où tu reçois le HCM et que tu récupères bien les informations qu'il y a dedans. (et de la bonne manière)
En général quand j'ai un problème comme ça, je sniffe le client officiel, je compare son packet avec le mien et je compare.

Le problème peut venir de la version, mais en sniffant je vois que tu as les bonnes valeurs.
Ensuite, as tu bien mis les bons reader/writer , readVarInt readVarUhShort par exemple.
Et si oui, va voir directement le CustomDataWrapper si tes méthodes de ton reader/writer sont iso par rapport à celles de l'officiel.

Et normalement, ça devrait rouler.

EDIT : Mimiteck t'es sûr de ton coup pour la clef ? J'ai fais 3/4 recherches sur sa clef publique et je trouve les même portions dans ma clef publique.
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#9
Re: Problème de reception de packets

J'ai la même que lui et de mon côté ça passe ...
 
A

Anonymous

Invité
#10
Re: Problème de reception de packets

Je ne sais vraiment pas ou est mon erreur, mais je crois qu'elle se situe dans mon Writer , en effet , quand j'utilise mon Writer que j'ai créé en m'aidant du tuto pour les sockets, j'obtiens bien mes packets 10 et 20 en réponse (même si c'est toujours pas bon) , alors que quand j'utilise le CustomDataWriter de Asyade , je n'ai même pas de réponse du serveur avant de me faire déconnecter.

Alors que j'utilise le CustomDataReader pour lire , ainsi que presque tout le reste des sources du package IO de Asyade ...

Voilà mes Readers et Writers utilisés:

Reader :
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BotFramework.IO
{
    public class CustomDataReader : BigEndianReader, ICustomDataReader
    {

        public CustomDataReader() : base() { }
        public CustomDataReader(byte[] buffer) : base(buffer) { }
        public int ReadVarInt()
        {
            int retVal = 0;
            int proccesed = 0;
            bool full = false;
            while (proccesed < CustomDataConst.INT_SIZE)
            {
                byte tempon = this.ReadByte();
                full = (tempon & CustomDataConst.MASK_10000000) == CustomDataConst.MASK_10000000;
                if (proccesed > 0)
                {
                    retVal = retVal + ((tempon & CustomDataConst.MASK_01111111) << proccesed);
                }
                else
                {
                    retVal = retVal + (tempon & CustomDataConst.MASK_01111111);
                }
                proccesed = proccesed + CustomDataConst.CHUNCK_BIT_SIZE;
                if (!full)
                {
                    return retVal;
                }
            }
            throw new Exception("Too much data");
        }

        public uint ReadVarUhInt()
        {
            return (uint)ReadVarInt();
        }

        public short ReadVarShort()
        {
            int retVal = 0;
            int processed = 0;
            bool finished = false;
            while (processed < CustomDataConst.SHORT_SIZE)
            {
                byte tempon = this.ReadByte();
                finished = (tempon & CustomDataConst.MASK_10000000) == CustomDataConst.MASK_10000000;
                if (processed > 0)
                {
                    retVal = retVal + ((tempon & CustomDataConst.MASK_01111111) << processed);
                }
                else
                {
                    retVal = retVal + (tempon & CustomDataConst.MASK_01111111);
                }
                processed = processed + CustomDataConst.CHUNCK_BIT_SIZE;
                if (!finished)
                {
                    if (retVal > CustomDataConst.SHORT_MAX_VALUE)
                    {
                        retVal = retVal - CustomDataConst.UNSIGNED_SHORT_MAX_VALUE;
                    }
                    return (short)retVal;
                }
            }
            throw new Exception("Too much data");
        }

        public ushort ReadVarUhShort()
        {
            return (ushort)ReadVarShort();
        }

        public Types.Int64 ReadVarLong()
        {
            return ReadInt64();
        }

        public Types.UInt64 ReadVarUhLong()
        {
            return ReadUInt64();
        }

        private Types.UInt64 ReadUInt64()
        {
            uint _loc3_ = 0;
            Types.UInt64 _loc2_ = new Types.UInt64();
            uint _loc4_ = 0;
            while (true)
            {
                _loc3_ = ReadByte();
                if (_loc4_ == 28)
                {
                    break;
                }
                if (_loc3_ >= 128)
                {
                    _loc2_.low = (uint)(_loc2_.low) | (byte)((_loc3_ & 127) << (byte)_loc4_);
                    _loc4_ = _loc4_ + 7;
                    continue;
                }
                _loc2_.low = (uint)_loc2_.low | (byte)((byte)_loc3_ << (byte)_loc4_);
                return _loc2_;
            }
            if (_loc3_ >= 128)
            {
                _loc3_ = _loc3_ & 127;
                _loc2_.low = (uint)_loc2_.low | (byte)((byte)_loc3_ << (byte)_loc4_);
                _loc2_.high = (int)(_loc3_ >> 4);
                _loc4_ = 3;
                while (true)
                {
                    _loc3_ = ReadByte();
                    if (_loc4_ < 32)
                    {
                        if (_loc3_ >= 128)
                        {
                            _loc2_.high = (int)((uint)_loc2_.high | (uint)((byte)(_loc3_ & 127) << (byte)_loc4_));
                        }
                        else
                        {
                            break;
                        }
                    }
                    _loc4_ = _loc4_ + 7;
                }
                _loc2_.high = _loc2_.high | (byte)_loc3_ << (byte)_loc4_;
                return _loc2_;
            }
            _loc2_.low = (uint)_loc2_.low | (uint)((byte)_loc3_ << (byte)_loc4_);
            _loc2_.high = (int)(_loc3_ >> 4);
            return _loc2_;
        }
        private Types.Int64 ReadInt64()
        {
            uint _loc3_ = 0;
            Types.Int64 _loc2_ = new Types.Int64();
            uint _loc4_ = 0;
            while (true)
            {
                _loc3_ = ReadByte();
                if (_loc4_ == 28)
                {
                    break;
                }
                if (_loc3_ >= 128)
                {
                    _loc2_.low = _loc2_.low | (uint)((byte)(_loc3_ & 127) << (byte)_loc4_);
                    _loc4_ = _loc4_ + 7;
                    continue;
                }
                _loc2_.low = _loc2_.low | (uint)((byte)_loc3_ << (byte)_loc4_);
                return _loc2_;
            }
            if (_loc3_ >= 128)
            {
                _loc3_ = _loc3_ & 127;
                _loc2_.low = _loc2_.low | (uint)((byte)_loc3_ << (byte)_loc4_);
                _loc2_.high = (byte)_loc3_ >> 4;
                _loc4_ = 3;
                while (true)
                {
                    _loc3_ = ReadByte();
                    if (_loc4_ < 32)
                    {
                        if (_loc3_ >= 128)
                        {
                            _loc2_.high = _loc2_.high | (byte)(_loc3_ & 127) << (byte)_loc4_;
                        }
                        else
                        {
                            break;
                        }
                    }
                    _loc4_ = _loc4_ + 7;
                }
                _loc2_.high = _loc2_.high | (byte)_loc3_ << (byte)_loc4_;
                return _loc2_;
            }
            _loc2_.low = _loc2_.low | (uint)((byte)_loc3_ << (byte)_loc4_);
            _loc2_.high = (byte)_loc3_ >> 4;
            return _loc2_;
        }
    }
}

Writer (cette fois ci perso , mais qui utilise les methodes de Asyade pour WriteVarInt())
Code:
using BotFramework.IO;
using MiscUtil.Conversion;
using MiscUtil.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BotFramework.Packet
{
    public class Writer
    {
        private EndianBinaryWriter _writer;
        private MemoryStream _stream;

        public Writer()
        {
            _stream = new MemoryStream();
            _writer = new EndianBinaryWriter(EndianBitConverter.Big, _stream);
        }

        #region write methods

        public void WriteString(string value)
        {
            byte[] stringByte = ASCIIEncoding.UTF8.GetBytes(value);
            WriteUShort((ushort)(stringByte.Length));
            WriteBytes(stringByte);
        }

        internal void WriteBoolean(bool _quiet)
        {
            WriteBool(_quiet);
        }

        public void WriteInt(int value)
        {
            _writer.Write(value);
        }

        public void WriteShort(short value)
        {
            _writer.Write(value);
        }

        public void WriteUInt(uint value)
        {
            _writer.Write(value);
        }


        public void WriteUShort(ushort value)
        {
            _writer.Write(value);
        }

        public void WriteByte(byte value)
        {
            _writer.Write(value);
        }

        public void WriteBool(bool value)
        {
            _writer.Write(value);
        }

        public void WriteSByte(sbyte value)
        {
            _writer.Write(value);
        }

        public void WriteDouble(double value)
        {
            _writer.Write(value);
        }

        public void WriteBytes(byte[] value)
        {
            _writer.Write(value);
        }

        public void WriteVarInt(int value)
        {
            var _loc5_ = 0;
            BigEndianWriter buffer = new BigEndianWriter();
            if (value >= 0 && value <= CustomDataConst.MASK_01111111)
            {
                buffer.WriteByte((byte)value);
                this.WriteBytes(BitConverter.GetBytes(value));
                return;
            }
            int _loc3_ = value;
            BigEndianWriter subBuffer = new BigEndianWriter();
            while (_loc3_ != 0)
            {
                subBuffer.WriteByte(Convert.ToByte(_loc3_ & CustomDataConst.MASK_01111111));
                subBuffer.Position = subBuffer.Data.Length - 1;
                //subBuffer.Seek((int)subBuffer.BaseStream.Length, SeekOrigin.Begin);
                _loc5_ = subBuffer.BaseStream.ReadByte();
                _loc3_ = _loc3_ >> CustomDataConst.CHUNCK_BIT_SIZE;
                if (_loc3_ > 0)
                {
                    _loc5_ = _loc5_ | CustomDataConst.MASK_10000000;
                }
                //buffer.WriteBytes(BitConverter.GetBytes(_loc5_));
                buffer.WriteByte((byte)_loc5_);
            }
            this.WriteBytes(buffer.Data);
        }


        #endregion

        #region sendMethods
        public byte[] GetBytes()
        {
            return _stream.GetBuffer();
        }

        public void WritePacket(IClientPacket packet)
        {
            ushort packetId = (ushort)packet.PacketType; //PacketType converti en packetId
            Writer temp = new Writer();
            packet.Serialize(temp); //On créé un writer pour serialize le packet

            byte[] data = temp.GetBytes(); // On recupere le tableau de byte du writer
            byte lengthType = GetTypeLength(data.Length);
            ushort header = (ushort)(packetId << 2 | lengthType);//creation du header
            WriteUShort(header);

            switch (lengthType) // On écrit la longueur du packet en fonction du lenghtType
            {
                case 0: break;
                case 1:
                    WriteByte((byte)(data.Length));
                    break;
                case 2:
                    WriteUShort((ushort)(data.Length));
                    break;
                case 3:
                    WriteUInt((uint)(data.Length));
                    break;
            }

            WriteBytes(data); // Et on écrit le bytes de notre writer temporaire.
        }

        private byte GetTypeLength(int length)
        {
            if (length > 65535)
                return 3;

            if (length > 255)
                return 2;

            if (length > 0)
                return 1;

            return 0;
        }


        #endregion
    }
}

J'ai du mal à voir ou diffère mon code de celui de Asyade et pourtant quand j'utilise celui - ci (Writer) il "fonctionne" (du moins j'obtiens une réponse du serveur)

Voici mes Serializer des 3 packets que j'ai utilisé :

IdentificationMessage:

Mon code pour l' IdentificationMessage
Code:
public void Serialize(Writer writer)
        {
            byte flag = new byte();
            BooleanByteWrapper.SetFlag(0, flag, m_autoconnect);
            BooleanByteWrapper.SetFlag(1, flag, m_useCertificate);
            BooleanByteWrapper.SetFlag(2, flag, m_useLoginToken);
            writer.WriteByte(flag);
            m_version.Serialize(writer);
            writer.WriteString(m_lang);
            writer.WriteVarInt(m_credentials.Length);
            int credentialsIndex;
            for (credentialsIndex = 0; (credentialsIndex < m_credentials.Length); credentialsIndex++)
            {
                writer.WriteByte(m_credentials[credentialsIndex]);
            }
            writer.WriteShort(m_serverId);
            writer.WriteDouble(m_sessionOptionalSalt);
        }
L'original en AS
Code:
public function serializeAs_IdentificationMessage(param1:ICustomDataOutput) : void
        {
            var _loc_2:* = 0;
            _loc_2 = BooleanByteWrapper.setFlag(_loc_2, 0, this.autoconnect);
            _loc_2 = BooleanByteWrapper.setFlag(_loc_2, 1, this.useCertificate);
            _loc_2 = BooleanByteWrapper.setFlag(_loc_2, 2, this.useLoginToken);
            param1.writeByte(_loc_2);
            this.version.serializeAs_VersionExtended(param1);
            param1.writeUTF(this.lang);
            param1.writeVarInt(this.credentials.length);
            var _loc_3:* = 0;
            while (_loc_3 < this.credentials.length)
            {
                
                param1.writeByte(this.credentials[_loc_3]);
                _loc_3 = _loc_3 + 1;
            }
            param1.writeShort(this.serverId);
            if (this.sessionOptionalSalt < -9007199254740992 || this.sessionOptionalSalt > 9007199254740992)
            {
                throw new Error("Forbidden value (" + this.sessionOptionalSalt + ") on element sessionOptionalSalt.");
            }
            param1.writeDouble(this.sessionOptionalSalt);
            return;
        }// end function

Version :
Mon code :
Code:
 public void Serialize(Writer writer)
        {
            if (this.major < 0)
            {
                throw (new Exception((("Forbidden value (" + this.major) + ") on element major.")));
            };
            writer.WriteByte((byte)this.major);
            if (this.minor < 0)
            {
                throw (new Exception((("Forbidden value (" + this.minor) + ") on element minor.")));
            };
            writer.WriteByte((byte)this.minor);
            if (this.release < 0)
            {
                throw (new Exception((("Forbidden value (" + this.release) + ") on element release.")));
            };
            writer.WriteByte((byte)this.release);
            if (this.revision < 0)
            {
                throw (new Exception((("Forbidden value (" + this.revision) + ") on element revision.")));
            };
            writer.WriteInt(this.revision);
            if (this.patch < 0)
            {
                throw (new Exception((("Forbidden value (" + this.patch) + ") on element patch.")));
            };
            writer.WriteByte((byte)this.patch);
            writer.WriteByte((byte)this.buildType);
        }
Le code original en AS:
Code:
public function serializeAs_Version(param1:ICustomDataOutput) : void
        {
            if (this.major < 0)
            {
                throw new Error("Forbidden value (" + this.major + ") on element major.");
            }
            param1.writeByte(this.major);
            if (this.minor < 0)
            {
                throw new Error("Forbidden value (" + this.minor + ") on element minor.");
            }
            param1.writeByte(this.minor);
            if (this.release < 0)
            {
                throw new Error("Forbidden value (" + this.release + ") on element release.");
            }
            param1.writeByte(this.release);
            if (this.revision < 0)
            {
                throw new Error("Forbidden value (" + this.revision + ") on element revision.");
            }
            param1.writeInt(this.revision);
            if (this.patch < 0)
            {
                throw new Error("Forbidden value (" + this.patch + ") on element patch.");
            }
            param1.writeByte(this.patch);
            param1.writeByte(this.buildType);
            return;
        }// end function

Enfin VersionExtended :
Mon Code :
Code:
 new public void Serialize(Writer writer)
        {
            base.Serialize(writer);
            writer.WriteByte((byte)this.install);
            writer.WriteByte((byte)this.technology);
        }
Le code original en AS:
Code:
public function serializeAs_VersionExtended(param1:ICustomDataOutput) : void
        {
            super.serializeAs_Version(param1);
            param1.writeByte(this.install);
            param1.writeByte(this.technology);
            return;
        }// end function

Je me demandais aussi , si justement le fait de caster this.install , this.technology en byte pour pouvoir utiliser WriteByte était un problème,
car dans le code original writeByte() peut prendre un uint en paramètre Oo , et moi j'ai décidé d'utiliser WriteByte aussi , et de caster les uint en byte.

Sinon je ne vois pas trop quoi faire... J'ai vraiment du mal à comprendre pourquoi lorsque j'envoie ce packet IdentificationMessage, le serveur me déconnecte sans crier gare.

EDIT:
J'ai regardé un peu tes sources sur le Git de BlueSheep et j'ai vu ceci :
Code:
key = new sbyte[limit];
            for (int i = 0; i < limit; i++)
            {
                 key[i] = reader.ReadSByte();
            }
Hors moi j'utilise reader.ReadByte() dans mon code , et key est un tableau de byte , mon problème viendrait - t - il de là ?
Dans le code en Action script de mon client j'ai pourtant bien un tableau de byte :
Code:
public function deserializeAs_HelloConnectMessage(param1:ICustomDataInput) : void
        {
            var _loc_4:* = 0;
            this.salt = param1.readUTF();
            var _loc_2:* = param1.readVarInt();
            var _loc_3:* = 0;
            while (_loc_3 < _loc_2)
            {
                
                _loc_4 = param1.readByte();
                this.key.push(_loc_4);
                _loc_3 = _loc_3 + 1;
            }
            return;
        }// end function
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#11
Re: Problème de reception de packets

Le WriteVarInt c'est moi qui l'ai changé pas Asyade, les crédits bordel :(

Bref, c'est dur à dire mais tu peux nous donner le paquet que tu envoies et le paquet que tu sniffes s'il te plait je m'y retrouve mieux :D
 
A

Anonymous

Invité
#12
Re: Problème de reception de packets

C'est à dire, tu veu que je sniffe le packet en sortie de mon programme c# et un autre du packet que j'envoie quand je me connecte avec le client du jeu?
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#13
Re: Problème de reception de packets

Le identification message que tu envoies (je crois que tu l'as mis en début de post) et celui que tu sniffes en officiel. Je me suis tellement cassé les dents sur ce paquet que je repère les erreurs plus facilement sur l'hexa. Dur pour moi :(
 
A

Anonymous

Invité
#14
Re: Problème de reception de packets

Code:
00 12 01 1C 01 02 1B 05 00 01 6C 78 01 00 01 01
 00 02 66 72 80 02 7F 83 CB 75 03 CF C9 67 4F 14 
36 47 A9 7A DA A5 D5 B2 E2 15 44 34 2C 43 E3 6E
 BA 6C D0 FB 06 BF 8F 2C F2 CD AB 6E 62 82 BF 40
 36 51 98 72 C9 6A 0D 04 8A CC D8 76 A0 B7 B9 B7 
3E A8 A2 9A 6D 8E CE 19 D1 3E C7 D1 9E F0 3A 26 
E6 53 73 44 79 61 9B 2B 8E 43 BF 46 D2 E8 27 04
 46 00 65 23 E2 B3 0B 97 69 F5 8D 23 F6 9B F5 F5
 20 EA EF A8 2F 27 03 5C 99 75 ED 82 54 60 FE EB
 BB E7 B4 91 B8 9B 9E 8C BF 45 30 9D 75 1F B2 C1
 9A 07 78 19 21 A1 4F 9D 9A 2E A1 B0 40 A3 C2 6B
 46 EC E8 13 E9 76 67 C8 FF 06 8B 09 0D BB 36 0D
 62 07 3C 88 8B 0A 0C 65 C1 6F 96 9D 9B 1B F8 D1
 1E A2 7D 01 A4 6E 98 BB 0B 2E 47 CE C6 55 48 FB
 FE 52 9F 66 8C CC 4D 5D 57 51 AE 3A 29 02 AA 47
 52 3F 1F C1 D4 05 12 A3 49 6B 3C B2 19 84 99 BD
 09 3C 2B E1 5B 99 17 23 32 9D 0F 36 77 64 81 26 
88 D7 E2 37 E0 3C 00 00 00 00 00 00 00 00 00 00

Et voici celui que j'envoie:
Code:
00 12 02 00 00 02 1B 05 00 01 6C 78 01 00 01 01
 00 02 66 72 80 02 48 1F 9D 7B 81 81 37 71 EA C5
 1F D9 69 E5 8B 83 C8 C3 71 40 F0 51 1B FF 0C BB
 5E 9B 58 0D C7 E6 DE E1 4C 4C FA B4 37 CA 61 03
 4F FB AA CC 07 09 11 69 8F 2B BE 98 16 E2 57 62
 60 E2 5A 25 87 63 6C 12 84 83 F4 24 5E 46 B4 E7 
AF 93 97 B7 32 29 4B C4 70 EF AD 24 92 5F 05 70
 A3 3E 11 F9 78 1F D9 07 E9 A2 DF C0 67 94 C4 4D 
82 11 8C 45 81 D7 A2 E2 51 41 77 C0 E0 26 9D EF
 CC A4 16 EB 86 E1 02 58 C7 20 1F 46 56 2B 29 CB
 C9 E2 15 C4 04 6F A8 7B 92 54 AA 22 91 D2 ED 97
 0B D9 03 4D 38 E3 51 50 3A 95 A6 91 8D 2B 2E 7D
 7D CF DC 4A 48 DF 7B 44 09 E0 DD A1 BB 02 77 81
 F4 A7 75 FC 72 2B 90 5D BB D2 DC 68 12 68 EE 0B
 33 73 2F BB 82 A1 87 9B D3 B7 98 FB 0E A1 17 05
 80 07 84 89 D0 82 37 1C ED 77 1A 07 9B 8B C4 4D
 CA E1 8C AF E4 59 F8 BB 2F 63 08 81 F5 8E C1 AF
 A3 10 A0 79 37 77 00 00 00 00 00 00 00 00 00 ....

les voilà ..
 
A

Anonymous

Invité
#15
Re: Problème de reception de packets

Petit Up : J'ai fini par résoudre mon problème en reprenant mon code de zero.
J'avais un problème dans mon writer, et cela marche mieux maintenant qu'il est modifié :)

Merci à tous pour votre aide :)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#16
Conjecture Cadernis : "103% des problèmes d'envoi ou de réception de paquets sont dus à une faute dans le reader/writer."
 
A

Anonymous

Invité
#17
Ahah au moins maintenant je suis clairement préparé !
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#18
J'aimerai tout de même rajouter quelque chose concernant les reader/writer que je vois défiler sur les topics.
Ça ne vous gêne pas d'avoir des _loc3_ recopiés bêtement du code du client ? C'est tellement moche et ça aide pas pour la compréhension du code.
Pourtant, avoir les vrais noms des variables, c'est pas si dur, suffit d'aller les récupérer dans le code du client Beta.

Donc pour les gens qui ne supportent pas des noms de variables pourris, prenez 2mn et allez les chercher dans le client Beta :D.
 
Inscrit
25 Février 2012
Messages
178
Reactions
3
#19
Moonlight-Angel a dit:
J'aimerai tout de même rajouter quelque chose concernant les reader/writer que je vois défiler sur les topics.
Ça ne vous gêne pas d'avoir des _loc3_ recopiés bêtement du code du client ? C'est tellement moche et ça aide pas pour la compréhension du code.
Pourtant, avoir les vrais noms des variables, c'est pas si dur, suffit d'aller les récupérer dans le code du client Beta.

Donc pour les gens qui ne supportent pas des noms de variables pourris, prenez 2mn et allez les chercher dans le client Beta :D.
Moi ça me dérange grave..
 
Haut Bas