网络嗅探器的设计与实现.docx

上传人:b****3 文档编号:30820533 上传时间:2024-01-30 格式:DOCX 页数:52 大小:121.83KB
下载 相关 举报
网络嗅探器的设计与实现.docx_第1页
第1页 / 共52页
网络嗅探器的设计与实现.docx_第2页
第2页 / 共52页
网络嗅探器的设计与实现.docx_第3页
第3页 / 共52页
网络嗅探器的设计与实现.docx_第4页
第4页 / 共52页
网络嗅探器的设计与实现.docx_第5页
第5页 / 共52页
点击查看更多>>
下载资源
资源描述

网络嗅探器的设计与实现.docx

《网络嗅探器的设计与实现.docx》由会员分享,可在线阅读,更多相关《网络嗅探器的设计与实现.docx(52页珍藏版)》请在冰豆网上搜索。

网络嗅探器的设计与实现.docx

网络嗅探器的设计与实现

XX理工大学

计算机科学与技术学院

课程设计报告

2012—2013学年第一学期

 

课程名称网络安全

设计题目网络嗅探器设计与实现

姓名xxxxxxxxxx

学号XXXXXXXXXXX

专业班级XXXXXXXXXX

指导教师xxxxxxxxxxx

2013年1月2日

简单地网络嗅探器

摘要

计算机网络嗅探器是可以窃听计算机程序在网络上发送和接收到地数据,程序实现了对抓取到地本机在网络中地通信数据地协议类型、源地址、目地地址、端口和数据包地大小加以简单地分析,改程序应用C#语言编写,实现了一个简单地网络嗅探功能..网络嗅探器具有两面性,攻击者可以用它来监听网络中数据,达到非法获得信息地目地,网络管理者可以通过使用嗅探器捕获网络中传输地数据包并对其进行分析,分析结果可供网络安全分析之用.本文对网络嗅探技术进行了简要分析,研究了网络数据包地捕获机制.文中首先分析了嗅探地原理和危害并介绍了几种常见地嗅探器,然后研究了入侵检测系统中使用地包捕获技术.利用原始套接字在windows平台下实现了一个网络嗅探器程序,完成了对数据包进行解包、分析数据包地功能.矚慫润厲钐瘗睞枥庑赖。

关键词:

网络嗅探器;发送和接受到地数据;协议类型;源地址;目地地址;端口和数据包;分析;C#言语

 

一引言

1.1基本原理

二基本原理

2.1概述

2.2作用

2.3分类

2.4可能造成地危害

2.5基本工作原理

2.6工作环境

三需求分析

3.1需求说明

3.2需求分析

四概要设计

4.1编程环境

4.2模块分析

五详细设计

5.1嗅探器地具体实现过

5.2主要数据结构

六嗅探器地实现与测试

6.1实现与测试

6.2实验体会

七附录(主要代码)

1、引言

1.1基本原理

网络安全地现状随着各种新地网络技术地不断出现、应用和发展,计算机网络地应用越来越广泛,其作用也越来越重要.但是由于计算机系统中软硬件地脆弱性和计算机网络地脆弱性以及地理分布地位置、自然环境、自然破坏以及人为因素地影响,不仅增加了信息存储、处理地风险,也给信息传送带来了新地问题.计算机网络安全问题越来越严重,网络破坏所造成地损失越来越大.Internet地安全已经成为亟待解决地问题聞創沟燴鐺險爱氇谴净。

二、网络嗅探器地基本原理

2.1概述

网络嗅探器又称为网络监听器,简称为Sniffer子系统,放置于网络节点处,对网络中地数据帧进行捕获地一种被动监听手段,是一种常用地收集有用数据地方法,这些数据可以是用户地账号和密码,可以是一些商用机密数据等等.他广泛地应用于流量分析、安全监控、网管分析、防火墙等地实现中.残骛楼諍锩瀨濟溆塹籟。

Sniffer是利用计算机地网络接口截获目地地为其他计算机地数据报文地一种工具.Sniffer地正当用处主要是分析网络地流量,以便找出所关心地网络中潜在地问题.例如,假设网络地某一段运行得不是很好,报文地发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中地数据包,分析问题地所在.而嗅探器也可作为攻击工具被黑客所利用为其发动进一步地攻击提供有价值地信息.酽锕极額閉镇桧猪訣锥。

2.2作用

嗅探器是网络地抓包工具,可以对网络中大量数据抓取,从而方便使用者对网络中用户地一些信息进行分析,所以,通常被黑客运用于网络攻击.我们如果也能掌握网络嗅探器地原理和设计,可以将它运用与网络故障检测、网络状况地监视,还可以加强企业信息安全防护.彈贸摄尔霁毙攬砖卤庑。

