热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简易sniffer演示程序

这是网络攻防课的一次实验,完成之后简单整理一下发布到博客中。实验内容:开发出一个任意平台上的Sniffer(嗅探器)工具&#

这是网络攻防课的一次实验,完成之后简单整理一下发布到博客中。

实验内容:

开发出一个任意平台上的Sniffer(嗅探器)工具,能显示所捕获的局域网数据包并能做相应的分析和统计。主要内容如下:

列出监测主机的所有网卡,选择一个网卡,设置为混杂模式(网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。)

进行监听。捕获所有流经网卡的数据包,并利用WinPcap函数库设置过滤规则。分

析捕获到的数据包的包头和数据,按照各种协议的格式进行格式化显示。

实验环境:

 开发平台:Window 7 ~32bit

开发环境:Microsoft Visual Studio 2012

开发语言:C#

库环境:WinPcapV4.1.3、SharpPcap V4.2.0

dell文件下载地址:http://pan.baidu.com/s/1pJG4Iwj

实验设计:

本实验的目标主要是利用WinPcap开发包工具,独立开发出一个网络嗅探器。

分析整个嗅探器工作流程,首先需要获取本地网络适配器借口列表,然后需要选择适配器接口并打开,开启监听并根据过滤规则开始捕获数据包。捕获到的数据包需要实时显示在窗体控件中,并进行必要的统计。

程序流程图如下:


效果图如下:


