コード例 #1
0
ファイル: ArpParser.cs プロジェクト: thanhltd/sniffer
        /// <summary>
        /// Handle ARP packets
        /// </summary>
        /// <param name="packet">The EthernetDatagram</param>
        /// <param name="arp">The ArpDatagram to parse</param>
        public static void HandleARP(Packet packet, ArpDatagram arp,
                                     ref UInt64 frame_id, object[] ctrl)
        {
            ListViewItem item = new ListViewItem(frame_id.ToString());

            frame_id++;
            List <string>    packet_info = new List <string>();
            ListView         frames      = (ListView)ctrl[0];
            EthernetDatagram ethernet    = packet.Ethernet;

            packet_info.Add(packet.Timestamp.ToString("hh:mm:ss.fff tt"));
            packet_info.Add(arp.SenderProtocolIpV4Address.ToString());
            packet_info.Add(arp.TargetProtocolIpV4Address.ToString());
            packet_info.Add(ethernet.Source.ToString());
            packet_info.Add(ethernet.Destination.ToString());
            packet_info.Add("ARP");
            packet_info.Add(arp.Length.ToString());

            // update UI
            if (item != null)
            {
                item.SubItems.AddRange(packet_info.ToArray());
                object[] param = new object[2];
                param[0] = frames;
                object[] o = new object[3];
                o[0]     = item;
                o[1]     = ctrl[1];
                o[2]     = packet;
                param[1] = o;
                frames.BeginInvoke(new ParserHelper.UIHandlerEx(ParserHelper.UpdateFrameUI), param);
            }
        }
コード例 #2
0
ファイル: arpCache.cs プロジェクト: SeCra16/PacketCaputre
        private void PacketHandler(Packet packet)
        {
            ArpDatagram arp = packet.Ethernet.Arp;

            if (arp.Operation == ArpOperation.Reply)
            {
                string ipForTxt  = string.Join(".", arp.SenderProtocolAddress.Select(d => d.ToString()));
                string macForTxt = string.Join("-", arp.SenderHardwareAddress.Select(d => d.ToString("X2")));

                IPAddress       parsedIP  = IPAddress.Parse(ipForTxt);
                PhysicalAddress parsedMac = PhysicalAddress.Parse(macForTxt.ToUpper());

                if (arpTable.ContainsKey(parsedIP))
                {
                    return;
                }
                else
                {
                    // updating UI aysnc shameless stolen from from http://stackoverflow.com/questions/17631275/updating-ui-from-events-using-asyc-await
                    arpTable.Add(parsedIP, parsedMac);
                    if (this.InvokeRequired)
                    {
                        this.Invoke((MethodInvoker)(() =>
                        {
                            updateUI(parsedIP);
                        }
                                                    ));
                    }
                    else
                    {
                        updateUI(parsedIP);
                    }
                }
            }
        }
コード例 #3
0
ファイル: PacketParser.cs プロジェクト: thanhltd/sniffer
        /// <summary>
        /// Update ctrl with packet information
        /// Increment frame_id by one
        /// </summary>
        /// <param name="packet">The packet to handle</param>
        /// <param name="frame_id">The frame id, for UI display</param>
        /// <param name="ctrl">The control to display information</param>
        public static void HandlePacket(Packet packet, ref UInt64 frame_id, object[] ctrl)
        {
            EthernetDatagram ethernet = packet.Ethernet;

            if (ethernet == null)
            {
                return;
            }

            switch (ethernet.EtherType)
            {
            case EthernetType.IpV4: {
                IpV4Datagram ip = ethernet.IpV4;
                IPParser.HandleIPV4(packet, ip, ref frame_id, ctrl);
                break;
            }

            case EthernetType.Arp: {
                ArpDatagram arp = ethernet.Arp;
                ArpParser.HandleARP(packet, arp, ref frame_id, ctrl);
                break;
            }

            default:
                break;
            }
        }
