Показать сообщение отдельно
Непрочитано 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 вне форума Ответить с цитированием