Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 20.02.2013, 21:38   #1
Новичок
 
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Sinn3r пока неопределено
По умолчанию

Brave, с шифрацией особо не разбирался но на сколько я знаю расшифровать RSA не зная приватного ключа практически нереально, что в принципе не особо важно ибо нужен только при авторизации. Что насчет фришек, как обстоят дела с ними? И самый главный вопрос, какие ограничения накладывает клиент, каким образом он определяет как зашифрован пакет?
Sinn3r вне форума   Ответить с цитированием
Старый 20.02.2013, 15:58   #2
Местный
 
Регистрация: 13.12.2007
Сообщений: 126
Сказал Спасибо: 10
Имеет 39 спасибок в 32 сообщенях
Zergatul
По умолчанию

Ага, расшифровывать трафик потом очень просто.
Zergatul вне форума   Ответить с цитированием
Старый 20.02.2013, 18:02   #3
Новичок
 
Регистрация: 12.01.2011
Сообщений: 16
Сказал Спасибо: 2
Имеет 0 спасибок в 0 сообщенях
Brave пока неопределено
По умолчанию

Вот в картинке нарисовал.
По синему проводу идет трафик от Сервера->Клиенту
По красному от Клиента->Серверу
По жёлтому ваше творчество.

Мне вот интересно. Если делать отправку только по жёлтому проводу, а клиент игры будет получать только результаты по синему, все ли в порядке будет с клиентом? Не кританёт от того что он получил пакет инвентаря без запроса? Мне кажется что ничего не случится, клиент это же по сути марионетка а сервер кукловод.
Миниатюры
Нажмите на изображение для увеличения
Название: SOCKS.JPG
Просмотров: 108
Размер:	6.7 Кб
ID:	2828  
Brave вне форума   Ответить с цитированием
Старый 20.02.2013, 18:24   #4
Местный
 
Регистрация: 13.12.2007
Сообщений: 126
Сказал Спасибо: 10
Имеет 39 спасибок в 32 сообщенях
Zergatul
По умолчанию

Цитата:
Сообщение от Brave Посмотреть сообщение
Мне вот интересно. Если делать отправку только по жёлтому проводу, а клиент игры будет получать только результаты по синему, все ли в порядке будет с клиентом? Не кританёт от того что он получил пакет инвентаря без запроса? Мне кажется что ничего не случится, клиент это же по сути марионетка а сервер кукловод.
Не кританет
Zergatul вне форума   Ответить с цитированием
Старый 23.02.2013, 00:42   #5
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 46
Сказал Спасибо: 0
Имеет 14 спасибок в 9 сообщенях
Deadly пока неопределено
По умолчанию