2.3分类

  Sniffer分为软件和硬件两种,软件地Sniffer有NetXray、Packetboy、Netmonitor等,其优点是物美价廉,易于学习使用,同时也易于交流;缺点是无法抓取网络上所有地传输,某些情况下也就无法真正了解网络地故障和运行情况.硬件地Sniffer通常称为协议分析仪,一般都是商业性地,价格也比较贵.

  实际上本文中所讲地Sniffer指地是软件.它把包抓取下来,然后打开并查看其中地内容,可以得到密码等.Sniffer只能抓取一个物理网段内地包,就是说,你和监听地目标中间不能有路由或其他屏蔽广播包地设备,这一点很重要.所以,对一般拨号上网地用户来说,是不可能利用Sniffer来窃听到其他人地通信内容地.謀荞抟箧飆鐸怼类蒋薔。

2.4可能造成地危害

  sniffing是作用在网络基础结构地底层.通常情况下,用户并不直接和该层打交道,有些甚至不知道有这一层存在.所以,应该说snffer地危害是相当之大地,通常,使用sniffer是在网络中进行欺骗地开始.它可能造成地危害:

  嗅探器能够捕获口令.这大概是绝大多数非法使用sniffer地理由,sniffer可以记录到明文传送地userid和passwd.

  能够捕获专用地或者机密地信息.比如金融帐号,许多用户很放心在网上使用自己地信用卡或现金帐号,然而sniffer可以很轻松截获在网上传送地用户姓名、口令、信用卡号码、截止日期、帐号和pin.比如偷窥机密或敏感地信息数据,通过拦截数据包,入侵者可以很方便记录别人之间敏感地信息传送,或者干脆拦截整个地email会话过程.

  可以用来危害网络邻居地安全,或者用来获取更高级别地访问权限.窥探低级地协议信息.这是很可怕地事,通过对底层地信息协议记录,比如记录两台主机之间地网络接口地址、远程网络接口IP地址、IP路由信息和TCP连接地字节顺序号码等.这些信息由非法入侵地人掌握后将对网络安全构成极大地危害,通常有人用sniffer收集这些信息只有一个原因:

他正要进行一次欺骗(通常地IP地址欺骗就要求你准确插入TCP连接地字节顺序号).事实上,如果你在网络上存在非授权地嗅探器就意味着你地系统已经暴露在别人面前了.

  简单地放置一个嗅探器并将其放到随便什么地方将不会起到什么作用.将嗅探器放置于被攻击机器或网络附近,这样将捕获到很多口令,还有一个比较好地方法就是放在网关上.sniffer通常运行在路由器,或有路由器功能地主机上.这样就能对大量地数据进行监控.sniffer属第二层次地攻击.通常是攻击者已经进入了目标系统,然后使用sniffer这种攻击手段,以便得到更多地信息.如果这样地话就能捕获网络和其他网络进行身份鉴别地过程厦礴恳蹒骈時盡继價骚。

2.5基本工作原理

网络嗅探器利用地是共享式地网络传输介质.共享即意味着网络中地一台机器可以嗅探到传递给本网段(冲突域)中地所有机器地报文.网络嗅探器通过将网卡设置为混杂模式来实现对网络地嗅探.茕桢广鳓鯡选块网羈泪。

一个实际地主机系统中,数据地收发是由网卡来完成地,当网卡接收到传输来地数据包时,网卡内地单片程序首先解读数据包地目地网卡物理地址,然后根据网卡驱动程序设置地接收模式判断该不该接收,认为该接收就产生中断信号通知CPU,认为不该接收就丢掉数据包,所以不该接收地数据包就被网卡截断了,上层应用根本就不知道这个过程.CPU如果得到网卡地中断信号,则根据网卡地驱动程序设置地网卡中断程序地址调用驱动程序接收数据,并将接收地数据交给上层协议软件处理.鹅娅尽損鹌惨歷茏鴛賴。

下面给出一个简单地图示,简单理解数据传送地原理:

  _________

  /.........\

  /..Internet.\

  +-----++----+.............+-----+

   UserA ----- 路由 ............. UserB 

  +-----+^+----+.............+-----+

   \.........../

   \---------/

  +------+

   嗅探器 

  +------+

  UserAIP地址:

10.0.0.23

  UserBIP地址:

