C# [MITM]Client qui se connecte pas

A

Anonymous

Invité
#1
Bonjour aux Cadernissiennes et Cadernissiens :)

Ca fait longtemps que je travaille sur mon bot même si je n'y passe que très peu de temps.
Mais voila malgré tous mes efforts je ne comprends toujours pas ce qui cloche :?
Pour la réception et l'envoi de packet client/serveur tout se passe bien jusqu'au packet 42
La question a due être mainte et mainte fois mais là je sèche ...
Donc quand le client doit se connecter au serveur de jeu il se bloque en esseyant de se co mais n'y parvient pas.
Pourtant ma connexion client est fermée et mon serveur game opérationnel.

Packet 42:
Code:
if (e.ProtocolId == 42) //SelectedServerDataMessage
            {
                SelectedServerDataMessage message = new SelectedServerDataMessage(e.packet);
                string address = message.address;
                int port = (int)message.port;

                message.address = "127.0.0.1";
                message.port = 5556;
                message.Pack(this.Client);

                Client.Stop();
                Client = new Connection(MainForm.serverGame.AcceptSocket(), ConnectionType.Client);
                Client.Sock = MainForm.serverGame.AcceptSocket();
                Client.Start();

                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(address, port);
                Server.Sock = socket;
            }


Et même quand j'utilise un thread de réception client au lieu du Client.Sock = MainForm.serverGame.AcceptSocket();
ça ne fonctionne pas

Code:
private void WaitingGame()
        {
            //s'il y a un nouveau client on l'accepte
            serverGame.BeginAcceptSocket(new AsyncCallback(this.AcceptGame), null);
        }

        private void AcceptGame(IAsyncResult iar)
        {
            if (this.InvokeRequired) //pour éviter les problèmes d'inter-threading
            {
                this.Invoke(new _Accept(this.AcceptGame), new object[] { iar });
            }
            else
            {
                this.console.couleur = Color.Green;
                this.console.Log("Nouvelle connexion GAME !!");

                ClientForm client = new ClientForm(new Connection(serverGame.EndAcceptSocket(iar), ConnectionType.Client), Loader.LoadedPlugins); //on crée la ClientForm avec le DofusClient comportant la socket acceptée
                client.MdiParent = this;
                client.Show();

                serverGame.BeginAcceptSocket(new AsyncCallback(this.AcceptGame), null); //on recommence à accepter des clients
            }
        }


Voila, en espérant que quelqu'un me vienne en aide car je ne sais plus quoi faire D:
 
A

Anonymous

Invité
#2
J'ai eu ce problème très récemment (voir -> ici).

Voici comment je procède et comment je te conseille de procéder :
  • Dès le lancement de ton MITM, écoute les connexions pour le serveur de connexion (port 5555 en général) mais aussi les connexions pour le serveur de jeu (port au choix, tu sembles avoir pris le 5556)
  • Quand tu reçois le packet 42, tu modifies l'IP/le port et tu le transmets au client (comme tu fais là) en prenant soin de sauvegarder l'IP du serveur de jeu bien sûr
  • Dès lors :!: tu fermes la connexion client Dofus <-> MITM (port de connexion) et MITM <-> serveur d'authentification
  • Tu vas alors recevoir une demande de connexion de la part du client sur le port du serveur de jeu (5556)
  • Ensuite tu ouvres une connexion au serveur de jeu avec l'IP que tu as récupérée du packet 42 et puis tu transmets les messages comme tu l'as fais pour le serveur de connexion

Si tu as un problème/des questions, n'hésite pas.
 
A

Anonymous

Invité
#3
Merci pour ta réponse :)

J'avais déjà regarder on topic et télécharger les sources pour comparer, je n'y ai pas trouvé de différences,
µnKn0wn_H4CK3r a dit:
  • [*]Tu vas alors recevoir une demande de connexion de la part du client sur le port du serveur de jeu (5556)

Il est là en fait mon problème :( : je n'ai pas de connexions entrante venant du client sur mon port de game(5556)
Le client ne fait "qu'attendre" et rien ne se passe, je vais revoir mon Listener Game mais c'est le même code que le Login donc aucun problème normalement

PS:pour infos j'ai tester la connexion avec le serveur de jeu officiel et tout baigne, il me reste juste à régler le problème du changement de serveur


Cordialement, SaBoKKKKKK
 
A

Anonymous

Invité
#4
Es-tu bien sûr de déconnecter le socket du client Dofus au MITM une fois le packet 42 envoyé ? Dans mon cas c'est ça qui bloquait.

Si c'est ok :
  • As-tu vérifié que le client Dofus reçoit bien le packet 42 ?
  • Si oui, est-il correct ? Repère chaque octet/séquence d'octets correspondant à : l'ID, la taille du paquet, l'IP du serveur de jeu, le port du serveur de jeu, etc. : sont-ils corrects ? Peut-être que ton writer ou ta classe SelectedServerDataMessage sont défectueux.
Pour ces 2 derniers points tu peux utiliser WPE Pro par exemple, je pense que c'est le plus adapté (il y en a d'autres comme Wireshark par exemple mais plus complexe avec des infos pas nécessaires dans notre cas).

