基本信息
源码名称:抓包 程序 实例源码下载
源码大小:0.74M
文件格式:.rar
开发语言:C#
更新时间:2014-07-11
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍
WinPcap过滤表达式检验程序

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using PacketDotNet;
using SharpPcap;
using SharpPcap.AirPcap;
using SharpPcap.LibPcap;
using SharpPcap.WinPcap;

namespace GetNetPackage
{
    public partial class Form1 : Form
    {
        private delegate void _CrossSetDataTable(Int64 iSqe, DateTime dtTime, string sSource, ushort sSourcePort, string sDestination, ushort sDesPort, string sProtocol);

        bool isRun = false;
        ClsPackageCache clsPkgCache = new ClsPackageCache();
        object objLock = new object();
        Int64 iPackageCount;

        DataTable dtPackage = new DataTable();
        struct StrPackage
        {
            public DateTime Time;
            //public string Source;
            //public string Destination;
            public ushort SourcePort;
            public ushort DesPort;
            public int Length;
            public Packet Packet;
            //public MyEthernetPacket ePacket;
            public MyIpPacket ipPacket;
            public MyTCPPacket tcpPacket;
            public MyUDPPacket udpPacket;
            public string  Protocols;
        }
        Dictionary<Int64, StrPackage> lstPackage = new Dictionary<Int64, StrPackage>();

        public Form1()
        {
            InitializeComponent();

            dtPackage.Columns.Add("Sqe", typeof(Int64) );
            dtPackage.Columns.Add("Time", typeof(DateTime));
            dtPackage.Columns.Add("Source");
            dtPackage.Columns.Add("SourcePort");
            dtPackage.Columns.Add("Destination");
            dtPackage.Columns.Add("DesPort");
            dtPackage.Columns.Add("Protocol");
            bdsPackage.DataSource = dtPackage;
        }

        private void CrossSetDataTable(Int64 iSqe, DateTime dtTime, string sSource, ushort sSourcePort, string sDestination, ushort sDesPort, string sProtocol)
        {
            _CrossSetDataTable SetText = delegate(Int64 Sqe, DateTime Time, string Source, ushort SourcePort, string Destination, ushort DesPort, string Protocol)
            {
                this.dtPackage.Rows.Add(new object[] { Sqe, Time, Source, SourcePort, Destination, DesPort, Protocol });
            };
            this.Invoke(SetText, new object[] { iSqe, dtTime, sSource, sSourcePort, sDestination, sDesPort, sProtocol });            
        }

        private void Ini()
        {
            iPackageCount = 0;
            lstPackage.Clear();
            dtPackage.Rows.Clear();
            txtPackageData.Text = string.Empty;
            hexEditor1.LoadFromFile(new byte[0]);
            dgvPackage.Sort(Column1, ListSortDirection.Descending);
        }

        private void EnableControl(bool state)
        {
            tscbxDeviceLst.Enabled = !isRun;
            tsbtnOpen.Enabled = !isRun;
            tstxtFilter.Enabled = !isRun;
            tsbtnClose.Enabled = isRun;
        }

        void PackageAna()
        {
            RawCapture rawCapture = clsPkgCache.GetAndRemoveFrist();
            if (rawCapture == null)
                return;

            iPackageCount  ;
            StrPackage strPackage = new StrPackage();

            strPackage.Time = rawCapture.Timeval.Date.ToLocalTime();
            strPackage.Length = rawCapture.Data.Length;

            PacketDotNet.Packet tempPacket = PacketDotNet.Packet.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data);
            strPackage.Packet = tempPacket;

            //PacketDotNet.EthernetPacket ePacket = (PacketDotNet.EthernetPacket)PacketDotNet.EthernetPacket.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data);   
            //if (ePacket != null)
            //{
            //    strPackage.ePacket = new MyEthernetPacket(ePacket);
            //    strPackage.Protocols  = ePacket.Type.ToString()   "| ";

            //    //CrossSetDataTable(iPackageCount, strPackage.Time, ePacket.SourceHwAddress.ToString(), ePacket.DestinationHwAddress.ToString(), ePacket.Type.ToString());
            //}

