基本信息
源码名称: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 = "此功能尚未完成";
}
}
}