刘 晓 灵
(辽宁林业职业技术学院 信息工程系,沈阳 110101)
随着计算机技术与网络应用的迅速普及发展,网络已经逐渐成为人们日常生活中不可或缺的工具。当人们享受着网络给生活带来的诸多便利的同时,网络的安全性和可靠性也日益受到人们的重视。其中,网络安全性是指网络上的数据信息不被更改、泄露以及破坏;网络可靠性是指网络系统能够连续可靠地运行,网络服务不会被事故造成中断。作为网络入侵的核心手段和网络安全维护的基础技术之一,对网络数据包进行捕获、监听与分析等研究对于保证网络的安全性和可靠性是具有重要意义的。
以太网(Ethernet)具有共享介质的特征,信息以明文的形式在网络上传输,当网络适配器设置为监听模式(混杂模式)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3标准的以太网采用的是持续CSMA/CO的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截到需要的信息,这是捕获数据包的物理基础。
以太网是一种总线型的网络,从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的CSMA/CD协议进行信道的争用和共享。每个站点(这里特指计算机通过的接口卡)由网卡来实现这种功能。网卡主要的工作是完成对于总线当前状态的探测,确定是否进行数据的传送,判断每个物理数据帧目的地是否为本站地址,如果不匹配,则说明不是发送到本站的而将它丢弃;如果是的话,接收该数据帧,进行物理数据帧的CRC校验,然后将数据帧提交给LLC子层。
网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发送给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包,这样就可以到达对于网络信息监视捕获的目的。
网卡选择模块:初始化机器上所有的网卡,并在软件界面的网卡选择列表中列出所检测到得网卡供用户选择。
监听控制模块:对流经所选择网卡的数据包进行监听控制,其中包括监听开始和监听终止,监听开始则开始捕获数据包,监听终止即终止对数据包的捕获。
IP包捕获模块:对流经网卡的数据包中的IP协议数据包进行捕获。
ARP包捕获模块:对流经网卡的数据包中的ARP协议数据包进行捕获。
ICMP包捕获模块:对流经网卡的数据包中的ICMP协议数据包进行捕获。
其他格式捕获模块:根据需求和设计需要额外加入对流经网卡的数据包中的其他协议数据包进行捕获。
数据包字段分析模块:对于捕获到并存入数据库中的数据包进行各个字段详细分析并提供显示结果,并可将分析结果以指定格式的文件形式导出。
数据统计模块:对网络数据流量等信息进行统计分析。
该软件功能总体模块图如图1所示。
网卡选择功能是让用户选择需要进行数据包捕获的网卡以便下一步继续工作。此模块采用树控件列举出了当前机器上被WinPcap驱动所支持的所有网卡,用户可以选择其中一个网卡进行即将的数据包捕获。此处非必须选择网卡,如果不选择网卡而点击取消则直接进入程序主界面,但无法进行数据包捕获。
网络数据包的捕获和分析的功能均在该处予以实现。主要是捕获IP层中IP,ICMP,ARP,IGMP等协议数据包,并分析各个数据包协议字段的内容然后反馈到程序主界面的相应部分中。
在数据包捕获过程中,主要是对捕获到的数据包进行分类个数统计以方便用户时刻关注到流入数据包的数量。该处的实现主要是通过预先定义的数个全局变量,根据数据包流入的个数施行动态增长计数。
本程序开发充分考虑到程序在使用上的人性化以及界面的美观效果。采用基于对话框模式开发的MFC程序需要自己手动添加各种工具条、状态条等等。
主要是考虑到抓包器使用过程中难免要常用到一些其他程序软件作为辅助,如用记事本记录一些信息,打开任务管理器查看一下系统进程等等。为了方便用户省去数量繁多的鼠标点击操作,特意在菜单项中添加一个“快捷方式”子菜单项供用户自定义其中的项目来添加个人所需的常用程序链接。其作用大体跟操作系统自带的一个特殊弹出式菜单Quick Lanuch(中文名“快速启动”)相似。
将捕获到的数据包信息按照用户需要保存到数据库或者指定文件中,用户选择数据包条目保存范围和保存位置。
作为一个程序给人最直观的印象,其界面的重要性毋庸置疑。本程序开发充分考虑到程序在使用上的人性化以及界面的美观效果。采用基于对话框模式开发的MFC程序需要自己手动添加各种工具条、状态条等等,本部分主要说明如何手动添加相关控制条。自定义控制条代码如下:
CRect rect;
GetClientRect(rect);
int iStatusBarPane;
iStatusBarPane=sizeof(indicators)/sizeof(UINT); //创建工具条并将位图贴在工具条上
m_MainToolBar.Create(this); //创建工具条对象
m_MainToolBar.LoadToolBar(IDR_TOOLBAR1); //载入工具条资源
CImageList *imageList=new CImageList; //为imageList指针分配内存空间
CBitmap *bitmap=new CBitmap; //为bitmap指针分配内存空间
bitmap->LoadBitmapW(IDB_BITMAP_TOOLBAR); //载入位图资源
imageList->Create(32,32,ILC_COLOR32,10,1);
imageList->Add(bitmap,RGB(255,0,255));
m_MainToolBar.SendMessage(TB_SETIMAGELIST,0,(LPARAM)imageList->m_hImageList);
imageList->Detach();
bitmap->Detach();
delete imageList;
delete bitmap; //在对话框底部创建状态条
if (m_MainStatusBar.Create(this))
{m_MainStatusBar.SetIndicators(indicators, iStatusBarPane);
m_MainStatusBar.SetPaneInfo(0,m_MainStatusBar.GetItemID(0),SBPS_NORMAL, rect.Width()/iStatusBarPane+300);
m_MainStatusBar.SetPaneInfo(1,m_MainStatusBar.GetItemID(1),SBPS_NORMAL, rect.Width()/iStatusBarPane-300);}
CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0, reposQuery, rcClientNow);
CPoint ptOffset(rcClientNow.left - rcClientStart.left,rcClientNow.top - rcClientStart.top);
CRect rcChild;
CWnd* pwndChild=GetWindow(GW_CHILD);
while (pwndChild)
{pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
pwndChild = pwndChild->GetNextWindow(); }
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
MoveWindow(rcWindow, FALSE);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
基于WinPcap的网络数据捕获和分析软件在实际应用中还有些局限性,但仍然不失作为一种很有代表性的技术,对于今后发展更高层的网络安全应用提供了前提和基础,通过研究这方面的课题,可以更深刻地理解网络各层通讯协议的机理,也加强了网络编程的技巧。
[1]W.Richard Stevens.TCP/IP详解 卷一:协议[M].北京:机械工业出版社,2000.
[2]谢希仁.计算机网络(第四版)[M].北京:电子工业出版社,2003.
[3]朱雁辉.Windows防火墙与网络封包截获技术[M].北京:电子工业出版社,2002.
[4]刘文涛.网络安全开发包详解[M].北京:电子工业出版社,2005.
[5]钟晓旭,吴玉.基于WinPcap的网络数据获取系统的研究[J].电脑知识与技术,2007,1(4):1094~1095,1106.