基本信息
源码名称:sniffer网络数据监听工具源码
源码大小:5.37M
文件格式:.zip
开发语言:C#
更新时间:2018-09-27
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
大学网络工程课程设计项目,可以应急,但无法用于商业
可以运行,需按步骤
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 = "此功能尚未完成"; } } }