主要功能代码实现:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;using System.IO;
using Tamir.IPLib;
using Tamir.IPLib.Packets;
using Tamir.IPLib.Protocols;
using System.Collections; namespace sniffer
{public partial class sniffer : Form{PcapDeviceList devices ;PcapDevice device ;PcapDevice device1;Packet pac;int index=1;int ipnum = 0;int icmpnum = 0;int tcpnum = 0;int udpnum = 0;int arpnum = 0;int sum = 0;private delegate void ControlDelegate(Packet packet);public struct Info{public int index1;public DateTime time1;public int len1;public int hwtype1;public int protocoltype1;public int hwaddresslength1;public int operation1;public string srcIp1;public string dstIp1;public string srchwaddress1;public string dsthwaddress1;public int srcPort1;public int dstPort1;public string pr1;public int version1;public int ipheaderlength1;public int sevicetype1;public int totallength1;public int flag1;public int fragflag1;public int livetime1;public int protocol1;public int checksum1;public long sequencenum1;public int code1;public byte[] data1;}List array = new List();public sniffer()//初始化{InitializeComponent();btnstop.Enabled = false;}private void btnstart_Click(object sender, EventArgs e)//开始按钮响应事件{btnstop.Enabled = true;btnstart.Enabled = false;if (cmb_netcard.Text == ""){MessageBox.Show("请选择网卡");btnstart.Enabled = true;btnstop.Enabled = false;}else{//打开所选网卡接口进行监听device = devices[cmb_netcard.Items.IndexOf(cmb_netcard.Text)];device1 = devices[cmb_netcard.Items.IndexOf(cmb_netcard.Text)]; int readTimeoutMillisecOnds= 1000;device.PcapOpen(true, readTimeoutMilliseconds);device1.PcapOpen(true, readTimeoutMilliseconds);if (cmb_fliter.Text.ToString() == "tcp" || cmb_fliter.Text.ToString() == "udp" || cmb_fliter.Text.ToString() == "ip" || cmb_fliter.Text.ToString() == "icmp" || cmb_fliter.Text.ToString() == "arp"){string filter = cmb_fliter.Text.ToString();device.PcapSetFilter(filter);device1.PcapSetFilter(filter);}device.PcapOnPacketArrival += device_PcapOnPacketArrival;device1.PcapOnPacketArrival += new SharpPcap.PacketArrivalEvent( device_PcapOnPacketArrivalfile);device1.PcapDumpOpen("test.pcap");device.PcapStartCapture();device1.PcapStartCapture();}}private void show_arp(Packet packet )//解析并显示统计ARP包{if (dvinfo.InvokeRequired){ControlDelegate cd = new ControlDelegate(show_arp);this.Invoke(cd, new object[] { packet }); }else{DateTime time = packet.PcapHeader.Date;int len = packet.PcapHeader.PacketLength;ARPPacket arp = (ARPPacket)packet;int hwtype = arp.ARPHwType;int protocoltype = arp.ARPProtocolType;int hwaddresslength = arp.ARPHwLength;int operation = arp.ARPOperation;string srchwaddress = arp.ARPSenderHwAddress;string dsthwaddress = arp.ARPTargetHwAddress;string srcIp = arp.ARPSenderProtoAddress;string dstIp = arp.ARPTargetProtoAddress;Info info = new Info();info.index1 = index++;info.time1 = time;info.len1 = len;info.hwtype1 = hwtype;info.protocoltype1 = protocoltype;info.hwaddresslength1 = hwaddresslength;info.operation1 = operation;info.srchwaddress1 = srchwaddress;info.dsthwaddress1 = dsthwaddress;info.srcIp1 = srcIp;info.dstIp1 = dstIp;info.pr1 = "ARP";info.data1 = arp.EthernetData;array.Add(info);string[] arr = {info.index1.ToString(),info.time1.ToString(),info.len1.ToString(),info.srcIp1,info.dstIp1,info.srcPort1.ToString(),info.dstPort1.ToString(),info.pr1 };dvinfo.Rows.Add(arr);arpnum = arpnum + 1;sum = sum + 1;tbxarp.Text = arpnum.ToString();tbxsum.Text = sum.ToString();} }private void show_tcp(Packet packet)//解析并显示统计TCP包{if (dvinfo.InvokeRequired){ControlDelegate cd = new ControlDelegate(show_tcp);this.Invoke(cd, new object[] { packet });}else{DateTime time = packet.PcapHeader.Date;int len = packet.PcapHeader.PacketLength;TCPPacket tcp = (TCPPacket)packet;int checksum = tcp.Checksum;long sequencenum = tcp.SequenceNumber; string srcIp = tcp.SourceAddress;string dstIp = tcp.DestinationAddress;int srcPort = tcp.SourcePort;int dstPort = tcp.DestinationPort;string srchwaddress = tcp.SourceHwAddress;string dsthwaddress = tcp.DestinationHwAddress;Info info = new Info();info.index1 = index++;info.time1 = time;info.len1 = len;info.checksum1 = checksum;info.sequencenum1 = sequencenum;info.srcIp1 = srcIp;info.srcPort1 = srcPort;info.dstIp1 = dstIp;info.dstPort1 = dstPort;info.srchwaddress1 = srchwaddress;info.dsthwaddress1 = dsthwaddress;info.pr1 = "TCP";info.data1 = tcp.TCPData;array.Add(info);string[] arr = { info.index1.ToString(), info.time1.ToString(), info.len1.ToString(), info.srcIp1, info.dstIp1, info.srcPort1.ToString(), info.dstPort1.ToString(), info.pr1 };dvinfo.Rows.Add(arr);tcpnum = tcpnum + 1;sum = sum + 1;tbxtcp.Text = tcpnum.ToString();tbxsum.Text = sum.ToString();}}private void show_udp(Packet packet)//解析并显示统计UDP包{if (dvinfo.InvokeRequired){ControlDelegate cd = new ControlDelegate(show_udp);this.Invoke(cd, new object[] { packet });}else{DateTime time = packet.PcapHeader.Date;int len = packet.PcapHeader.PacketLength;UDPPacket udp = (UDPPacket)packet;int checksum = udp.Checksum;string srchwaddress = udp.SourceHwAddress;string dsthwaddress = udp.DestinationHwAddress;string srcIp = udp.SourceAddress;string dstIp = udp.DestinationAddress;int srcPort = udp.SourcePort;int dstPort = udp.DestinationPort;Info info = new Info();info.index1 = index++;info.time1 = time;info.len1 = len;info.checksum1 = checksum;info.srchwaddress1 = srchwaddress;info.dsthwaddress1 = dsthwaddress;info.srcIp1 = srcIp;info.srcPort1 = srcPort;info.dstIp1 = dstIp;info.dstPort1 = dstPort;info.pr1 = "UDP";info.data1 = udp.UDPData;array.Add(info);string[] arr = { info.index1.ToString(), info.time1.ToString(), info.len1.ToString(), info.srcIp1, info.dstIp1, info.srcPort1.ToString(), info.dstPort1.ToString(), info.pr1 };dvinfo.Rows.Add(arr);udpnum = udpnum + 1;sum = sum + 1;tbxudp.Text = udpnum.ToString();tbxsum.Text = sum.ToString();}}private void show_ip(Packet packet)//解析并显示统计IP包{if (dvinfo.InvokeRequired){ControlDelegate cd = new ControlDelegate(show_ip);this.Invoke(cd, new object[] { packet });}else{DateTime time = packet.PcapHeader.Date;int len = packet.PcapHeader.PacketLength;IPPacket ip = (IPPacket)packet;int version = ip.Version;int ipheadlength = ip.IpHeaderLength;int sevicetype = ip.TypeOfService;int totallength = ip.IPTotalLength;int flag = ip.FragmentOffset;int fragflag = ip.FragmentFlags;int livetime = ip.TimeToLive;int protocol = ip.IPProtocol;int checksum = ip.IPChecksum;string srcIp = ip.SourceAddress;string dstIp = ip.DestinationAddress;string srchwaddress = ip.SourceHwAddress;string dsthwaddress = ip.DestinationHwAddress;Info info=new Info();info.index1 = index++;info.time1 = time;info.len1 = len;info.version1 = version;info.ipheaderlength1 = ipheadlength;info.sevicetype1 = sevicetype;info.totallength1 = totallength;info.flag1 = flag;info.fragflag1 = fragflag;info.livetime1 = livetime;info.protocol1 = protocol;info.checksum1 = checksum;info.srcIp1 = srcIp;info.dstIp1 = dstIp;info.srchwaddress1 = srchwaddress;info.dsthwaddress1 = dsthwaddress;info.pr1 = "IP";info.data1 = ip.IPData;array.Add(info);string[] arr = { info.index1.ToString(), info.time1.ToString(), info.len1.ToString(), info.srcIp1, info.dstIp1, info.srcPort1.ToString(), info.dstPort1.ToString(), info.pr1 };dvinfo.Rows.Add(arr);ipnum = ipnum + 1;sum = sum + 1;tbxip.Text = ipnum.ToString();tbxsum.Text = sum.ToString();}}private void show_icmp(Packet packet)//解析并显示统计ICMP包{if (dvinfo.InvokeRequired){ControlDelegate cd = new ControlDelegate(show_icmp);this.Invoke(cd, new object[] { packet });}else{DateTime time = packet.PcapHeader.Date;int len = packet.PcapHeader.PacketLength;ICMPPacket icmp = (ICMPPacket)packet;int sevice = icmp.TypeOfService;int checksum = icmp.ICMPChecksum;int code = icmp.MessageCode;string srcIp = icmp.SourceAddress;string dstIp = icmp.DestinationAddress;string srchwaddress = icmp.SourceHwAddress;string dsthwaddress = icmp.DestinationHwAddress;Info info = new Info();info.index1 = index++;info.time1 = time;info.len1 = len;info.sevicetype1 = sevice;info.checksum1 = checksum;info.code1 = code;info.srcIp1 = srcIp;info.dstIp1 = dstIp;info.srchwaddress1 = srchwaddress;info.dsthwaddress1 = dsthwaddress;info.pr1 = "ICMP";info.data1 = icmp.ICMPData;array.Add(info);string[] arr = { info.index1.ToString(), info.time1.ToString(), info.len1.ToString(), info.srcIp1, info.dstIp1, info.srcPort1.ToString(), info.dstPort1.ToString(), info.pr1 };dvinfo.Rows.Add(arr);icmpnum = icmpnum + 1;sum = sum + 1;tbxicmp.Text = icmpnum.ToString();tbxsum.Text = sum.ToString();}}void device_PcapOnPacketArrival(object sender, Packet packet)//抓包{if (packet is ARPPacket){show_arp(packet);}if (packet is TCPPacket){show_tcp(packet);}if (packet is IPPacket){show_ip(packet);}if (packet is UDPPacket){show_udp(packet);}if (packet is ICMPPacket){show_icmp(packet);}}private static void device_PcapOnPacketArrivalfile(object sender, Packet packet)//抓包存入文件{ PcapDevice device = (PcapDevice)sender;//if device has a dump file openedif( device.PcapDumpOpened ){//dump the packet to the filedevice.PcapDump( packet );Console.WriteLine("Packet dumped to file.");}}private void btnstop_Click(object sender, EventArgs e)//停止按钮响应事件{device.PcapOnPacketArrival -= device_PcapOnPacketArrival;device1.PcapOnPacketArrival -= device_PcapOnPacketArrivalfile;btnstart.Enabled = true;btnstop.Enabled = false;}private void btnsave_Click(object sender, EventArgs e)//保存按钮响应事件{SaveFileDialog sfile = new SaveFileDialog();if (sfile.ShowDialog() == DialogResult.OK){string fileName = sfile.FileName;File.Copy("test.pcap", (fileName+".pcap"));}}private void btnread_Click(object sender, EventArgs e)//读取按钮响应事件{OpenFileDialog ofile = new OpenFileDialog();if (ofile.ShowDialog() == DialogResult.OK){PcapDevice device2 = SharpPcap.GetPcapOfflineDevice(ofile.FileName);int readTimeoutMillisecOnds= 1000;device2.PcapOpen(true, readTimeoutMilliseconds);device2.PcapOnPacketArrival += device_PcapOnPacketArrival;device2.PcapStartCapture();}}private void sniffer_Load(object sender, EventArgs e)//窗体加载后初始化{getnetcard();flitershow();}void getnetcard() //获取网卡列表并显示{devices = SharpPcap.GetAllDevices();// If no devices were found print an errorif (devices.Count <1){MessageBox.Show("No devices were found on this machine");return;}// Print out the available network devicesforeach (PcapDevice dev in devices)cmb_netcard.Items.Add(dev.PcapName.ToString());//cmb_netcard.Items.Add(dev.PcapDescription.ToString());}void flitershow() //显示过滤规则{cmb_fliter.Items.Add("不过滤");cmb_fliter.Items.Add("tcp");cmb_fliter.Items.Add("udp");cmb_fliter.Items.Add("ip");cmb_fliter.Items.Add("icmp");cmb_fliter.Items.Add("arp");}private void sniffer_FormClosed(object sender, FormClosedEventArgs e)//窗口关闭响应事件{Application.Exit();}private void dvinfo_SelectionChanged(object sender, EventArgs e)//选中行改变触发事件{tvinfo.Nodes.Clear();rtbinfo.Text = "";rtxinfo2.Text = "";List ch=new List();Liststr=new List();for (int a = 0; a 0)ch1 = (char)ints;elsech1=&#39;.&#39;;ch.Add(ch1);String strA = array[dvinfo.CurrentRow.Index].data1[a].ToString("x2");str.Add(strA); }for (int a = 0; a }
完整项目代码下载:

点击打开链接


推荐阅读
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
author-avatar
闲云野鹤-男主角_185
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有