在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#网络编程 → sniffer网络数据监听工具源码

sniffer网络数据监听工具源码

C#网络编程

下载此实例
  • 开发语言:C#
  • 实例大小:5.37M
  • 下载次数:86
  • 浏览次数:549
  • 发布时间:2018-09-27
  • 实例类别:C#网络编程
  • 发 布 人:紫月孤忆
  • 文件格式:.zip
  • 所需积分:0
 相关标签: sniffer C# 网络工程大作业

实例介绍

大学网络工程课程设计项目,可以应急,但无法用于商业

【实例简介】可以运行,需按步骤

【实例截图】

from clipboard

【核心代码】


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Threading;
using SharpPcap;
using SharpPcap.LibPcap;//引用SharpPcap
using System.IO;

namespace MySniffer
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();

            pktInfo = new PacketInfo(this.treeView1);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            loadDevice();//加载窗体时加载网卡
        }


        #region 定义变量
        ICaptureDevice device;// 定义设备
        List<RawCapture> packetList = new List<RawCapture>();//捕获的数据列表
        List<RawCapture> bufferList;//缓存列表
        Thread AnalyzerThread;//分析数据的线程
        object threadLock = new object();//线程锁定
        bool isStartAnalyzer;//用于表示是否启动分析线程的标志
        DeviceMode devMode = DeviceMode.Promiscuous;//数据采集模式
        int readTimeOut = 1000;
        delegate void DataGridRowsShowHandler(RawCapture packet);
        DataBuilder rowsBulider = new DataBuilder();
        PacketInfo pktInfo;
        uint packetIndex = 0;
        #endregion
        #region 获取网卡方法
        private void loadDevice()// 获取网卡方法
        {
            try
            {
                foreach (var i in CaptureDeviceList.Instance)
                {
                    comDeviceList.Items.Add(i.Name);  //在combox中添加
                }
                if (comDeviceList.Items.Count > 0)
                {
                    comDeviceList.SelectedIndex = 2;//自动选中第一个
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }
        #endregion     

        //选择网卡
        private void comDeviceList_SelectedIndexChanged(object sender, EventArgs e)
        {
            device = CaptureDeviceList.Instance[comDeviceList.SelectedIndex];
        }
        #region 按钮禁用
        private void UIConfig(bool isStart)
        {
            comDeviceList.Enabled = !isStart;
            comFilter.Enabled = !isStart;
            btnStart.Enabled = !isStart;
            btnStop.Enabled = isStart;
            btnOpen.Enabled = !isStart;
            btnSave.Enabled = !isStart;
            checkBox1.Enabled = !isStart;
            Regroup.Enabled = !isStart;
            Find.Enabled = !isStart;
        }
        #endregion
        #region 清理数据
        public void Clear()
        {
            if (packetList != null)
            {
                packetList.Clear();
            }
            if (bufferList != null)
            {
                bufferList.Clear();
            }
            dataGridPacket.Rows.Clear();
            treeView1.Nodes.Clear();
            richTextBox1.Text = "";
            packetIndex = 0;

        }
        #endregion

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            devMode = (checkBox1.Checked) ? DeviceMode.Promiscuous : DeviceMode.Normal;
        }

        #region 启动网卡
        /// <summary>
        /// 启动网卡
        /// </summary>
        private void Start()
        {
            if (device == null || device.Started)
                return;

            bufferList = new List<RawCapture>();
            Clear();//清理原有的数据
            isStartAnalyzer = true;

            StartAnalyzer();//启动分析线程

            try
            {
                device.OnPacketArrival  = new PacketArrivalEventHandler(device_OnPacketArrival);
                //默认使用混杂模式,超时 1000
                device.Open(devMode, readTimeOut);
                device.Filter = comFilter.Text;
                device.StartCapture();

                UIConfig(true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

                UIConfig(false);
            }

        }
        #endregion
        #region 启动分析
        /// <summary>
        /// 启动分析
        /// </summary>
        private void StartAnalyzer()
        {
            AnalyzerThread = new Thread(new ThreadStart(analysrThreadMethod));
            AnalyzerThread.IsBackground = true;
            AnalyzerThread.Start();

        }
        #endregion
        #region 停止
        /// <summary>
        /// 停止
        /// </summary>
        private void Stop()
        {
            try
            {
                if (device != null && device.Started)
                {
                    device.StopCapture();
                    device.Close();
                }

                isStartAnalyzer = false;
                if (AnalyzerThread != null && AnalyzerThread.IsAlive)
                {
                    AnalyzerThread.Abort();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            UIConfig(false);
        }
        #endregion
        void device_OnPacketArrival(object sender, CaptureEventArgs e)
        {
            lock (threadLock)
            {
                bufferList.Add(e.Packet);
            }
        }
        #region 数据分析线程
        //数据分析线程
        private void analysrThreadMethod()
        {
            while (isStartAnalyzer)
            {
                bool isShoudSleep = true;
                lock (threadLock)
                {
                    if (bufferList.Count != 0)
                        isShoudSleep = false;
                }
                if (isShoudSleep)//
                {
                    Thread.Sleep(200);
                }
                else
                {
                    List<RawCapture> tmpPacketList;
                    lock (threadLock) //获取数据
                    {
                        tmpPacketList = bufferList;
                        bufferList = new List<RawCapture>();//构建新列表
                        packetList.AddRange(tmpPacketList);
                    }
                    foreach (var i in tmpPacketList)
                    {
                        this.Invoke(new DataGridRowsShowHandler(ShowDataRows), i);

                    }
                }
            }
        }
        #endregion
        #region 数据显示
        private void ShowDataRows(RawCapture packet)
        {
            try
            {
                var pack = rowsBulider.Row(packet,   packetIndex);
                if ((SourceIP.Text == "" && DirectIP.Text == pack[4].Split(new char[] { ' ' })[0]) || (SourceIP.Text == pack[3].Split(new char[] { ' ' })[0] && DirectIP.Text == "") || (SourceIP.Text == pack[3].Split(new char[] { ' ' })[0] && DirectIP.Text == pack[4].Split(new char[] { ' ' })[0]) || (SourceIP.Text == "" && DirectIP.Text == ""))
                {
                    if ((ProtrocolBox.Text == ""))
                        dataGridPacket.Rows.Add(pack);//加载DataGridRows;
                    else
                    {
                        string[] a = ProtrocolBox.Text.Split(new char[] { '|' });
                        foreach (string ab in a)
                            if (ab == pack[1])
                                dataGridPacket.Rows.Add(pack);//加载DataGridRows;
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }
        #endregion
        private void btnStart_Click(object sender, EventArgs e)
        {
            Start();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            Stop();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            Stop();
        }

        private void dataGridPacket_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex == -1)
                return;
            if (e.Button == MouseButtons.Right)//右击也可选中
            {
                dataGridPacket.Rows[e.RowIndex].Selected = true;
            }
            selectDataGridRow(e.RowIndex);
        }
        #region 选中的包数据显示
        /// <summary>
        /// 选中一行
        /// </summary>
        /// <param name="index">选定的数据行索引值</param>
        private void selectDataGridRow(int index)
        {
            if (index < 0 || index > dataGridPacket.Rows.Count)
                return;
            //获取数据包位置
            int i = Convert.ToInt32(dataGridPacket.Rows[index].Cells[0].Value.ToString());
            if (i > packetList.Count)
                return;
            RawCapture rawPacket = packetList[i - 1];

            treeView1.Nodes.Clear();
            pktInfo.GetProtcolTree(rawPacket);
            richTextBox1.Text = HexConvert.ConvertToHexText(rawPacket.Data);
        }
        #endregion
        #region 保存包
        private void btnSave_Click(object sender, EventArgs e)
        {
            SaveFileDialog sd = new SaveFileDialog();
            sd.Filter = "Pcap文件|*.pcap";
            if (sd.ShowDialog() == DialogResult.OK)
            {
                var offDev = new SharpPcap.LibPcap.CaptureFileWriterDevice(sd.FileName);
                foreach (var i in packetList)
                {
                    offDev.Write(i);
                }
                MessageBox.Show("文件保存成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        #endregion
        #region 打开包
        //打开文件
        private void btnOpen_Click(object sender, EventArgs e)
        {
            OpenFileDialog od = new OpenFileDialog();
            od.Filter = "pcap文件|*.pcap";

            if (od.ShowDialog() == DialogResult.OK)
            {
                Clear();

                ICaptureDevice offDev = new CaptureFileReaderDevice(od.FileName);
                RawCapture tempPacket;
                offDev.Open();
                while ((tempPacket = offDev.GetNextPacket()) != null)
                {
                    packetList.Add(tempPacket);
                    ShowDataRows(tempPacket);
                }
                offDev.Close();

            }
        }
        #endregion
        private void dataGridPacket_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
        #region 保存包信息
        //以txt格式保存包内容
        private void Save_text_Click(object sender, EventArgs e)
        {
            if (richTextBox1.Text != "")
            {
                string fileName = "";
                if (fileName == "")
                {
                    SaveFileDialog dlgsave = new SaveFileDialog();
                    dlgsave.InitialDirectory = "c:\tmp";
                    dlgsave.Filter = "文本文件(*.txt)|*.txt|富格式文件(*.rtf)|*.rtf|所有文件(*.*)|*.*";
                    if (dlgsave.ShowDialog() == DialogResult.OK)    // 表示按下“确认”按钮
                    {
                        fileName = dlgsave.FileName;   // 得到用户指定的文件名
                        File.WriteAllText(fileName, richTextBox1.Text);
                    }
                }
                else
                {
                }
            }
        }
        #endregion

        private void Find_Click(object sender, EventArgs e)
        {
            FindN();
        }
        #region 查找指定内容
        /// <summary>
        /// 查找指定内容
        /// </summary>
        private void FindN()
        {
            string NumList = null;
            string ae = null;
            string hexOutput = null;
            string input = FindBox.Text;
            char[] values = input.ToCharArray();
            foreach (char letter in values)
            {
                int value = Convert.ToInt32(letter);
                hexOutput = hexOutput   String.Format("{0:X}", value);
            }

            uint num = 0;
            foreach (RawCapture ab in packetList)
            {
                num  ;
                bool flag = false;
                string ad = HexConvert.ConvertToHex(ab.Data);
                char[] ac = ad.ToCharArray();
                int k = 0;

                for(int j=0;j< ac.Length / 2; j  )
                if(flag==false)
                for (int i = 2*j; i < ac.Length;i  )
                {
                    if (ac[i] != ' ')
                    {
                        if (k < hexOutput.Length)
                        {
                            ae = ae   ac[i];
                            k  ;
                        }
                        else if (k == hexOutput.Length)
                        {
                            if (hexOutput.Equals(ae))
                            {                              
                                NumList  = num.ToString() ' ';
                                    flag = true;
                                break;
                            }
                            ae = null;
                            k = 0;
                            ae = ae   ac[i];
                            k  ;
                        }
                        else
                        {
                            ae = null;
                            k = 0;
                        }   
                    }                   
                }

            }
            if (NumList != null)
                richTextBox1.Text = NumList;
            else
                richTextBox1.Text = "Not Find";
        }
        #endregion

        private void Regroup_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "此功能尚未完成";
        }
    }
}


网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警