Probleme serveur mitm

Inscrit
15 Mai 2020
Messages
11
Reactions
1
#1
Hello, ça fais plusieurs heure que je cherche et je n'arrive pas a faire un serveur Mitm en C#, j'ai tout essayé socket async ou non, j'ai même essayer avec le code d'un projet opensource qui s'appelle Dofus Lab mais pareil j'ai exactement le même problème : la conversation entre le client et le serveur s’arrête au début et ils n'envoient plus rien.

Merci d'avance pour votre aide.

Exemple d'un des codes que j'ai fais
C#:
   class Program
    {
        static IPEndPoint ipEnd;
        static Socket sock;
        static void Main(string[] args)
        {
            ipEnd = new IPEndPoint(IPAddress.Loopback, 5555);

            sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

            sock.Bind(ipEnd);

            Thread t = new Thread(new ThreadStart(ClientToServer));
            t.Start();
        }

        static IPEndPoint ipEnddofus;
        static Socket sockDofus;
        static bool connected;
        static Socket clientSock;
        static void ClientToServer()
        {
            while (true)
            {
                if (connected != true)
                {
                    Console.WriteLine("Waiting for client to connect");
                    sock.Listen(100);
                }

                clientSock = sock.Accept();

                
                byte[] truncArray = new byte[1024 * 5000];
                int bytelen = clientSock.Receive(truncArray);
                byte[] clientData = new byte[bytelen];

                Array.Copy(truncArray, clientData, clientData.Length);

                

                if (connected != true)
                {
                    Console.WriteLine("Client connected");
                    connected = true;
                    ipEnddofus = new IPEndPoint(System.Net.IPAddress.Parse("172.65.235.192"), 5555);
                    sockDofus = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                    sockDofus.Connect(ipEnddofus);
                    Console.WriteLine("Connected to server");
                    Thread s = new Thread(new ThreadStart(ServerToClient));
                    s.Start();
                }
                if (bytelen < 0)
                {
                    sockDofus.Send(clientData);
                    Console.WriteLine("1");
                }
            }
        }
        static void ServerToClient()
        {
            while (true)
            {
                byte[] truncArray = new byte[1024 * 5000];
                int bytelen = sockDofus.Receive(truncArray);
                byte[] clientData = new byte[bytelen];

                Array.Copy(truncArray, clientData, clientData.Length);
                if (bytelen < 0)
                {
                    StringBuilder hex = new StringBuilder(clientData.Length * 2);
                    foreach (byte b in clientData)
                        hex.AppendFormat("{0:x2}", b);
                    Console.WriteLine(hex);
                    clientSock.Send(clientData);
                    Console.WriteLine("2");
                }
            }

        }

    }
 

Pièces jointes

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
1 901
Reactions
38
#2
Inscrit
15 Mai 2020
Messages
11
Reactions
1
#3
Je n'ai toujours pas réussi, j'ai pris les fonctions send du code que tu as envoyé pour lire et écrire en BigEndian mais pareil, l'envois des packets ne se fais plus au bout du deuxième. Est-ce que je devrais repasser sur des sockets asycnchrone?

mon code :