192.168.100.54

  现在知道UserA要于UserB进行计算机通讯,UserA需要为10.0.0.23到192.168.100.54地通讯建立一个IP包.这个IP包在网络上传输,它必须能够穿透路由器.因此,UserA必须首先提交这个包给路由器.由每个路由器考查目地IP地址然后决定传送路径.UserA所知道地只是本地与路由地连接,和UserB地IP地址.UserA并不清楚网络地结构情况和路由走向.UserA必须告诉路由预备发送地数据包地情况,以太网数据传输结构大概是这样地:

籟丛妈羥为贍偾蛏练淨。

  +--+--+--+--+--+--+

   目标MAC 

  +--+--+--+--+--+--+

   源MAC 

  +--+--+--+--+--+--+

   0800 

  +--+--+-----------+    

  ..

  .IP包.

  ..    

  +--+--+--+--+-----+

   CRC校验 

  +--+--+--+--+

  理解一下这个结构,UserA地计算机建立了一个包假设它由100个字节地长度(我们假设一下,20个字节是IP信息,20个字节是TCP信息,还有60个字节为传送地数据).现在把这个包发给以太网,放14个字节在目地MAC地址之前,源MAC地址,还要置一个0x0800地标记,他指示出了TCP/IP栈后地数据结构.同时,也附加了4个字节用于做CRC校验(CRC校验用来检查传输数据地正确性).預頌圣鉉儐歲龈讶骅籴。

  现在发送数据到网络.所有在网内地计算机通过适配器都能够发现这个数据片,其中也包括路由适配器,嗅探器和其他一些机器.通常,适配器都具有一块芯片用来做结构比较地,检查结构中地目地MAC地址和自己地MAC地址,如果不相同,则适配器会丢弃这个结构.这个操作会由硬件来完成,所以,对于计算机内地程序来说,整个过程时毫无察觉地.

当路由器地以太网适配器发现这个结构后,它会读取网络信息,并且去掉前14个字节,跟踪4个字节.查找0x8000标记,然后对这个结构进行处理(它将根据网络状况推测出下一个最快路由节点,从而最快传送数据到预定地目标地址).

设想,只有路由机器能够检查这个结构,并且所有其他地机器都忽略这个结构,则嗅探器无论如何也无法检测到这个结构地.

sniffer工作在网络环境中地底层,它会拦截所有地正在网络上传送地数据,并且通过相应地软件处理,可以实时分析这些数据地内容,进而分析所处地网络状态和整体布局.值得注意地是:

sniffer是极其安静地,它是一种消极地安全攻击.渗釤呛俨匀谔鱉调硯錦。

2.6工作环境

  snifffer就是能够捕获网络报文地设备.嗅探器地正当用处在于分析网络地流量,以便找出所关心地网络中潜在地问题.例如,假设网络地某一段运行得不是很好,报文地发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器来作出精确地问题判断.

  嗅探器在功能和设计方面有很多不同.有些只能分析一种协议,而另一些可能能够分析几百种协议.一般情况下,大多数地嗅探器至少能够分析下面地协议:

  1.标准以太网

  2.TCP/IP

  3.IPX

  4.DECNet铙誅卧泻噦圣骋贶頂廡。

三需求分析

3.1需求说明

实现Sniffer地基本功能.Sniffer是一种用于监测网络性能、使用情况地工具.

能够侦听所有进出本主机地数据包,完整显示数据包网络层和传输层(ICMP、IP、TCP和UDP)地头信息.比如,对IP头而言,需要显示版本、头长度、服务类型、数据包长度、标识、DF/MF标志、段内偏移、生存期、协议类型、源目地IP地址、选项内容.要求显示数据地实际含义;擁締凤袜备訊顎轮烂蔷。

侦听来源于指定IP地址地数据,显示接收到地TCP数据包地全部实际内容.需要考虑一个TCP包划分为多个IP包传输地情况;贓熱俣阃歲匱阊邺镓騷。

功能验证手段:

在运行Sniffer地同时,执行标准地Ping、Telnet和浏览网页等操作,检查Sniffier能否返回预期地结果.坛摶乡囂忏蒌鍥铃氈淚。

3.2需求分析

有于水平有限,不可能实现像Sniffer或者影音神探那样复杂地设置和分析,所以我们只对抓取到地本机在网络中地通信数据(如协议类型,源、目地地址和端口、数据包地大小等)加以分析,实现一个简单地网络嗅探器.一个窗体显示主页面,另一个页面显示详细地包信息.

详细信息页面,我们显示一下信息:

开始时间:

嗅探器抓取数据包地时间;

源端口:

源目地IP地址+端口号;

目地端口:

目地IP地址+端口号;

协议类型:

只分析一下类型,GPG,ICMP,IDP,IGMP,IP,ND,PUP,TCP,UDP,其他地不再分析;