コード例 #4
0
        public void ProcessARP(ArpDatagram packet)
        {
            VirtualNetwork.Instance.PostTraceMessage("ARP " + packet.Operation.ToString() + ": " + packet.SenderProtocolIpV4Address.ToString() + " looking for " + packet.TargetProtocolIpV4Address.ToString());
            if (packet.ProtocolType == EthernetType.IpV4)
            {
                if (_arp_table.ContainsKey(packet.SenderProtocolIpV4Address))
                {
                    _arp_table[packet.SenderProtocolIpV4Address] = packet.SenderHardwareAddress.ToArray().ToMacAddress();
                    VirtualNetwork.Instance.PostTraceMessage("ARP table item update: " + packet.SenderProtocolIpV4Address.ToString() + " = " + packet.SenderHardwareAddress.ToArray().ToMacAddress().ToString());
                }
                else
                {
                    _arp_table.Add(packet.SenderProtocolIpV4Address, packet.SenderHardwareAddress.ToArray().ToMacAddress());
                    VirtualNetwork.Instance.PostTraceMessage("ARP table item update: " + packet.SenderProtocolIpV4Address.ToString() + " = " + packet.SenderHardwareAddress.ToArray().ToMacAddress().ToString());
                }

                if (packet.Operation == ArpOperation.Reply && packet.SenderProtocolIpV4Address.Equals(_current_arp_probe_target_ip) && packet.TargetProtocolIpV4Address.Equals(_adapter.IP))
                {
                    _current_arp_replay_target_mac = packet.SenderHardwareAddress.ToArray().ToMacAddress();
                    _arp_resolve_wait_handle.Set();
                }

                if (packet.Operation == ArpOperation.Request && packet.TargetProtocolIpV4Address.Equals(_adapter.IP))
                {
                    SendReply(packet.SenderProtocolIpV4Address, packet.SenderHardwareAddress.ToArray().ToMacAddress());
                }
            }
        }
コード例 #5
0
        async void ReceiveResposnes()
        {
            await Task.Run(() =>
            {
                Packet pck;

                do
                {
                    if (!receiveTask)
                    {
                        return;
                    }


                    PacketCommunicatorReceiveResult result = communicator.ReceivePacket(out pck);



                    switch (result)
                    {
                    case PacketCommunicatorReceiveResult.Timeout:
                        continue;

                    case PacketCommunicatorReceiveResult.Ok:
                        {
                            if (pck.DataLink.Kind != DataLinkKind.Ethernet)
                            {
                                continue;
                            }
                            EthernetDatagram ed = pck.Ethernet;

                            if (ed.EtherType != EthernetType.Arp)
                            {
                                continue;
                            }
                            ArpDatagram arppck = ed.Arp;

                            if (arppck.Operation != ArpOperation.Reply)
                            {
                                continue;
                            }


                            NetworkHost host = new NetworkHost {
                                IP = arppck.SenderProtocolIpV4Address.ToString(), MAC = ed.Source.ToString()
                            };
                            OnCaptureHost?.Invoke(host);



                            continue;
                        }

                    default:
                        throw new InvalidOperationException("The result " + result + " shoudl never be reached here");
                    }
                } while (true);
            });
        }
コード例 #6
0
        private MacAddress ParseSenderMacFrom(Packet responce)
        {
            ArpDatagram datagram  = responce.Ethernet.Arp;
            List <byte> targetMac = datagram.SenderHardwareAddress.Reverse().ToList();

            targetMac.AddRange(new byte[] { 0, 0 });
            Int64 value = BitConverter.ToInt64(targetMac.ToArray(), 0);

            return(new MacAddress((UInt48)value));
        }
