实例介绍
大学网络工程课程设计项目,可以应急,但无法用于商业
【实例简介】可以运行,需按步骤
【实例截图】
【核心代码】
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 = "此功能尚未完成"; } } }
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论