网络嗅探器的设计与实现样本_第1页
网络嗅探器的设计与实现样本_第2页
网络嗅探器的设计与实现样本_第3页
网络嗅探器的设计与实现样本_第4页
网络嗅探器的设计与实现样本_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XX理工大学计算机科学与技术学院课程设计报告—第一学期课程名称网络安全设计题目网络嗅探器设计与实现姓名xxxxxxxxxx学号XXXXXXXXXXX专业班级XXXXXXXXXX指引教师xxxxxxxxxxx年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基本原理网络安全现状随着各种新网络技术不断浮现、应用和发展,计算机网络应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件脆弱性和计算机网络脆弱性以及地理分布位置、自然环境、自然破坏以及人为因素影响,不但增长了信息存储、解决风险,也给信息传送带来了新问题。计算机网络安全问题越来越严重,网络破坏所导致损失越来越大。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地址:3UserBIP地址:4当前懂得UserA要于UserB进行计算机通讯,UserA需要为3到4通讯建立一种IP包。这个IP包在网络上传播,它必要可以穿透路由器。因而,UserA必要一方面提交这个包给路由器。由每个路由器考查目地IP地址然后决定传送途径。UserA所懂得只是本地与路由连接,和UserBIP地址。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能否返回预期成果。需求分析有于水平有限,不也许实现像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)本软件使用重要模块及其功能如下:线程控制模块抓包模块数据包分析模块(2)模块间调用关系如下:启动线程启动线程关闭线程抓包抓包解包解包五、详细设计5.1嗅探器详细实现过程程序在执行过程中有两个核心工作,一是调用Winpcap函数库实现下层抓包。二是对抓到包文进行分析。下面分别列出两个核心过程基本算法与有关实当代码。 抓包算法: 第一:初始化Winpcap开发库 第二:获得当前网卡列表,同步规定顾客指定要操作网卡 第三:获得当前过滤规则,可为空第四:调用库函数,pcap_loop(),同步并指定其回调函数,其中其回调函数为数据包分析过程。分析算法:第一:得到数据包,先将其转存到内存里,以备后来再用。第二:分析当前数据包,分析过程如下:数据包前14个字节(Byte)代表数据链路层报文头,其报文格式是前6Byte为目MAC地址,随后6个Byte为源Mac地址,最后2Byte代表上层合同类型这个数据很重要,是咱们分析上层合同根据。依照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:implementationfileBOOLCAdapaterSelection::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; 。。。。。。}CStringCARPPacket::GetHaddrtype(){returnGetData(m_nHaddrtype);//硬件地址类型}。。。。。。捕获包//CapturePacket.cpp:Definestheclassbehaviorsfortheapplication.BEGIN_MESSAGE_MAP(CCapturePacketApp,CWinApp) ON_COMMAND(ID_HELP,CWinApp::OnHelp)END_MESSAGE_MAP()CCapturePacketApptheApp;目的文献//DirDialog.cpp:implementationoftheCDirDialogclass.staticint__stdcallBrowseCtrlCallback(HWNDhwnd,UINTuMsg,LPARAMlParam,LPARAMlpData){CDirDialog*pDirDialogObj=(CDirDialog*)lpData;if(uMsg==BFFM_INITIALIZED){if(!pDirDialogObj->m_strSelDir.IsEmpty())::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)(LPCTSTR)(pDirDialogObj->m_strSelDir));}::SendMessage(hwnd,BFFM_ENABLEOK,0,TRUE);return0;}intCDirDialog::DoBrowse(CWnd*pwndParent){if(!m_strSelDir.IsEmpty()){m_strSelDir.TrimRight();if(m_strSelDir.Right(1)=="\\"||m_strSelDir.Right(1)=="//")m_strSelDir=m_strSelDir.Left(m_strSelDir.GetLength()-1);}LPMALLOCpMalloc;if(SHGetMalloc(&pMalloc)!=NOERROR)returnFALSE;BROWSEINFObInfo;LPITEMIDLISTpidl;ZeroMemory((PVOID)&bInfo,sizeof(BROWSEINFO));if(!m_strInitDir.IsEmpty()){OLECHARolePath[MAX_PATH];ULONGchEaten;ULONGdwAttributes;HRESULThr;LPSHELLFOLDERpDesktopFolder;if(SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder))){MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,m_strInitDir.GetBuffer(MAX_PATH),-1,olePath,MAX_PATH);m_strInitDir.ReleaseBuffer(-1);hr=pDesktopFolder->ParseDisplayName(NULL,NULL,olePath,&chEaten,&pidl,&dwAttributes);if(FAILED(hr)){pMalloc->Free(pidl);pMalloc->Release();returnFALSE;}bInfo.pidlRoot=pidl;}}bInfo.hwndOwner=pwndParent==NULL?NULL:pwndParent->GetSafeHwnd();bInfo.pszDisplayName=m_strPath.GetBuffer(MAX_PATH);bInfo.lpszTitle=m_strWindowTitle;bInfo.ulFlags=BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS|(FALSE/*m_bStatus*/?BIF_STATUSTEXT:0);bInfo.lpfn=BrowseCtrlCallback;bInfo.lParam=(LPARAM)this;if((pidl=::SHBrowseForFolder(&bInfo))==NULL){returnFALSE;}m_strPath.ReleaseBuffer();m_iImageIndex=bInfo.iImage;if(::SHGetPathFromIDList(pidl,m_strPath.GetBuffer(MAX_PATH))==FALSE){pMalloc->Free(pidl);pMalloc->Release();returnFALSE;}m_strPath.ReleaseBuffer();pMalloc->Free(pidl);pMalloc->Release();returnTRUE;}文献合同//FilterDl.cpp:implementationfileCFilterDl::CFilterDl(CWnd*pParent/*=NULL*/) :CDialog(CFilterDl::IDD,pParent){}voidCFilterDl::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX); DDX_Control(pDX,IDC_TAB_CTR,m_tCtr);}BEGIN_MESSAGE_MAP(CFilterDl,CDialog) ON_NOTIFY(TCN_SELCHANGE,IDC_TAB_CTR,OnSelchangeTabCtr)END_MESSAGE_MAP()BOOLCFilterDl::OnInitDialog(){CDialog::OnInitDialog(); TCITEMitem; item.mask=TCIF_TEXT; item.pszText="第一页";m_tCtr.InsertItem(0,&item); item.pszText="第二页"; m_tCtr.InsertItem(1,&item);m_dlg1.Create(IDD_ABOUTBOX,&m_tCtr); m_dlg2.Create(IDD_DIALOG_OUTPUTDATA,&m_tCtr);m_dlg1.SetWindowPos(NULL,10,30,400,100,SWP_SHOWWINDOW); m_dlg2.SetWindowPos(NULL,10,30,400,100,SWP_HIDEWINDOW);returnTRUE;}voidCFilterDl::OnSelchangeTabCtr(NMHDR*pNMHDR,LRESULT*pResult){*pResult=0;}表格包//FramePacket.cpp:implementationoftheCFramePacketclass.CFramePacket::CFramePacket(constunsignedchar*buf,intbuflen){unsignedchar*pPos; pPos=(unsignedchar*)buf;for(inti=0;i<6;i++) {m_nDestAddr[i]=*pPos; pPos++; }for(i=0;i<6;i++) {m_nSrcAddr[i]=*pPos; pPos++; }m_nType=(*pPos)*0x100+(*(pPos+1));}voidCFramePacket::GetMacSrcAddr(char*str){sprintf(str,"%02X-%02X-%02X-%02X-%02X-%02X",m_nSrcAddr[0],m_nSrcAddr[1],m_nSrcAddr[2],m_nSrcAddr[3],m_nSrcAddr[4],m_nSrcAddr[5]);}CStringCFramePacket::GetMacSrcAddr(){CStringstr; str.Format("%02X-%02X-%02X-%02X-%02X-%02X",m_nSrcAddr[0],m_nSrcAddr[1],m_nSrcAddr[2],m_nSrcAddr[3],m_nSrcAddr[4],m_nSrcAddr[5]); returnstr;}。。。。。。intCFramePacket::GetType(){returnm_nType;}ICMP报文合同包//ICMPPacket.cpp:implementationoftheCICMPPacketclass.CICMPPacket::CICMPPacket(){}CICMPPacket::~CICMPPacket(){}IP报文合同包//IPPacket.cpp:implementationoftheCIPPacketclass.//用于初始化IP头信息CIPPacket::CIPPacket(constunsignedchar*buf,intbuflen){unsignedchar*pos; pos=(unsignedchar*)buf; m_nVersion=*pos/16; m_nHeaderLength=*pos%16;pos++; m_nServiceType=*pos; m_nPrecedence=(*pos&16)*4+(*pos&8)*2+(*pos&4); if(*pos&16)m_bDelay=true; elsem_bDelay=false; 。。。。。。 m_nFragOffSet=(*pos%32)*256+(*(pos+1));pos+=2; m_nTTL=*pos;pos++; m_nProtocol=*pos;pos++; m_nCheckSum=(*pos)*256+(*(pos+1));pos+=2; m_lSrcIP=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));pos+=4; m_lDestIP=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));if(m_nHeaderLength>5) {pos+=4; m_nOptLength=(m_nHeaderLength-5)*4; m_pOptions=newunsignedchar[m_nOptLength]; memcpy(m_pOptions,buf+20,m_nOptLength); } else {m_nOptLength=0; m_pOptions=NULL; } pos=(unsignedchar*)(buf+m_nHeaderLength*4); m_nDataLength=m_uTotalLength-m_nHeaderLength*4; if(m_nDataLength>0) {m_pData=newunsignedchar[m_nDataLength]; memcpy(m_pData,buf+m_nHeaderLength*4,m_nDataLength); } Elsem_pData=NULL;}CStringCIPPacket::GetProtocol(){CStringstr; switch(m_nProtocol) {case6:str.Format("TCP");break; case17:str.Format("UDP");break; case1:str.Format("ICMP");break; case89:str.Format("OSPF");break; default:str.Format("%d",m_nProtocol); } returnstr;}CStringCIPPacket::GetDestIP(){CStringstr; inttemp=m_lDestIP; unsignedchari0,i1,i2,i3;i0=(temp&0xff000000)/0x1000000; i1=(temp&0x00ff0000)/0x10000; i2=(temp&0x0000ff00)/0x100; i3=temp&0x000000ff; str.Format("%003u.%003u.%003u.%003u",i0,i1,i2,i3);returnstr;}CStringCIPPacket::GetSrcIP(){CStringstr; inttemp=m_lSrcIP; unsignedchari0,i1,i2,i3;i0=(temp&0xff000000)/0x1000000; i1=(temp&0x00ff0000)/0x10000; i2=(temp&0x0000ff00)/0x100; i3=temp&0x000000ff; str.Format("%003u.%003u.%003u.%003u",i0,i1,i2,i3);returnstr;}unsignedchar*CIPPacket::GetTData(){ if(m_pData!=NULL) returnm_pData;returnNULL;}int CIPPacket::GetDataLength(){returnm_nDataLength;}//得到版本号CString CIPPacket::GetVersion(){returnGetInt(m_nVersion);}。。。。。。数据导出//OutputDataDlg.cpp:implementationfileCOutputDataDlg::COutputDataDlg(CWnd*pParent/*=NULL*/) :CDialog(COutputDataDlg::IDD,pParent){m_strDirPath=_T(""); m_strFileName=_T("");}voidCOutputDataDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX); DDX_Text(pDX,IDC_EDIT_DIRPATH,m_strDirPath); DDX_Text(pDX,IDC_EDIT_FILENAME,m_strFileName);}BEGIN_MESSAGE_MAP(COutputDataDlg,CDialog) ON_BN_CLICKED(IDC_BUTTON_SELECTIONDIR,OnButtonSelectiondir)END_MESSAGE_MAP()voidCOutputDataDlg::OnButtonSelectiondir(){UpdateData(); CDirDialogdlg; if(dlg.DoBrowse(this)>0) {m_strDirPath=dlg.m_strPath; }UpdateData(false);}voidCOutputDataDlg::OnOK(){UpdateData(); if(m_strFileName.GetLength()<=0) {AfxMessageBox("文献名为空"); return; } elseif(m_strFileName.Find(".xml")<=0) {m_strFileName+=".xml";}if(m_strDirPath.GetLength()<=0) {AfxMessageBox("文献途径为空"); return; } UpdateData(false); CDialog::OnOK();}BOOLCOutputDataDlg::OnInitDialog(){CDialog::OnInitDialog(); structtm*p; charbuf[40]; longltime; time(<ime); p=localtime(<ime); strftime(buf,29,"%a%d%b%Y%H%M%SGMT",p); UpdateData(); m_strFileName.Format("%s数据文献",buf); UpdateData(false); returnTRUE;}RARP合同//RARPPacket.cpp:implementationoftheCRARPPacketclass.CRARPPacket::CRARPPacket(){}CRARPPacket::~CRARPPacket(){}TCP报文合同//TCPPacket.cpp:implementationoftheCTCPPacketclass.CTCPPacket::CTCPPacket(unsignedchar*buf,intbuflen){unsignedchar*pos; pos=(unsignedchar*)buf; m_nSrcPort=(*pos)*0x100+(*(pos+1));pos+=2; m_nDestPort=(*pos)*0x100+(*(pos+1));pos+=2; m_uSeqNum=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));pos+=4; m_uAckNum=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));pos+=4; m_nHeadLen=(*pos)/16;pos++; if(*pos&0x20)m_bURG=true; elsem_bURG=false; if(*pos&0x10)m_bACK=true; elsem_bACK=false; if(*pos&0x08)m_bPSH=true; elsem_bPSH=false; if(*pos&0x04)m_bRST=true; elsem_bRST=false; if(*pos&0x02)m_bSYN=true; elsem_bSYN=false; if(*pos&0x01)m_bFIN=true; elsem_bFIN=false;pos++; m_nWindowSize=(*pos)*0x100+(*(pos+1));pos+=2; m_nCheckSum=(*pos)*0x100+(*(pos+1));pos+=2; m_nUrgPos=(*pos)*0x100+(*(pos+1));if(m_nHeadLen>5) {pos+=2; m_nOptLen=m_nHeadLen*4-20; m_pOptions=newunsignedchar[m_nOptLen]; memcpy(m_pOptions,buf+20,m_nOptLen); } else {m_nOptLen=0; m_pOptions=NULL; }pos=(unsignedchar*)(buf+m_nHeadLen*4); m_nDataLen=buflen-m_nHeadLen*4; if(m_nDataLen>0) {m_pData=newunsignedchar[m_nDataLen]; memcpy(m_pData,buf+m_nHeadLen*4,m_nDataLen); } else {m_pData=NULL; m_nDataLen=0; }}CStringCTCPPacket::GetSrcPort(){return GetStr(m_nSrcPort);}CStringCTCPPacket::GetDestPort(){return GetStr(m_nDestPort);}CStringCTCPPacket::GetSeqNum(){returnGetStr(m_uSeqNum);//顺序号}。。。。。。CStringCTCPPacket::GetStr(unsignedintnNum,unsignedchar*pData,boolnFlag){CStringstr; if(nFlag) str.Format("%u",nNum); else {if(pData!=NULL) str.Format("%s",pData); else str="空"; } returnstr;}CStringCTCPPacket::GetBool(boolnFlag){if(nFlag) return"TRUE"; return"FALSE";}测试对话框//TestDlg.cpp:implementationfileCTestDlg::CTestDlg(CWnd*pParent/*=NULL*/) :CDialog(CTestDlg::IDD,pParent){}voidCTestDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CTestDlg,CDialog)END_MESSAGE_MAP()UDP报文合同对话框//UDPPacket.cpp:implementationoftheCUDPPacketclass.CUDPPacket::CUDPPacket(unsignedchar*buf,intbuflen){unsignedchar*pos;pos=(unsignedchar*)buf; m_uSrcPort=(*pos)*0x100+(*(pos+1));pos+=2; m_uDestPort=(*pos)*0x100+(*(pos+1));pos+=2; m_nTotalLen=(*pos)*0x100+(*(pos+1));pos+=2; m_nCheckSum=(*pos)*0x100+(*(pos+1));m_uDataLen=buflen-8; if(m_uDataLen>0) {m_pData=newchar[m_uDataLen]; memcpy(m_pData,buf+8,m_uDataLen); } else m_pData=NULL;}CStringCUDPPacket::GetDestPort(){returnGetInt(m_uDestPort);}。。。。。。捕获包合同对话框//CapturePacketDlg.cpp:implementationfileclassCAboutDlg:publicCDialog{public: CAboutDlg(); enum{IDD=IDD_ABOUTBOX}; protected: virtualvoidDoDataExchange(CDataExchange*pDX);protected: DECLARE_MESSAGE_MAP()};voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)END_MESSAGE_MAP()CCapturePacketDlg::CCapturePacketDlg(CWnd*pParent/*=NULL*/) :CDialog(CCapturePacketDlg::IDD,pParent){m_strArpCount=_T(""); 。。。。。。 m_lArpCount =0; 。。。。。。}voidCCapturePacketDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX); DDX_Control(pDX,IDC_EDIT_PACKETHEX,m_editHex); 。。。。。。}BEGIN_MESSAGE_MAP(CCapturePacketDlg,CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_COMMAND(ID_MENU_NETWORKCONFIGURATION,OnMenuNetworkconfiguration) 。。。。。。END_MESSAGE_MAP()BOOLCCapturePacketDlg::OnInitDialog(){CDialog::OnInitDialog(); ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) {CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) {pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } SetIcon(m_hIcon,TRUE); //Setbigicon SetIcon(m_hIcon,FALSE); //Setsmallicon m_pDevice=NULL; m_bFlag=false; //设立列信息m_listPacket.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_listPacket.InsertColumn(0,"编号",LVCFMT_RIGHT,50); m_listPacket.InsertColumn(1,"时间戳",LVCFMT_RIGHT,120); m_listPacket.InsertColumn(2,"源网卡地址",LVCFMT_RIGHT,120); m_listPacket.InsertColumn(3,"目网卡地址",LVCFMT_RIGHT,120); m_listPacket.InsertColumn(4,"长度",LVCFMT_RIGHT,50); m_listPacket.InsertColumn(5,"合同",LVCFMT_RIGHT,50); m_listPacket.InsertColumn(6,"源端口",LVCFMT_LEFT,50); m_listPacket.InsertColumn(7,"源IP地址",LVCFMT_LEFT,120); m_listPacket.InsertColumn(8,"目IP地址",LVCFMT_LEFT,120); m_listPacket.InsertColumn(10,"目端口",LVCFMT_LEFT,50);LoadFilterString(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCCapturePacketDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==IDM_ABOUTBOX) {CAboutDlgdlgAbout; dlgAbout.DoModal(); } else {CDialog::OnSysCommand(nID,lParam);}}HCURSORCCapturePacketDlg::OnQueryDragIcon(){return(HCURSOR)m_hIcon;}voidCCapturePacketDlg::OnMenuNetworkconfiguration(){//用于选取网卡信息CAdapaterSelectiondlg; if(dlg.DoModal()==IDOK) {m_pDevice=dlg.getDevice();}}DWORDWINAPICapturePacket(LPVOIDlpParam){CCapturePacketDlg*pDlg=(CCapturePacketDlg*)lpParam; pcap_t*pCap; char strErrorBuf[PCAP_ERRBUF_SIZE];if((pCap=pcap_open_live(pDlg->getDevice()->name,65536,1,1000,strErrorBuf))==NULL) {return-1;}if(pDlg->m_strFilterString.GetLength()>0) {structbpf_programfcode;bpf_u_int32NetMask; NetMask=0xffffff;charfilter[1024]; strcpy(filter,pDlg->m_strFilterString.GetBuffer(pDlg->m_strFilterString.GetLength())); pDlg->m_strFilterString.ReleaseBuffer(); if(pcap_compile(pCap,&fcode,filter,1,NetMask)<0) {AfxMessageBox("编译字符串失败,程序无法启动进行抓包,请确认规则对的性"); return-1; } if(pcap_setfilter(pCap,&fcode)<0) {AfxMessageBox("设立过滤串失败"); return-1; }}do {pcap_loop(pCap,1,pcap_handle,NULL); }while(pDlg->getFlag());pcap_close(pCap); pDlg=NULL; return1; }boolCCapturePacketDlg::getFlag(){returnm_bFlag;}//解决所有网络数据voidCCapturePacketDlg::processPacket(constpcap_pkthdr*pkt_header,constu_char*pkt_data){//用于存诸网络中数据,并保存到CArray中,以备将来使用 structpcap_pkthdr*pHeader=newpcap_pkthdr;u_char*pData; unsignedchar*pPosition=(unsignedchar*)pkt_data; longnIndex=0;//标记当前数据包位置 longnCount=0;//标记日后 charstrData[20];//标记数据pHeader->caplen=pkt_header->caplen; pHeader->len=pkt_header->len;pData=newunsignedchar[pHeader->len]; memcpy((void*)pData,pkt_data,pHeader->len);m_pktHeaders.Add(pHeader); m_pktDatas.Add(pData);nIndex=m_pktHeaders.GetSize()-1; sprintf(strData,"%07d",nIndex+1); nCount=m_listPacket.InsertItem(nIndex,strData,0);m_lTotalCount++;//总数据包加1 CFramePacket*pFramePacket=newCFramePacket(pData,14); CStringstrStamp; structtm*ltime; ltime=localtime(&pkt_header->ts.tv_sec);strStamp.Format("%d-%d-%d%d:%d:%d",ltime->tm_year+1900,ltime->tm_mon+1,ltime->tm_mday,ltime->tm_hour,ltime->tm_min,ltime->tm_sec); CStringstrLength; strLength.Format("%ld",pHeader->len); m_listPacket.SetItemText(nCount,1,strStamp); m_listPacket.SetItemText(nCount,2,pFramePacket->GetMacSrcAddr()); m_listPacket.SetItemText(nCount,3,pFramePacket->GetMacDestAddr()); m_listPacket.SetItemText(nCount,4,strLength); if(pFramePacket->GetType()==0x0800) {CIPPacketipPacket(pData+14,pHeader->len-14); m_listPacket.SetItemText(nCount,5,ipPacket.GetProtocol());m_listPacket.SetItemText(nCount,7,ipPacket.GetSrcIP()); m_listPacket.SetItemText(nCount,8,ipPacket.GetDestIP()); if(ipPacket.GetProtocol()=="UDP") {CUDPPacket*pUDPPacket=newCUDPPacket(ipPacket.GetTData(),ipPacket.GetDataLength()); m_listPacket.SetItemText(nCount,6,pUDPPacket->GetSrcPort()); m_listPacket.SetItemText(nCount,9,pUDPPacket->GetDestPort()); deletepUDPPacket; pUDPPacket=NULL; m_lUdpCount++;//UDP包加1 } elseif(ipPacket.GetProtocol()=="TCP") {CTCPPacket*pTCPPacket=newCTCPPacket(ipPacket.GetTData(),ipPacket.GetDataLength()); m_listPacket.SetItemText(nCount,6,pTCPPacket->GetSrcPort()); m_listPacket.SetItemText(nCount,9,pTCPPacket->GetDestPort()); deletepTCPPacket; pTCPPacket=NULL; m_lTcpCount++;//TCP包加1 } } elseif(pFramePacket->GetType()==0x0806) {m_listPacket.SetItemText(nCount,5,"ARP"); CARPPacket*pARPPacket=newCARPPacket(pData+14,pHeader->len-14); m_listPacket.SetItemText(nCount,7,pARPPacket->GetSPAddr()); m_listPacket.SetItemText(nCount,8,pARPPacket->GetDPAddr()); deletepARPPacket; pARPPacket=NULL; m_lArpCount++;//ARP包加1 } elseif(pFramePacket->GetType()==0x8035) {m_listPacket.SetItemText(nCount,5,"RARP"); CARPPacket*pRARPPacket=newCARPPacket(pData+14,pHeader->len-14); m_listPacket.SetItemText(nCount,7,pRARPPacket->GetSPAddr()); m_listPacket.SetItemText(nCount,8,pRARPPacket->GetDPAddr()); deletepRARPPacket; pRARPPacket=NULL; m_lOtherCount++; } else {CStringstrProtocol; strProtocol.Format("0X%x",pFramePacket->GetType()); m_listPacket.SetItemText(nCount,5,strProtocol); m_lOtherCount++; } deletepFramePacket; pFramePacket=NULL; ShowPacketCount();//显示记录量信息}voidCCapturePacketDlg::ShowPacketForTree(constpcap_pkthdr*pkt_header,constu_char*pkt_data,longindex){m_treeSingerPacket.DeleteAllItems(); CStringstrTitle; strTitle.Format("第%ld个数据包",index+1);HTREEITEMhRoot=m_treeSingerPacket.InsertItem(strTitle); HTREEITEMhSubItem=m_treeSingerPacket.InsertItem("链路层数据",hRoot);CFramePacket*pFramePacket=newCFramePacket(pkt_data,14);HTREEITEMhItem=m_treeSingerPacket.InsertItem("源MAC地址:"+pFramePacket->GetMacSrcAddr(),hSubItem); hItem=m_treeSingerPacket.InsertItem("目MAC地址:"+pFramePacket->GetMacDestAddr(),hSubItem); CStringstrType; strType.Format("类型:0X%x",pFramePacket->GetType()); hItem=m_treeSingerPacket.InsertItem(strType,hSubItem);if(pFramePacket->GetType()==0x0800) {hSubItem=m_treeSingerPacket.InsertItem("网络层数据",hRoot); CIPPacketipPacket(pkt_data+14,pkt_header->len-14); hItem=m_treeSingerPacket.InsertItem("合同:IP",hSubItem); hItem=m_treeSingerPacket.InsertItem("源IP:"+ipPacket.GetSrcIP(),hSubItem); hItem=m_treeSingerPacket.InsertItem("目IP:"+ipPacket.GetDestIP(),hSubItem); hItem=m_treeSingerPacket.InsertItem("版本号:"+ipPacket.GetVersion(),hSubItem); hItem=m_treeSingerPacket.InsertItem("TTL值:"+ipPacket.GetTTL(),hSubItem); hItem=m_treeSingerPacket.InsertItem("总长度:"+ipPacket.GetTotalLength(),hSubItem); 。。。。。。 HTREEITEMh1=m_treeSingerPacket.InsertItem("可靠性:"+ipPacket.GetReliability(),hItem); h1=m_treeSingerPacket.InsertItem("延迟:"+ipPacket.GetDelay(),hItem); h1=m_treeSingerPacket.InsertItem("吞吐量:"+ipPacket.GetThroughtPut(),hItem); hItem=m_treeSingerPacket.InsertItem("IP标记:"+ipPacket.GetIdentification(),hSubItem); 。。。。。。hSubItem=m_treeSingerPacket.InsertItem("传播层数据",hRoot); if(ipPacket.GetProtocol()=="UDP") {CUDPPacket*pUDPPacket=newCUDPPacket(ipPacket.GetTData(),ipPacket.GetDataLength()); hItem=m_treeSingerPacket.InsertItem("合同:UDP",hSubItem); hItem=m_treeSingerPacket.InsertItem("源端口:"+pUDPPacket->GetSrcPort(),hSubItem); 。。。。。。 deletepUDPPacket; pUDPPacket=NULL; } elseif(ipPacket.GetProtocol()=="TCP") {CTCPPacket*pTCPPacket=newCTCPPacket(ipPacket.GetTData(),ipPacket.GetDataLength()); hItem=m_treeSingerPacket.InsertItem("合同:TCP",hSubItem); hItem=m_treeSingerPacket.InsertItem("源端口:"+pTCPPacket->GetSrcPort(),hSubItem); 。。。。。。 deletepTCPPacket; pTCPPacket=NULL; } m_treeSingerPacket.Expand(hSubItem,TVE_EXPAND); } elseif(pFramePacket->GetType()==0x0806) {CARPPacket*pARPPacket=newCARPPacket(pkt_data+14,pkt_header->len-14); hItem=m_treeSingerPacket.InsertItem("合同:ARP",hSubItem); hItem=m_treeSingerPacket.InsertItem("源IP:"+pARPPacket->GetSPAddr(),hSubItem); 。。。。。。 deletepARPPacket; pARPPacket=NULL; } elseif(pFramePacket->GetType()==0x8035) {CARPPacket*pARPPacket=newCARPPacket(pkt_data+14,pkt_header->len-14); hItem=m_treeSingerPac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论