Нашел у себя в захромах этот код можно использовать как пример) это к слову как расклеивать пакеты на сервере работает с линейкой прекрасно хоть и написан криво(писался давно)) показывает размер пакета и сам пакет(не дешефруя) можете посмотреть как текут пакеты на руофе ну и 1 - 2 пакет дальше будут шифрованы
как пример может кому пригодится:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace L2_test
{
    class Program
    {
        static void Main(string[] args)
        {
            ////////////////////////////////////////////////////////////////////////////////////////////
            Socket outsoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            byte[] buf = new byte[1000];
            int ibuf;
            string port;
            string ipa = "";
            int iport = 0;
            int temp;
            NetworkStream nsout;
            //////////////////////////////////////////////////////////////////////////////////////
            Socket ssockclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ssockclient.Bind(new IPEndPoint(IPAddress.Any, 5555));
            ssockclient.Listen(100);
            Socket ss = ssockclient.Accept();
            Console.WriteLine("Запущен 1 поток "+ss.RemoteEndPoint);
            NetworkStream nsin = new NetworkStream(ss);

            ibuf = nsin.Read(buf, 0, buf.Length);
            Console.WriteLine("Принят первый пакет: 1 \n");                   
                    if (buf[0] == 5 && buf[1] == 1 && buf[2] == 0)
                    {
                        buf[0] = 5;
                        buf[1] = 0;
                        nsin.Write(buf, 0, 2);
                        Console.WriteLine("Отправлен пакет: 1 \n");
                        ibuf = nsin.Read(buf, 0, buf.Length);                         
                        Console.WriteLine("Принят пакет: 2 \n");                       
                        if (buf[3] == 1)
                        {
                            Console.WriteLine("строка содержит ип адресс \n");
                          ipa = Convert.ToString(buf[4]);
                            for (int v = 5; v < 8; v++)
                            {
                                ipa = ipa + "." + Convert.ToString(buf[v]);
                            }
                            if (buf[8] != 0)
                            {
                              port = Convert.ToString(buf[8] * 256 + buf[9]) ;
                            }
                            else
                            {
                                port = Convert.ToString(buf[9]);
                            }
                            Console.WriteLine(ipa);
                            Console.WriteLine(port);
                            iport = Convert.ToInt32(port);
                        }
                        buf[1] = 0;
                        nsin.Write(buf, 0, 10);
                        Console.WriteLine("Отправлен пакет: 2 \n");                       
                        
                    }
                    ////////////////////////////////////

                    outsoc.Connect(new DnsEndPoint(ipa, iport));
                    
                    nsout = new NetworkStream(outsoc);
        
                    
                    while (true)
                    {
                        while (nsin.DataAvailable)
                        {
                            Console.Write("\n Пакет принят от клиента\n");
                            nsin.Read(buf, 0, 2);
                            temp = (buf[0] + buf[1] * 256)-2;
                            Console.WriteLine(temp);
                            nsout.Write(buf, 0, 2);
                            ibuf = nsin.Read(buf, 0, temp);
                            for (int v = 0; v < ibuf; v++)
                                {
                                    Console.Write(buf[v] + " ");
                                }
                                Console.Write("\n");
                                
                            
                                nsout.Write(buf, 0, ibuf);
                        }

                        while (nsout.DataAvailable)
                        {
                            Console.Write("\n Пакет принят от сервера\n");
                            ibuf = nsout.Read(buf, 0, 2);
                            temp = (buf[0] + buf[1] * 256) - 2;
                            Console.WriteLine(temp);
                            nsin.Write(buf, 0, 2);
                            ibuf = nsout.Read(buf, 0, temp);
                          for (int v = 0; v < ibuf; v++)
                            {
                                Console.Write(buf[v] + " ");
                            }
                            nsin.Write(buf, 0, ibuf);
                        } 
                    
                    
                    
                    }
// проксифицировать через проксифиер или тп, протокол сокс 5)

Последний раз редактировалось Deadly, 23.02.2013 в 00:45.
Deadly вне форума   Ответить с цитированием
Старый 23.02.2013, 06:17   #6
Новичок
 
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Sinn3r пока неопределено
По умолчанию

Цитата:
Сообщение от Deadly Посмотреть сообщение
работает с линейкой прекрасно хоть и написан криво(писался давно)
Ну не совсем прекрасно, при попытке подключится к гейм серверу он перестает работать, ибо Accept для нового подключения не вызывается.

Вот мой вариант, правда никак руки не доходят пробросить делегаты для редактирования пакетов
Код:
class SocksProxy
    {
        public int Port;
        
        public SocksProxy(int port)
        {
            this.Port = port;
        }

        public void Listen()
        {
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(new IPEndPoint(IPAddress.Any, Port));
            listener.Listen(100);
            listener.BeginAccept(listener_Accept, listener);
        }

        private void listener_Accept(IAsyncResult ar)
        {
            string remoteIP = string.Empty;
            int remotePort = 0;
            byte[] buffer = new byte[2048];
            Socket temp = (Socket)ar.AsyncState;
            temp.BeginAccept(listener_Accept, temp);

            Socket _in = temp.EndAccept(ar);
            Socket _out = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            _in.Receive(buffer, 0, buffer.Length, SocketFlags.None);
            if (buffer[0] == 5 && buffer[1] == 1 && buffer[2] == 0)
            {
                buffer[1] = 0;
                _in.Send(buffer, 0, 2, SocketFlags.None);
                _in.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                if (buffer[3] == 1)
                {
                    remoteIP = buffer[4] + "." + buffer[5] + "." + buffer[6] + "." + buffer[7]; 
                    remotePort = buffer[8]*256 + buffer[9];
                    

                    Console.WriteLine("Socket connected to " + remoteIP + ":" + remotePort);
                }
                buffer[1] = 0;
                _in.Send(buffer, 0, 10, SocketFlags.None);
            }
            _out.Connect(new IPEndPoint(IPAddress.Parse(remoteIP), remotePort)); // подключаемся к серверу ла2
            NetworkState state = new NetworkState(_in, _out, buffer);
            _out.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, out_Receive, state);
            _in.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, in_Receive, state);
        }

        private void in_Receive(IAsyncResult ar) //получили пакет от клиента
        {
            NetworkState state = (NetworkState)ar.AsyncState;
            int received = state.In.EndReceive(ar);

            if (received > 0)
            {
                Console.WriteLine("{0} -> {1}", state.In.RemoteEndPoint, state.Out.RemoteEndPoint);
                Console.WriteLine(Utils.HexDump(state.Buffer, received));
                state.Out.Send(state.Buffer, 0, received, SocketFlags.None); // отправили серверу
                state.In.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, in_Receive,
                    new NetworkState(state.In, state.Out, state.Buffer));
            }
            else
            {
                state.In.Shutdown(SocketShutdown.Both);
                Console.WriteLine("{0} отключен", state.In.RemoteEndPoint);
            }
        }

        private void out_Receive(IAsyncResult ar) //получили пакет от сервера
        {
            NetworkState state = (NetworkState)ar.AsyncState;
            int received = state.Out.EndReceive(ar);

            if (received > 0)
            {
                Console.WriteLine("{0} -> {1}", state.Out.RemoteEndPoint, state.In.RemoteEndPoint);
                Console.WriteLine(Utils.HexDump(state.Buffer, received));
                state.In.Send(state.Buffer, 0, received, SocketFlags.None); // отправили проксификатору
                state.Out.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, out_Receive,
                    new NetworkState(state.In, state.Out, state.Buffer));
            }
            else
            {
                state.Out.Shutdown(SocketShutdown.Both);
                Console.WriteLine("{0} отключен", state.Out.RemoteEndPoint);
            }
        }
    }

    class NetworkState
    {
        public byte[] Buffer;
        public Socket In;
        public Socket Out;
        public NetworkState(Socket sin, Socket sout,byte[] buff)
        {
            this.Buffer = buff;
            this.In = sin;
            this.Out = sout;

        }
    }