            IpPacket ipPack = PacketDotNet.IpPacket.GetEncapsulated(tempPacket);
            if (ipPack != null)
            {
                strPackage.Protocols  = ipPack.Protocol.ToString()   "| ";
                strPackage.ipPacket = new MyIpPacket(ipPack);

                if (ipPack.Protocol.ToString() == "TCP")
                {
                    PacketDotNet.TcpPacket tcppacket = TcpPacket.GetEncapsulated(tempPacket);
                    if (tcppacket != null)
                    {
                        strPackage.tcpPacket = new MyTCPPacket(tcppacket);
                        strPackage.SourcePort = tcppacket.SourcePort;           // 80, 8080, 3128: Http; 21: FTP; 25: SMTP; 110: POP3
                        strPackage.DesPort = tcppacket.DestinationPort;
                    }

                }
                else if (ipPack.Protocol.ToString() == "UDP")
                {
                    PacketDotNet.UdpPacket udppacket = UdpPacket.GetEncapsulated(tempPacket);
                    if (udppacket != null)
                    {
                        strPackage.udpPacket = new MyUDPPacket(udppacket);
                        strPackage.SourcePort = udppacket.SourcePort;           // 53: DNS
                        strPackage.DesPort = udppacket.DestinationPort;
                    }
                }

                CrossSetDataTable(iPackageCount, strPackage.Time, ipPack.SourceAddress.ToString(), strPackage.SourcePort,
                    ipPack.DestinationAddress.ToString(), strPackage.DesPort, ipPack.Protocol.ToString());
                lstPackage.Add(iPackageCount, strPackage);
            }
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            tscbxDeviceLst.ComboBox.DisplayMember = "Text";
            tscbxDeviceLst.ComboBox.ValueMember = "Value";

            CaptureDeviceList deviceLst = CaptureDeviceList.Instance;
            foreach (ICaptureDevice dev in deviceLst)
            {
                if (dev is AirPcapDevice)
                {
                    Console.WriteLine(dev.ToString());
                }
                else if (dev is WinPcapDevice)
                {
                    ClsComboboxItem clsCbxItem = new ClsComboboxItem();
                    clsCbxItem.Text = ((WinPcapDevice)dev).Interface.FriendlyName   "  "   dev.Description.Split('\'')[1];
                    clsCbxItem.Value = dev;
                    tscbxDeviceLst.ComboBox.Items.Add(clsCbxItem);
                }
                else if (dev is LibPcapLiveDevice)
                {
                    Console.WriteLine(dev.ToString());
                }               
            }
        }

        private void tsbtnOpen_Click(object sender, EventArgs e)
        {
            if (tscbxDeviceLst.SelectedItem != null)
            {
                // 历史记录初始化
                Ini();

                ICaptureDevice Dev = ((ClsComboboxItem)tscbxDeviceLst.SelectedItem).Value;
                Dev.OnPacketArrival  = new PacketArrivalEventHandler(Dev_OnPacketArrival);

                Dev.Open();
                Dev.Filter = tstxtFilter.Text;
                Dev.StartCapture();

                isRun = true;
                bgwPackageAna.RunWorkerAsync();
                EnableControl(true);
            }
        }

        private void tsbtnClose_Click(object sender, EventArgs e)
        {            
            ICaptureDevice Device = ((ClsComboboxItem)tscbxDeviceLst.SelectedItem).Value;
            Device.StopCapture();
            Device.Close();

            isRun = false;
            tsbtnClose.Enabled = false;
            
        }

        void Dev_OnPacketArrival(object sender, CaptureEventArgs e)
        {
            lock (objLock)
            {
                clsPkgCache.AddItem(e.Packet);
            }
        }


        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (isRun)
            {
                tsbtnClose_Click(null, null);
            }
        }

        private void bgwPackageAna_DoWork(object sender, DoWorkEventArgs e)
        {
            while(isRun || clsPkgCache.GetCount() >0 )
            {
                PackageAna();
                Thread.Sleep(50);
            }
        }

        private void bgwPackageAna_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            EnableControl(false);
        }

        private void dgvPackage_CurrentCellChanged(object sender, EventArgs e)
        {
            if (dgvPackage.CurrentCell != null)
            {
                StrPackage sp;
                lstPackage.TryGetValue((Int64)dgvPackage[0, dgvPackage.CurrentCell.RowIndex].Value, out sp);
                if (sp.Packet != null)
                {
                    hexEditor1.LoadFromFile(sp.Packet.Bytes);
                    txtPackageData.Text = sp.Packet.PrintHex();
                }
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            lblPackageCacheCount.Text = clsPkgCache.GetCount().ToString();
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            Ini();
        }







    }
}