C#:
        static void ClientToServer()
        {
            while (true)
            {
                if (connected != true)
                {
                    Console.WriteLine("Waiting for client to connect");
                    sock.Listen(100);
                }

                clientSock = sock.Accept();

                
                byte[] truncArray = new byte[1024 * 5000];
                int bytelen = clientSock.Receive(truncArray);
                byte[] clientData = new byte[bytelen];

                Array.Copy(truncArray, clientData, clientData.Length);

                StringBuilder hex = new StringBuilder(clientData.Length * 2);
                foreach (byte b in clientData)
                    hex.AppendFormat("{0:x2}", b);
                Console.WriteLine(hex);


                if (connected != true)
                {
                    Console.WriteLine("Client connected");
                    connected = true;
                    ipEnddofus = new IPEndPoint(System.Net.IPAddress.Parse("172.65.235.192"), 5555);
                    sockDofus = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
                    sockDofus.Connect(ipEnddofus);
                    Console.WriteLine("Connected to server");
                    Thread s = new Thread(new ThreadStart(ServerToClient));
                    s.Start();
                }
                if (bytelen > 0)
                {
                    Buffer buffer = new Buffer();
                    BigEndianReader dat = new BigEndianReader();
                    dat.Add(clientData, 0, clientData.Length);
                    buffer.Build(dat);
                    Send(buffer, sockDofus);
                    //sockDofus.Send(clientData);
                }
            }
        }
        static void ServerToClient()
        {
            while (true)
            {
                byte[] truncArray = new byte[1024 * 5000];
                int bytelen = sockDofus.Receive(truncArray);
                byte[] clientData = new byte[bytelen];

                Array.Copy(truncArray, clientData, clientData.Length);
                Buffer buffer = new Buffer();
                BigEndianReader dat = new BigEndianReader();
                dat.Add(clientData, 0, clientData.Length);
                buffer.Build(dat);

                if (bytelen > 0)
                {
                    //clientSock.Send(clientData);
                    Send(buffer, clientSock);
                }
            }

        }


        public static void Send(Buffer message, Socket socket)
        {

            BigEndianWriter writer = new BigEndianWriter();
            byte typeLen;//get the size of the size
            if (message.Data.Length > 65535)
                typeLen = 3;
            else if (message.Data.Length > 255)
                typeLen = 2;
            else if (message.Data.Length > 0)
                typeLen = 1;
            else
                typeLen = 0;

            writer.WriteShort((short)(message.MessageId << 2 | typeLen)); //write id and size of size

            switch (typeLen)//write the size
            {
                case 0:
                    break;
                case 1:
                    writer.WriteByte((byte)message.Data.Length);
                    break;
                case 2:
                    writer.WriteShort((short)message.Data.Length);
                    break;
                case 3:
                    writer.WriteByte((byte)(message.Data.Length >> 16 & 255));
                    writer.WriteShort((short)(message.Data.Length & 65535));
                    break;
            }
            writer.WriteBytes(message.Data);//write the packet after write the header
            StringBuilder hex = new StringBuilder(message.Data.Length * 2);
            foreach (byte b in message.Data)
            {
                hex.AppendFormat("{0:x2}", b);
            }
            Console.WriteLine(hex);
            
            socket.Send(writer.Data);
        }

        public void Send(byte[] data, Socket socket)
        {

            if (data.Length == 0)
            {
                return;
            }
            socket.Send(data);

        }
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
1 901
Reactions
38
#4
Laissons ceux qui prétendent savoir,
Ils n'ont rien fait, ni rien produit pour prétendre à une quelconque maitrise du domaine.
Quand on commence à dév un bot on a besoin de code simple pour débuter, le blabla qui consiste à dire oui mais faut faire comme ci comme ca sinon vous êtes des incompétents. Ce sont les memes qui commencent un bot qu ils ne finissent jamais et qu'ils n'ont jamais fait tourner.

Il faut trouver un juste milieu entre la qualité de code que tu éxiges et les aboutissement de ton programme. Quand tu ne penses qu'à la qualité de code tu ne produits rien. Les mêmes qui prétendent une maitrise du domaine pour l'utilisation de 2/3 sockets hauts niveau mais derrière ya jamais eu de programme fonctionnel.

C'est bien d' "innover" ( lol ) mais c'est aussi bien de se fixer et d'atteindre ses objectifs. Faire du joli code ça ne suffit pas, faut que ça tourne.

Sinon passe sur discord Cedex, je peux t'aider.
 
Inscrit
7 Mai 2020
Messages
5
Reactions
4
#5
Laissons ceux qui prétendent savoir,
Ils n'ont rien fait, ni rien produit pour prétendre à une quelconque maitrise du domaine.
Quand on commence à dév un bot on a besoin de code simple pour débuter, le blabla qui consiste à dire oui mais faut faire comme ci comme ca sinon vous êtes des incompétents. Ce sont les memes qui commencent un bot qu ils ne finissent jamais et qu'ils n'ont jamais fait tourner.

Il faut trouver un juste milieu entre la qualité de code que tu éxiges et les aboutissement de ton programme. Quand tu ne penses qu'à la qualité de code tu ne produits rien. Les mêmes qui prétendent une maitrise du domaine pour l'utilisation de 2/3 sockets hauts niveau mais derrière ya jamais eu de programme fonctionnel.

C'est bien d' "innover" ( lol ) mais c'est aussi bien de se fixer et d'atteindre ses objectifs. Faire du joli code ça ne suffit pas, faut que ça tourne.

Sinon passe sur discord Cedex, je peux t'aider.
Très belle parole, un gros dev de chez NVIDIA tiens le même discours et il a totalement raison.

Bon courage Cedex
 
Haut Bas