Si tu n'y arrives toujours pas tu peux poster ta source j'essaierai de voir ce qui ne va pas.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#5
Sabok a dit:
Bonjour aux Cadernissiennes et Cadernissiens :)

...
Pourtant ma connexion client est fermée et mon serveur game opérationnel.

Packet 42:
Code:
if (e.ProtocolId == 42) //SelectedServerDataMessage
            {
                SelectedServerDataMessage message = new SelectedServerDataMessage(e.packet);
                string address = message.address;
                int port = (int)message.port;

                message.address = "127.0.0.1";
                message.port = 5556;
                message.Pack(this.Client);

                Client.Stop();
                Client = new Connection(MainForm.serverGame.AcceptSocket(), ConnectionType.Client);
                Client.Sock = MainForm.serverGame.AcceptSocket();
                Client.Start();

                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(address, port);
                Server.Sock = socket;
            }
...
Salut , non elle est pas fermée , d'apres MSDN :
.Stop ferme l'écouteur. Toutes les demandes de connexion non acceptées de la file d'attente sont perdues. Les hôtes distants attendant l'acceptation d'une connexion lèvent SocketException. C'est à vous qu'il incombe de fermer vos connexions acceptées séparément.

en gros .stop arrete d'accepter des clients mais deco pas les connexions déjà acceptées , le probleme c'est que le client attend d'etre deco pour passer a la suite
.disconnect sur la connexion devrait etre mieux ou .close pour rester sur le tcplistener (mais .close n'autorisera plus le .start un peu plus loin)
 
A

Anonymous

Invité
#6
Non non ToOns ^^ Client vient de ma classe Connection et Stop est une méthode indépendante du framework ;)
Code:
public void Stop()
        {
            if (Listen.IsAlive)
                Listen.Abort();

            if (DataTreatment.IsAlive)
                DataTreatment.Abort();

            this.Sock.Shutdown(SocketShutdown.Both);
            this.Sock.Disconnect(false);
        }

Sinon µnKn0wn, comme tu m'as dis de vérifier si le 42 est bien envoyé, et bien j'ai trouvé une erreur:
Il y a une différence de 1 bit entre ce que je reçois et ce que j'envois:? :?:

Je pars en vacances donc je ne prends pas mon ordi, je posterai la réponse si j'ai trouvé entre-temps
 
A

Anonymous

Invité
#7
Tu devrais avoir beaucoup plus que 1 bit de différence entre ce que tu reçois du serveur "officiel" et ce que tu renvoies au client Dofus.

Les 3 premiers octets devraient être identiques, comme les attributs serverId, canCreateNewCharacter et ticket, en revanche l'adresse IP devrait être radicalement différente puisque tu passes de 213.248.126.39 à 127.0.0.1 et le port devrait lui aussi changer de 5555 à 5556.
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#8
Décidément, ce paquet porte bien son ID.
 
A

Anonymous

Invité
#11
http://lmgtfy.com/?q=la+réponse+de+la+vie ;)
Sinon il y a bien un grand décalage entre ce que je reçois et ce que j'envois, au moins 4 ou 5 bytes
Mais le pire reste que le fait que malgré cet overflow n'affecte ni le client, ni le serveur et m'identifie bien (oui car il y a un décalage su tous mes packets o_o)
Donc je vais continuer à plancher dessus. Par ailleurs µnKn0wn, j'ai tester tes sources et elles ne fonctionnent pas, Ankama m'aime pas :(
 

Sparkdaemon

Staff
Membre du personnel
Inscrit
7 Avril 2009
Messages
556
Reactions
3
#12
Merci d'arrêter le HS, s'il vous plaît ;)

"La question ultime"..
 
A

Anonymous

Invité
#13
Je serais toi, je vérifierais octet par octet le packet 42 envoyé au client pour être sûr qu'il est correct. À mon avis il doit y avoir une erreur quand tu pack/serialize.

Si c'est ok et que tu déconnectes bien le socket client Dofus <-> MITM, alors je voudrais bien voir ton code source...

EDIT : sinon oui il est possible que mes sources soient bien buguées, c'était vraiment le début du début :?
 
A

Anonymous

Invité
#14
Dac je le ferai à mon retour, mais pour info: les méthodes de parsing et de packetage ont-elles changé ?
 
A

Anonymous

Invité
#15
Non, pas que je sache.

Un paquet se présente comme ceci pour rappel :
  • 14 premiers bits : ID du packet
  • 15ème et 16ème bits : sur combien d'octets est codée la taille du paquet (00b = 0d, 01b = 1d, 10b = 2d ou 11b = 3d) ?
  • la taille du paquet si différente de 0 (n'inclut pas le header, c'est à dire ce qui est en bleu)
  • le contenu du paquet en lui-même
 
A

Anonymous

Invité
#16
Oui c'est bien ça, j'utilise le parser de ToOns.
Dès que j'ai mes sources je vous envoie ma méthode de réception et d'envoie :)
 
Haut Bas