Отправка пакетов(C#) - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Другие игры / Other games > ArcheAge

ArcheAge Раздел, посвященный ArcheAge - новой многопользовательской ролевой онлайн игре от XLGames.

Ответ
Опции темы
Непрочитано 11.03.2014, 20:42   #1
Новичок

Автор темы (Топик Стартер) Отправка пакетов(C#)

Приветствую!
Ради интереса решил написать собственный сниффер на C#(с сокетами очень мало опыта).
Нашел несколько рабочих вариантов, из них собрал что-то более-менее рабочее.
Принцип действия следующий: сокет привязывается к существующему интерфейсу, через который идет траффик, по событию BeginReceive передает принятый пакет на обработчик, внутри которого уже фильтруются и выводятся нужные мне пакеты(к примеру, по IP).

Выглядит это как-то так:

Код:
                Action<IAsyncResult> OnReceive = null;
                buffer_list = new byte[4096];


                socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
                socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
                socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.100"), 0));

                byte[] byInc1 = new byte[] { 1, 0, 0, 0 };
                byte[] byOut1 = new byte[4];
                socket.IOControl(IOControlCode.ReceiveAll, byInc1, byOut1);


                OnReceive = (ar) =>
                {
                    int nReceived = 0;
                    try
                    {
                        nReceived = socket.EndReceive(ar);
                        Print(buffer_list, nReceived);
                        buffer_list = new byte[4096];

                        socket.BeginReceive(buffer_list, 0, buffer_list.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
                    }
                    catch (Exception)
                    {
                        return;
                    }
                };

                socket.BeginReceive(buffer_list, 0, buffer_list.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
где Print - функция-обработчик(на данный момент выводит пакеты между нужными IP, логирует их и все такое).



А вопрос заключается вот в чем: как сдампленные пакеты(либо сформированные) отправить обратно по назначению?
Tezarius вне форума Ответить с цитированием
Непрочитано 12.03.2014, 02:05   #2
Пользователь

По умолчанию Re: Отправка пакетов(C#)

Дем, у тебя ус отклеился
А чтобы не возиться с tcp/ip хедерами и иметь возможность отправлять пакеты, соединение нужно устанавливать самому. Ну или ещё вариант - работать через клиент игры, но тут уже не чистый C#, а надо что-то инжектить в чужой процесс.
Ugly вне форума Ответить с цитированием
Непрочитано 12.03.2014, 02:38   #3
Аватар для WoWan-SM
Герой

По умолчанию Re: Отправка пакетов(C#)

Готовый шаблон того что тебе нужно:
http://habrahabr.ru/post/142819/

А в кратце используй готовые классы:
Socket
TcpClient
StreamReader
StreamWriter
__________________
Студия L2dev.su. Сборки Lindvior, Epilogue. ICQ 1817070. Skype wowan.sm
WoWan-SM вне форума Отправить сообщение для WoWan-SM с помощью ICQ Отправить сообщение для WoWan-SM с помощью Skype™ Ответить с цитированием
Непрочитано 12.03.2014, 08:41   #4
Аватар для MadHacker
Пользователь

По умолчанию Re: Отправка пакетов(C#)

Чтоб отправлять данные - тебе уже не сниффер нужен, а прокси.
Вот только к чему писать с нуля свой софт, когда уже есть готовый? Тот же Сауроновский WPF.
К слову и для сниффера есть готовые библиотеки.
MadHacker вне форума Ответить с цитированием
Непрочитано 12.03.2014, 09:34   #5
Пользователь

По умолчанию Re: Отправка пакетов(C#)

Вот из инета простейший SOCKS 5 прокси (в общих чертах)
качаешь Proxifier, направляешь траффик на него...там две кнопки, разберешься
и всё, твой сниффер готов, пакеты ловятся можно смотреть/выводить/отправлять/менять

Код:
delegate void PacketHandlerDelegate(ref byte[] packet, int size);
class SocksProxy
{
    public PacketHandlerDelegate ServerPacketHandler;
    public PacketHandlerDelegate ClientPacketHandler;
    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)
    {
        byte[] buffer = new byte[2048];
        Socket listener = (Socket)ar.AsyncState;
        listener.BeginAccept(listener_Accept, listener);

        Socket _in = listener.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[2] == 0)
        {
            buffer[1] = 0;
            _in.Send(buffer, 0, 2, SocketFlags.None);
            _in.Receive(buffer, 0, buffer.Length, SocketFlags.None);

            IPEndPoint remoteEndPoint = GetAddress(ref buffer);
            switch (buffer[1])
            {
                case 1:
                    _out.Connect(remoteEndPoint);
                    Console.WriteLine("Socket connected to " + remoteEndPoint);
                    break;

                case 2:
                    _out.Bind(remoteEndPoint);
                    Console.WriteLine("Socket binded to " + remoteEndPoint);
                    break;
            }

            buffer[1] = 0;
            _in.Send(buffer, 0, 10, SocketFlags.None);


            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 IPEndPoint GetAddress(ref byte[] buf)
    {
        switch (buf[3])
        {
            case 1:
                string ip = buf[4] + "." + buf[5] + "." + buf[6] + "." + buf[7];
                int port = buf[8] * 256 + buf[9];
                return new IPEndPoint(IPAddress.Parse(ip), port);

            case 3:
                byte len = buf[8];
                string host = Encoding.ASCII.GetString(buf, 9, len);
                return HostResolve(host);

            default:
                return new IPEndPoint(0, 0);
        }
    }

    private IPEndPoint HostResolve(string hostname)
    {
        IPHostEntry host = Dns.GetHostEntry(hostname);
        foreach (IPAddress ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                return new IPEndPoint(ip, 80);
            }
        }
        return new IPEndPoint(0, 0);
    }

    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));
            if (ClientPacketHandler != null)
                ClientPacketHandler(ref 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);
            if (ServerPacketHandler != null)
                ServerPacketHandler(ref 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);
        }
    }
    private 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;
        }
    }
}
Onax вне форума Ответить с цитированием
Непрочитано 12.03.2014, 20:33   #6
Новичок

Автор темы (Топик Стартер) Re: Отправка пакетов(C#)

Благодарю.
Tezarius вне форума Ответить с цитированием
Непрочитано 13.03.2014, 01:28   #7
Аватар для Nehrk
Постоялец

По умолчанию Re: Отправка пакетов(C#)

оффтоп:
Свернуть ↑Развернуть ↓
__________________
Nehrk вне форума Отправить сообщение для Nehrk с помощью ICQ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка пароля на почту stress web kilzombie Движки сайтов (CMS) 8 08.04.2013 09:50
Отправка Email SW13 Sensation Движки сайтов (CMS) 2 04.02.2013 14:14


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 13:32. Часовой пояс GMT +3.

Вверх