实例介绍
大学网络工程课程设计项目,可以应急,但无法用于商业
【实例简介】可以运行,需按步骤
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论