コード例 #7
0
ファイル: PacketParser.cs プロジェクト: thanhltd/sniffer
        /// <summary>
        /// Packet parser dispatcher
        /// </summary>
        /// <param name="packet">The packet to be parsed</param>
        /// <param name="ctrl">Contorls to update details with</param>
        public static void ParsePacket(Packet packet, object[] ctrl)
        {
            if (packet == null || ctrl == null ||
                ctrl[0] == null || ctrl[1] == null)
            {
                return;
            }

            EthernetDatagram ethernet = packet.Ethernet;

            List <ListViewItem> items = new List <ListViewItem>();
            ListViewItem        item  = new ListViewItem("Ethernet");
            string estr = "Etype = " + ethernet.EtherType;

            estr += ", DestinationAddress = " + ethernet.Destination;
            estr += ", SourceAddress = " + ethernet.Source;
            item.SubItems.Add(estr);
            items.Add(item);

            ListView f_details = (ListView)ctrl[0];

            f_details.Items.Clear();

            object[] param = new object[2];
            param[0] = f_details;
            param[1] = items;
            f_details.BeginInvoke(new ParserHelper.UIHandler(ParserHelper.UpdateDetailsUI), param);

            switch (ethernet.EtherType)
            {
            case EthernetType.IpV4: {
                IpV4Datagram ip = ethernet.IpV4;
                IPParser.ParseIPPacket(ip, ctrl);
                break;
            }

            case EthernetType.Arp: {
                ArpDatagram arp = ethernet.Arp;
                ArpParser.ParseARPPacket(arp, ctrl);
                break;
            }

            default:
                break;
            }


            // Save packet for layed analyze
            SnifferMain.packet = packet;
        }
コード例 #8
0
ファイル: Program.cs プロジェクト: f1r3-b1rd/NetMon
        // Packet handler
        private static void PacketHandlerArp(Packet packet)
        {
            // Console.WriteLine(packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") + " length:" + packet.Length);

            ArpDatagram arp = packet.Ethernet.Arp;

            // Populate local hardware address cache
            string senderHWAddr = BytesToString(arp.SenderHardwareAddress.ToArray());

            if (hwList.IndexOf(senderHWAddr) != -1)
            {
                hwCount[hwList.IndexOf(senderHWAddr)]++;
            }
            else
            {
                Console.WriteLine("New Address: " + senderHWAddr);
                hwList.Add(senderHWAddr);
                hwCount.Add(1);
            }
        }
コード例 #9
0
ファイル: Ethernet.cs プロジェクト: liulilittle/SkylakeNAT
 protected virtual void NetifLevel2LayerArp(EthernetDatagram datagram, ArpDatagram arp)
 {
 }
コード例 #10
0
        protected override bool CompareField(XElement field, Datagram datagram)
        {
            field.AssertNoFields();
            ArpDatagram arpDatagram = (ArpDatagram)datagram;

            switch (field.Name())
            {
            case "arp.hw.type":
                field.AssertShowDecimal((ushort)arpDatagram.HardwareType);
                break;

            case "arp.proto.type":
                field.AssertShowDecimal((ushort)arpDatagram.ProtocolType);
                break;

            case "arp.hw.size":
                field.AssertShowDecimal(arpDatagram.HardwareLength);
                break;

            case "arp.proto.size":
                field.AssertShowDecimal(arpDatagram.ProtocolLength);
                break;

            case "arp.opcode":
                field.AssertShowDecimal((ushort)arpDatagram.Operation);
                break;

            case "arp.src.hw":
            case "arp.src.hw_mac":
                field.AssertShow(arpDatagram.SenderHardwareAddress);
                break;


            case "arp.src.proto":
                field.AssertShow(arpDatagram.SenderProtocolAddress);
                break;

            case "arp.src.proto_ipv4":
                field.AssertShow(arpDatagram.SenderProtocolIpV4Address.ToString());
                break;

            case "arp.dst.hw":
            case "arp.dst.hw_mac":
                field.AssertShow(arpDatagram.TargetHardwareAddress);
                break;

            case "arp.dst.proto":
                field.AssertShow(arpDatagram.TargetProtocolAddress);
                break;

            case "arp.dst.proto_ipv4":
                field.AssertShow(arpDatagram.TargetProtocolIpV4Address.ToString());
                break;

            case "arp.isgratuitous":
            case "arp.dst.drarp_error_status":
                // TODO: Support DRARP (RFC 1931).
                break;

            default:
                throw new InvalidOperationException("Invalid arp field " + field.Name());
            }

            return(true);
        }
コード例 #11
0
ファイル: ArpParser.cs プロジェクト: thanhltd/sniffer
        /// <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]);
        }