Последний раз редактировалось Sinn3r, 23.02.2013 в 06:20. Причина: картинка
Sinn3r вне форума   Ответить с цитированием
Старый 23.02.2013, 11:35   #7
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 46
Сказал Спасибо: 0
Имеет 14 спасибок в 9 сообщенях
Deadly пока неопределено
По умолчанию

Ради интереса попробовал тоже на интерлюди у меня все работает
Зы если это серва с защитой( типо дефо) то там и не будет работать точнее дальше выбора чара вы не пройдете и с пх, тк при нажатие на кнопку принять(выбора чара) идет не форматированный трафик, а то что я скинул он берет 2 байта первых щитает размер и дальше считывает тело пакета, впринципе можно добавить на такой трафик проверку (допустим если выходи за граници 1000)это не сложно, либо поменять буфер на 100000 скажем)))






Добавлено через 22 минуты
Исправленный вариант
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace Прокси_сервер_консоль_ns
{
    class Program
    {
        static void Main(string[] args)
        {
            ////////////////////////////////////////////////////////////////////////////////////////////
            Socket outsoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            byte[] buf = new byte[100000];
            int ibuf;
            string port;
            string ipa = "";
            int iport = 0;
            int temp;
            NetworkStream nsout;
            //////////////////////////////////////////////////////////////////////////////////////
            Socket ssockclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ssockclient.Bind(new IPEndPoint(IPAddress.Any, 5555));
            ssockclient.Listen(100);
            Socket ss = ssockclient.Accept();
            Console.WriteLine("Запущен 1 поток "+ss.RemoteEndPoint);
            NetworkStream nsin = new NetworkStream(ss);

            ibuf = nsin.Read(buf, 0, buf.Length);
            Console.WriteLine("Принят первый пакет: 1 \n");                   
                    if (buf[0] == 5 && buf[1] == 1 && buf[2] == 0)
                    {
                        buf[0] = 5;
                        buf[1] = 0;
                        nsin.Write(buf, 0, 2);
                        Console.WriteLine("Отправлен пакет: 1 \n");
                        ibuf = nsin.Read(buf, 0, buf.Length);                         
                        Console.WriteLine("Принят пакет: 2 \n");                       
                        if (buf[3] == 1)
                        {
                            Console.WriteLine("строка содержит ип адресс \n");
                          ipa = Convert.ToString(buf[4]);
                            for (int v = 5; v < 8; v++)
                            {
                                ipa = ipa + "." + Convert.ToString(buf[v]);
                            }
                            if (buf[8] != 0)
                            {
                              port = Convert.ToString(buf[8] * 256 + buf[9]) ;
                            }
                            else
                            {
                                port = Convert.ToString(buf[9]);
                            }
                            Console.WriteLine(ipa);
                            Console.WriteLine(port);
                            iport = Convert.ToInt32(port);
                        }
                        buf[1] = 0;
                        nsin.Write(buf, 0, 10);
                        Console.WriteLine("Отправлен пакет: 2 \n");                       
                        
                    }
                    ////////////////////////////////////

                    outsoc.Connect(new DnsEndPoint(ipa, iport));
                    
                    nsout = new NetworkStream(outsoc);

                    int t=0;
                    while (true)
                    {
                        while (nsin.DataAvailable)
                        {
                            t++;

                            Console.Write("\n Пакет принят от клиента\n");
                            nsin.Read(buf, 0, 2);
                            temp = (buf[0] + buf[1] * 256)-2;
                            Console.WriteLine(temp);
                            nsout.Write(buf, 0, 2);
                            ibuf = nsin.Read(buf, 0, temp);
                          
                            for (int v = 0; v < ibuf; v++)
                                {
                                    Console.Write(buf[v] + " ");
                                }
                                Console.Write("\n");
                                
                            
                                nsout.Write(buf, 0, ibuf);
                        }

                        while (nsout.DataAvailable)
                        {
                            t++;
                            Console.Write("\n Пакет принят от сервера\n");
                            ibuf = nsout.Read(buf, 0, 2);
                            temp = (buf[0] + buf[1] * 256) - 2;
                            Console.WriteLine(temp);
                            nsin.Write(buf, 0, 2);
                            ibuf = nsout.Read(buf, 0, temp);
                          for (int v = 0; v < ibuf; v++)
                            {
                                Console.Write(buf[v] + " ");
                            }
                            nsin.Write(buf, 0, ibuf);
                        } 
                    
                    
                    
                    }



                   
                  
            }
        }
    }

