/// <summary> /// Parse an IP packet /// Dispatch TCP and UDP packets /// </summary> /// <param name="ip">The IP packet to be parsed</param> /// <param name="ctrl"></param> public static void ParseIPPacket(IpV4Datagram ip, object[] ctrl) { if (ip == null || ctrl == null || ctrl[0] == null || ctrl[1] == null) { return; } List <ListViewItem> items = new List <ListViewItem>(); ListViewItem item = new ListViewItem("IPV4"); string estr = "Destination = " + ip.Destination; estr += ", Source = " + ip.Source; estr += ", Next Protocol = " + ip.Protocol; estr += ", Packet ID = " + ip.Identification; estr += ", Total IP length = " + ip.Length; item.SubItems.Add(estr); items.Add(item); ListView f_details = (ListView)ctrl[0]; object[] param = new object[2]; param[0] = f_details; param[1] = items; f_details.BeginInvoke(new ParserHelper.UIHandler(ParserHelper.UpdateDetailsUI), param); switch (ip.Protocol) { case IpV4Protocol.Tcp: { TcpDatagram tcp = ip.Tcp; SnifferMain.datagram = tcp; SnifferMain.payload = tcp.Payload; ParseTcpPacket(tcp, ctrl[0]); PacketParser.DumpPacket(tcp, ctrl[1]); break; } case IpV4Protocol.Udp: { UdpDatagram udp = ip.Udp; SnifferMain.datagram = udp; SnifferMain.payload = udp.Payload; ParseUdpPacket(udp, ctrl[0]); PacketParser.DumpPacket(udp, ctrl[1]); break; } default: break; } }
private void f_details_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { if (e.IsSelected) { ListViewItem item = e.Item; EthernetDatagram ethernet = packet.Ethernet; switch (item.Text) { case "Ethernet": { // Update Ethernet details if (ethernet != null) { PacketParser.DumpPacket(ethernet, h_details); } break; } case "IPV4": { // Update IPV4 details if (ethernet != null) { IpV4Datagram ip = packet.Ethernet.IpV4; PacketParser.DumpPacket(ip, h_details); } break; } case "Payload Length": { PacketParser.DumpPacket(payload, h_details); break; } default: { // Otherwise, use the last datagram PacketParser.DumpPacket(datagram, h_details); break; } } } }
/// <summary> /// Format an ARP packet /// </summary> /// <param name="arp">The ARP packet to be parsed</param> /// <param name="ctrl">Contorls to update information with /// ctrl[0] is a ListView /// ctrl[1] is a TextBox /// </param> public static void ParseARPPacket(ArpDatagram arp, object[] ctrl) { if (arp == null || ctrl == null || ctrl[0] == null || ctrl[1] == null) { return; } SnifferMain.datagram = arp; List <ListViewItem> items = new List <ListViewItem>(); ListViewItem item = new ListViewItem("Packet Type"); item.SubItems.Add("ARP"); items.Add(item); item = new ListViewItem("HardwareLength"); item.SubItems.Add(arp.HardwareLength.ToString()); items.Add(item); item = new ListViewItem("HardwareType"); item.SubItems.Add(arp.HardwareType.ToString()); items.Add(item); item = new ListViewItem("HeaderLength"); item.SubItems.Add(arp.HeaderLength.ToString()); items.Add(item); item = new ListViewItem("Operation"); item.SubItems.Add(arp.Operation.ToString()); items.Add(item); item = new ListViewItem("ProtocolLength"); item.SubItems.Add(arp.ProtocolLength.ToString()); items.Add(item); item = new ListViewItem("ProtocolType"); item.SubItems.Add(arp.ProtocolType.ToString()); items.Add(item); item = new ListViewItem("SenderHardwareAddress"); ReadOnlyCollection <byte> addr = arp.SenderHardwareAddress; string address = String.Join("-", ParserHelper.ByteToHexString(addr.ToArray())); item.SubItems.Add(address); items.Add(item); item = new ListViewItem("SenderProtocolAddress"); address = new IPAddress(arp.SenderProtocolAddress.ToArray()).ToString(); item.SubItems.Add(address); items.Add(item); item = new ListViewItem("TargetHardwareAddress"); addr = arp.TargetHardwareAddress; address = string.Join("-", ParserHelper.ByteToHexString(addr.ToArray())); item.SubItems.Add(address); items.Add(item); item = new ListViewItem("TargetProtocolAddress"); address = new IPAddress(arp.TargetProtocolAddress.ToArray()).ToString(); item.SubItems.Add(address); items.Add(item); ListView f_details = (ListView)ctrl[0]; object[] param = new object[2]; param[0] = f_details; param[1] = items; f_details.BeginInvoke(new ParserHelper.UIHandler(ParserHelper.UpdateDetailsUI), param); PacketParser.DumpPacket(arp, ctrl[1]); }
/// <summary> /// Update packet frames /// </summary> /// <param name="packet">Packet to parse</param> private void UpdateFrames(Packet packet) { PacketParser.HandlePacket(packet, ref frame_id, ctrl); }