• C#使用sharppcap实现网络抓包


    sharppcap dll的下载地址:

    http://sourceforge.net/directory/os:windows/?q=sharppcap

    具体使用详细步骤:

    http://www.codeproject.com/KB/IP/sharppcap.aspx 

    详细使用-------实例wrapper类
    using System.Collections.Generic;
    using System.Text;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;
    using SharpPcap;
    using PacketDotNet;
    using SharpPcap.LibPcap;

    namespace ServerToolCapture
    {
        public class WinCapHelper
        {
            private static object syncObj = new object();
            private static WinCapHelper _capInstance;
            public static WinCapHelper WinCapInstance
            {
                get
                {
                    if (null == _capInstance)
                    {
                        lock (syncObj)
                        {
                            if (null == _capInstance)
                            {
                                _capInstance = new WinCapHelper();
                            }
                        }
                    }
                    return _capInstance;
                }
            }
            private Thread _thread;

            /// <summary>  
            /// when get pocket,callback  
            /// </summary>  
            public Action<string> _logAction;

            /// <summary>  
            /// 过滤条件关键字  
            /// </summary>  
            public string filter;

            private WinCapHelper()
            {
            }

            public void Listen()
            {
                if (_thread != null && _thread.IsAlive)
                {
                    return;
                }
                _thread = new Thread(new ThreadStart(() =>
                {
                    ////遍历网卡  
                    foreach (PcapDevice device in SharpPcap.CaptureDeviceList.Instance)
                    {
                        ////分别启动监听,指定包的处理函数  
                        device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
                        device.Open(DeviceMode.Normal, 1000);
                        device.Capture(500);
                        //device.StartCapture();  
                    }
                }));
                _thread.Start();
            }

            /// <summary>  
            /// 打印包信息,组合包太复杂了,所以直接把hex字符串打出来了  
            /// </summary>  
            /// <param name="str"></param>  
            /// <param name="p"></param>  
            private void PrintPacket(ref string str, Packet p)
            {
                if (p != null)
                {
                    string s = p.ToString();
                    if (!string.IsNullOrEmpty(filter) && !s.Contains(filter))
                    {
                        return;
                    }
                    str += " " + s + " ";
                    ////尝试创建新的TCP/IP数据包对象,  
                    ////第一个参数为以太头长度,第二个为数据包数据块  
                    str += p.PrintHex() + " ";
                }
            }

            /// <summary>  
        /// 接收到包的处理函数  
        /// </summary>  
        /// <param name="sender"></param>  
        /// <param name="e"></param>  
        private void device_OnPacketArrival(object sender, CaptureEventArgs e)
        {
           ////解析出基本包  
           var packet = PacketDotNet.Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
           ////协议类别  
           // var dlPacket = PacketDotNet.DataLinkPacket.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);  
           //var ethernetPacket = PacketDotNet.EthernetPacket.GetEncapsulated(packet);  
           //var internetLinkPacket = PacketDotNet.InternetLinkLayerPacket.Parse(packet.BytesHighPerformance.Bytes);  
           //var internetPacket = PacketDotNet.InternetPacket.Parse(packet.BytesHighPerformance.Bytes); 
           //var sessionPacket = PacketDotNet.SessionPacket.Parse(packet.BytesHighPerformance.Bytes);  
           //var appPacket = PacketDotNet.ApplicationPacket.Parse(packet.BytesHighPerformance.Bytes);  
           //var pppoePacket = PacketDotNet.PPPoEPacket.Parse(packet.BytesHighPerformance.Bytes); 
           //var arpPacket = PacketDotNet.ARPPacket.GetEncapsulated(packet);  
           //var ipPacket = PacketDotNet.IpPacket.GetEncapsulated(packet); //ip包  
           //var udpPacket = PacketDotNet.UdpPacket.GetEncapsulated(packet);  
           //var tcpPacket = PacketDotNet.TcpPacket.GetEncapsulated(packet);  
           string ret = "";
           PrintPacket(ref ret, packet);
           //ParsePacket(ref ret, ethernetPacket);  
           //ParsePacket(ref ret, internetLinkPacket);  
           //ParsePacket(ref ret, internetPacket);  
           //ParsePacket(ref ret, sessionPacket);  
           //ParsePacket(ref ret, appPacket);  
           //ParsePacket(ref ret, pppoePacket);  
           //ParsePacket(ref ret, arpPacket);  
           //ParsePacket(ref ret, ipPacket);  
           //ParsePacket(ref ret, udpPacket);  
           //ParsePacket(ref ret, tcpPacket);  
           if (!string.IsNullOrEmpty(ret))
            {
                    string rlt = " 时间 : " +
                        DateTime.Now.ToLongTimeString() +
                        " 数据包: " + ret;
                    _logAction(rlt);
                }
            }
            
            public void StopAll()
            {
                foreach (PcapDevice device in SharpPcap.CaptureDeviceList.Instance)
                {
                    if (device.Opened)
                    {
                        Thread.Sleep(500);
                        device.StopCapture();
                    }
                    _logAction("device : " + device.Description + " stoped. ");
                }
                _thread.Abort();
            }
        }
    }
     
     
  • 相关阅读:
    获取华为OID
    win10 mongodb的安装
    第一次使用plotly画图遇到的问题
    Java Serialable序列化
    yield(),sleep(),join()
    线程的启动的两种方法,Runnable接口,run()的调用
    Thread的中断机制
    Oracle VM VirtualBox 修改备份位置
    潜在因子算法
    Linux--常用命令
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/5622626.html
Copyright © 2020-2023  润新知