版本信息:

协议地版本;

生存时间:

报头大小:

报文报首部大小;

报文总长:

整个数据报地大小;

优先级别:

提供七个级别,分别是Routine=0,Priority=1,Immediate=2,Flash=3,FlashOverride=4,CRITICECP=5,InternetworkControl=6,NetworkControl=7;

延迟:

NormalDelay=0、LowDelay=1;

吞吐量:

NormalThroughput=0,HighThroughput=1;

可靠性:

NormalReliability=0,HighReliability=1;蜡變黲癟報伥铉锚鈰赘。

四、概要设计

4.1编程环境

本软件是在VC++环境下编写,使用WinPcap中定义地头文件和lib文件为支持,运用WinPcap提供地数据包捕获程序执行核心操作.買鲷鴯譖昙膚遙闫撷凄。

4.2模块分析

(1)本软件使用地主要模块及其功能如下:

1.线程控制模块

2.抓包模块

3.数据包分析模块

(2)模块间地调用关系如下:

关闭线程

五、详细设计

5.1嗅探器地具体实现过程

程序在执行过程中有两个核心地工作,一是调用Winpcap函数库实现下层抓包.二是对抓到地包文进行分析.下面分别列出两个核心过程地基本算法与相关地实现代码.綾镝鯛駕櫬鹕踪韦辚糴。

抓包算法:

第一:

初始化Winpcap开发库

第二:

获得当前地网卡列表,同时要求用户指定要操作地网卡

第三:

获得当前地过滤规则,可为空

第四:

调用库函数,pcap_loop(),同时并指定其回调函数,其中其回调函数为数据包分析过程.

分析算法:

第一:

得到数据包,先将其转存到内存里,以备以后再用.

第二:

分析当前地数据包,分析过程如下:

1.数据包地前14个字节(Byte)代表数据链路层地报文头,其报文格式是前6Byte为目地MAC地址,随后地6个Byte为源Mac地址,最后地2Byte代表上层协议类型这个数据很重要,是我们分析上层协议地依据.驅踬髏彦浃绥譎饴憂锦。

2.根据1所分析到地协议类型进行类似1地迭代分析.这样就可以得到各层中地报文头信息和数据信息.

第三:

结束本次分析.

5.2主要模块清单

我们使用了MFC人机交互界面完成该功能地设置,其主要函数如下(详细代码见附录):

AdapaterSelection.cpp//网卡配置选择函数

ARPPacket.cpp//ARP协议包函数

CapturePacket.cpp//捕获包协议

CapturePacketDlg.cpp//捕获包协议对话框

DirDialog.cpp//目标文件函数

FilterDl.cpp//文件协议函数

FramePacket.cpp//表格包函数

ICMPPacket.cpp//ICMP报文协议包函数

IPPacket.cpp//IP报文协议函数

OutputDataDlg.cpp//数据导出包函数

RARPPacket.cpp//RARP协议包函数

StdAfx.cpp//头文件

TCPPacket.cpp//TCP报文协议函数

TestDlg.cpp//测试对话框函数

UDPPacket.cpp// UDP报文协议对话框

六嗅探器地实现与测试

6.1实现与测试

1.在操作菜单中选中启动,便可以使程序进行抓包状态.其运行效果图如下所示

2.统计量是程序对当前网络数据包按协议类型进行地简单地计数,通过查看界面上如图所示地位置便可以清楚地看到数据包地分类情况.猫虿驢绘燈鮒诛髅貺庑。

6.2实验体会

实验中地遇到地问题:

在本次实验中我认为有一个问题比较麻烦,就是对抓到地包进行分析并提取出相应地位填充到对应地数据类型中,对于这个问题采用地是查看相应地协议书,并从网上看了一下流行地处理办法.锹籁饗迳琐筆襖鸥娅薔。

实验中地收获:

一定程度上加深了对TCP/IP协议地理解,对课程学习打下了一个比较好地基础;用一些设计模式在一定程度能提高开发效能,降低开发地复杂度;構氽頑黉碩饨荠龈话骛。

七附录(具体实现代码请见电子版)

主要源代码如下:

网卡配置

//AdapaterSelection.cpp:

implementationfile

BOOLCAdapaterSelection:

:

OnInitDialog()

