C# Le fonctionnement d'un Bot.

Inscrit
26 Février 2016
Messages
82
Reactions
0
#1
Bonjour,

je me suis lancé il y a quelques jours dans la réalisations d'un Bot pour un jeu (En flash comme D. ^^) mais même après avoir lu une cinquantaine de topic ici et après avoir passé mes heures sur Google, j'ai encore quelques questions..

En gros on tout premier en va faire une connexion Socket (par exemple en C#). Puis on va créer 2 classes, une pour encoder et une autre pour décoder ce que l'en envoie ou ce que l'on reçoit. Par exemple pour connecter mon Bot au jeu il faudrait donc réaliser cette connexion est envoyer un ou plusieurs packets de connexion ?
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#2
Je ne sais pas exactement ce que tu souhaites savoir, mais oui pour se connecter au serveur d'un jeu, il faut en général passer par une phase d'authentification et un envoi d'identifiants (chiffrés ou non).
 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#3
NicoMasterChief a dit:
Je ne sais pas exactement ce que tu souhaites savoir, mais oui pour se connecter au serveur d'un jeu, il faut en général passer par une phase d'authentification et un envoi d'identifiants (chiffrés ou non).
Salut, alors merci beaucoup de ta réponse !
Par exemple, je dois envoyer un packet qui envoie la version du client, puis la serveur renvoie un packet disant si la version de mon client est à jour ou pas. Pour faire cela, j'ai vu que en tout premier le serveur ne m'envoie rien et que c'est à moi de lui envoyer la version en tout premier, du coup il faudrait que je fasse une sorte de boucle qui va écouter les packets reçus, après il y a une histoire de buffer que je n'ai pas trop comprit pour envoyer ce packet
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#4
Ah, tu vois je me posais la question de savoir si, en général, c'était toujours le serveur qui commençait à émettre le premier ou pas, grâce à toi j'ai ma réponse ;)

Oui, tu dois faire un système qui stocke les octets reçus dans un buffer (tableau d'octets) et qui vérifie à chaque "fournée" (chaque nouvelle réception d'octets) si ton buffer contient un paquet complet ou pas. Si tu reçois des nouveaux octets, tu les ajoutes à la fin de ton buffer puis tu vérifies s'il contient un paquet complet. Si c'est le cas, tu le traites, sinon tu retournes dans ta boucle d'attente de nouveaux octets. Car il faut savoir qu'en réseau, les paquets arrivent de manière aléatoire. Le protocole TCP garantit l'ordre et la bonne réception mais tes paquets peuvent arriver découpés (incomplets donc, c'est souvent le cas pour les gros paquets), collés (plusieurs paquets à la suite dans le même datagramme) ou entiers (l'idéal). Pour connaitre la taille d'un paquet, il faut lire l'en-tête de ce paquet, et pour cela, il faut connaître le protocole de ton jeu.
 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#6
NicoMasterChief a dit:
Ah, tu vois je me posais la question de savoir si, en général, c'était toujours le serveur qui commençait à émettre le premier ou pas, grâce à toi j'ai ma réponse ;)