Зы в твоем релизе все будет работь замчечательно за тем исключением что в 1 прекрасный момент пакеты "склеятся" и ты не сможешь найти где начало где конец

Последний раз редактировалось Deadly, 23.02.2013 в 11:41. Причина: Добавлено сообщение
Deadly вне форума   Ответить с цитированием
Старый 23.02.2013, 12:59   #8
Новичок
 
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Sinn3r пока неопределено
По умолчанию

Сервер на котором я проверял хукает ws2_32.send и сам коннектится к логин серверу, а коннект к гейм серверу отдает клиенту.
Выходит 2 разных подключения, следовательно должно быть 2 пары сокетов, на логин и гейм серверы.
Sinn3r вне форума   Ответить с цитированием
Старый 23.02.2013, 13:03   #9
Новичок
 
Регистрация: 12.01.2011
Сообщений: 16
Сказал Спасибо: 2
Имеет 0 спасибок в 0 сообщенях
Brave пока неопределено
По умолчанию

Цитата:
Сообщение от Sinn3r Посмотреть сообщение
Выходит 2 разных подключения, следовательно должно быть 2 пары сокетов, на логин и гейм серверы.
Так всегда же 2 разных подключения.
Brave вне форума   Ответить с цитированием
Старый 23.02.2013, 13:38   #10
Новичок
 
Регистрация: 06.12.2010
Сообщений: 18
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Sinn3r пока неопределено
По умолчанию

Brave, тогда как у него работает если ssockclient.Accept() вызывается только 1 раз?
Мой вариант понятно как работает, там ацепт вызывает себя же, но у Дедли все в одном потоке и при этом работает

Последний раз редактировалось Sinn3r, 23.02.2013 в 13:41.
Sinn3r вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 16:51.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!