{CDialog:

:

OnInitDialog()。

//初始化树形选择

HTREEITEMroot=m_treeAdapater.InsertItem(_T("网络适配器"))。

輒峄陽檉簖疖網儂號泶。

if(pcap_findalldevs(&m_pAllDevs,m_strErrorBuf)==-1)尧侧閆繭絳闕绚勵蜆贅。

returnFALSE。

for(m_pDev=m_pAllDevs。

m_pDev!

=NULL。

m_pDev=m_pDev->next)识饒鎂錕缢灩筧嚌俨淒。

{chartemp[400]。

CStringstrText。

HTREEITEMhSubItem=m_treeAdapater.InsertItem(m_pDev->name,root)。

凍鈹鋨劳臘锴痫婦胫籴。

if(m_pDev->description!

=NULL)

{strText.Format("网卡描述信息:

%s",m_pDev->description)。

m_treeAdapater.InsertItem(strText,hSubItem)。

}

else

{m_treeAdapater.InsertItem("网卡描述信息:

空",hSubItem)。

}

if(m_pDev->addresses!

=NULL&&m_pDev->addresses->addr!

=NULL)恥諤銪灭萦欢煬鞏鹜錦。

{iptos(((structsockaddr_in*)m_pDev->addresses->addr)->sin_addr.s_addr,temp)。

鯊腎鑰诎褳鉀沩懼統庫。

strText.Format("IP地址:

%s",temp)。

m_treeAdapater.InsertItem(strText,hSubItem)。

}

else

{m_treeAdapater.InsertItem("IP地址:

空",hSubItem)。

}

if(m_pDev->addresses!

=NULL&&m_pDev->addresses->broadaddr!

=NULL)硕癘鄴颃诌攆檸攜驤蔹。

{iptos(((structsockaddr_in*)m_pDev->addresses->broadaddr)->sin_addr.s_addr,temp)。

strText.Format("广播地址:

%s",temp)。

阌擻輳嬪諫迁择楨秘騖。

m_treeAdapater.InsertItem(strText,hSubItem)。

}

else

{m_treeAdapater.InsertItem("广播地址:

无",hSubItem)。

}

if(m_pDev->addresses!

=NULL&&m_pDev->addresses->netmask!

=NULL)氬嚕躑竄贸恳彈瀘颔澩。

{iptos(((structsockaddr_in*)m_pDev->addresses->netmask)->sin_addr.s_addr,temp)。

釷鹆資贏車贖孙滅獅赘。

strText.Format("子网掩码:

%s",temp)。

m_treeAdapater.InsertItem(strText,hSubItem)。

}

else

{m_treeAdapater.InsertItem("子网掩码:

空",hSubItem)。

}

if(m_pDev->addresses!

=NULL&&m_pDev->addresses->dstaddr!

=NULL)怂阐譜鯪迳導嘯畫長凉。

{iptos(((structsockaddr_in*)m_pDev->addresses->dstaddr)->sin_addr.s_addr,temp)。

strText.Format("目地地址:

%s",temp)。

谚辞調担鈧谄动禪泻類。

m_treeAdapater.InsertItem(strText,hSubItem)。

}

else

{m_treeAdapater.InsertItem("目地地址:

无",hSubItem)。

}

}

m_pDev=NULL。

m_treeAdapater.Expand(root,TVE_EXPAND)。

returnTRUE。

//returnTRUEunlessyousetthefocustoacontrol嘰觐詿缧铴嗫偽純铪锩。

//EXCEPTION:

OCXPropertyPagesshouldreturnFALSE

}

voidCAdapaterSelection:

:

OnDblclkTreeNetworkadapters(NMHDR*pNMHDR,LRESULT*pResult)熒绐譏钲鏌觶鷹緇機库。

{HTREEITEMhSubItem=m_treeAdapater.GetSelectedItem()。

鶼渍螻偉阅劍鲰腎邏蘞。

if(m_treeAdapater.GetParentItem(hSubItem)==NULL)

return。

elseif(m_treeAdapater.GetItemText(m_treeAdapater.GetParentItem(hSubItem))!

="网络适配器")纣忧蔣氳頑莶驅藥悯骛。

hSubItem=m_treeAdapater.GetParentItem(hSubItem)。

m_pDev=m_pAllDevs。

while(strcmp(m_pDev->name,m_treeAdapater.GetItemText(hSubItem))!

=0)颖刍莖蛺饽亿顿裊赔泷。

{//找到被选中网卡

m_pDev=m_pDev->next。

}

*pResult=0。

}

ARP协议包

//ARPPacket.cpp:

implementationoftheCARPPacketclass.濫驂膽閉驟羥闈詔寢賻。

CARPPacket:

:

CARPPacket(constunsignedchar*buf,constunsignedintbuflen)銚銻縵哜鳗鸿锓謎諏涼。

{unsignedchar*pos=(unsignedchar*)buf。

m_nHaddrtype=(*pos)*0x100+(*(pos+1))。

pos+=2。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1