Oui, tu dois faire un système qui stocke les octets reçus dans un buffer (tableau d'octets) et qui vérifie à chaque "fournée" (chaque nouvelle réception d'octets) si ton buffer contient un paquet complet ou pas. Si tu reçois des nouveaux octets, tu les ajoutes à la fin de ton buffer puis tu vérifies s'il contient un paquet complet. Si c'est le cas, tu le traites, sinon tu retournes dans ta boucle d'attente de nouveaux octets. Car il faut savoir qu'en réseau, les paquets arrivent de manière aléatoire. Le protocole TCP garantit l'ordre et la bonne réception mais tes paquets peuvent arriver découpés (incomplets donc, c'est souvent le cas pour les gros paquets), collés (plusieurs paquets à la suite dans le même datagramme) ou entiers (l'idéal). Pour connaitre la taille d'un paquet, il faut lire l'en-tête de ce paquet, et pour cela, il faut connaître le protocole de ton jeu.

Ah d'accord car ce que j'ai fais, j'ai simplement écoutait ce que le serveur m'envoyait sans rien envoyer et il m'envoie un packet hexadecimal, et lorsque je vérifie en sniffant les packets du jeu, ils correspondent à l'envoie du cross-domain. Cependant, j'ai remarquer qu'il y a un autre packet qui s'ajoute à l'autre mais je n'arrive pas à savoir lequel parmis ceux que j'ai sniffer



Voici mon code :
Code:
 try
            {
                socket.Connect("204.75.167.165", 3724);

                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.Write(" [Connexion]");
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.Write(" Connexion au serveur d'authentification... ");

                if (socket.Connected)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("Ok!");
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.Write("\n [Client]");
                    Console.ForegroundColor = ConsoleColor.Gray;
                    Console.WriteLine(" Vérification de la version avec celle du serveur... ");

                    byte[] recvBuffer = new byte[3024];
                    int bytesReceived = socket.Receive(recvBuffer);

                    if (bytesReceived == 0)
                    {
                        Console.WriteLine("Une erreur est survenue lors de la reception de donnees a travers le socket");
                        throw new ApplicationException("Erreur de reception des donnees par le socket");
                    }

                    byte[] data = new byte[bytesReceived];
                    Array.Copy(recvBuffer, 0, data, 0, bytesReceived);
                    Console.ForegroundColor = ConsoleColor.Magenta;
                    Console.Write("\n [Packets]");
                    Console.ForegroundColor = ConsoleColor.Gray;
                    Console.Write(" Packets reçus : ");
                    foreach (byte b in data)
                    Console.Write(b.ToString("X") + " ");
                    Console.Write(Environment.NewLine);

                    byte[] recvBuffer2 = new byte[3024];
                    int bytesReceived2 = socket.Receive(recvBuffer2);

                    while (true)
                    {
                    }
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write("Echec!");
                    Console.ForegroundColor = ConsoleColor.Gray;
                }
            }

            catch (SocketException sock_ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("[SocketException] " + sock_ex.Message);
                Console.ForegroundColor = ConsoleColor.Gray;
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#7
Si tu ne sais pas comment fonctionne le protocole de de ton jeu, tu ne pourras pas identifier les paquets que tu reçois et à quoi ils correspondent.
 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#8
NicoMasterChief a dit:
Si tu ne sais pas comment fonctionne le protocole de de ton jeu, tu ne pourras pas identifier les paquets que tu reçois et à quoi ils correspondent.
Si, justement je connais bien le protocole de ce jeu et je sais à quoi serve les packets, mais une question, es-que pour le moment mon code est bon ? Le packet que je reçois est bon ? Comment je peux le traiter ?

Merci encore pour ton aide !
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#9
Ton code a l'air correct mais il manque une boucle while quand même, là tu reçois qu'une fois, je suppose que c'était juste pour faire un test. Si tu connais le protocole de ton jeu alors tu sais si le paquet est entier ou non, moi j'en sais rien.
Pour ce qui est du traitement, c'est-à-dire la déserialisation, faut regarder les sources du jeu.
 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#10
D'accord, du coup j'ai décrypté 2 packets, le premier c'est celui que je vais envoyer et l'autre avec le Cross-Domain c'est celui que je reçoi sans rien envoyer.



Lorsque j'envoie mon packet pour check la version :
Code:
byte[] version = new byte[] { 0x3c, 0x6d, 0x73, 0x67, 0x74, 0x3d, 0x27, 0x73, 0x79, 0x73, 0x27, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x76, 0x65, 0x72, 0x43, 0x68, 0x6b, 0x27, 0x72, 0x3d, 0x27, 0x30, 0x27, 0x3e, 0x3c, 0x76, 0x65, 0x72, 0x76, 0x3d, 0x27, 0x31, 0x35, 0x33, 0x27, 0x2f, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x6d, 0x73, 0x67, 0x3e, 0x00  };

                    String version_ascii = System.Text.Encoding.ASCII.GetString(version);

                    Console.WriteLine(version_ascii);

                    int bytesReceived2 = socket.Send(version);
C'est censé m'envoyé un packet si la version est bonne ou pas, mais je ne reçois rien. Je pense que ça vient de la boucle While que je n'ai pas mit.
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#11
Sans boucle, tu n'iras pas bien loin.
Tu te connectes à quel port sur le serveur de ton jeu ?
 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#12
NicoMasterChief a dit:
Sans boucle, tu n'iras pas bien loin.
Tu te connectes à quel port sur le serveur de ton jeu ?
Je me connecte sur le port : 3724

Lorsque j'affiche ce que j'envoie, ça me met : System.Byte[], donc logiquement je ne reçois rien car j'envoie ça et non le packet
 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#14
En gros j'envoie un packet qui va vérifier la version :
Code:
  byte[] version = new byte[] { 0x3c, 0x6d, 0x73, 0x67, 0x74, 0x3d, 0x27, 0x73, 0x79, 0x73, 0x27, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x27, 0x76, 0x65, 0x72, 0x43, 0x68, 0x6b, 0x27, 0x72, 0x3d, 0x27, 0x30, 0x27, 0x3e, 0x3c, 0x76, 0x65, 0x72, 0x76, 0x3d, 0x27, 0x31, 0x35, 0x33, 0x27, 0x2f, 0x3e, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x6d, 0x73, 0x67, 0x3e, 0x00 };

socket.Send(version);
Tu penses que je pourrais recevoir le fameux packet de la part du serveur qui me dit si oui ou non j'ai la bonne version avec ce code ?
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#15
Là tu t'es contenté de copier un message qui avait été envoyé par ton client officiel et de le renvoyer au serveur ? Tu sais ce qu'il contient exactement ?
 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#16
Oui c'est exactement ça, en gros quand je sniffe le packet, je vois tout l'intégralité du packet en Xml comme afficher sur les images précédente du client, et j'envoie ce que le vraie client envoie au serveur

 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#17
Ah d'accord, c'est un protocole bien différent de celui de Dofus.

Et le serveur ne répond pas ?
 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#18
Le serveur me répond en m'envoyant un packet (Crossdomain) sachant que je reçois se packet même si je n'envoie rien.

 
Inscrit
26 Février 2016
Messages
82
Reactions
0
#20
Lors d'une connexion officiel, normalement le client envoie un packet pour savoir si la version est à jour, puis le serveur envoie au client 2 packets, le premier qui est le cross domain (Parfois je le reçoi en premier il me semble) et un autre packet qui dit si la version est ok ou pas est à partir de là le client envoie d'autre packets etc..
 
Haut Bas