033_网络流量监控及分析工具
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
4.2 总体结构设计
通过收集与分析简单网络流量监控软件的用户需求,总结出以下特征:
(1)需要实现对网络接口数据包的尽可能多的捕获,将网卡设置为混杂模式,然后进行数据包的采集;
(2)数据包的内容要进行一定的解析,对数据包的协议类型、源目地址、数据包截获时间、数据包内容需要进行分析;
(3)根据用户不同的要求能够依照特定地址范围、特定协议类型相关包等条件进行自定义监视;
(4)监视结果输出有实时流量图、列表等显示;
(5)实现日志记录,便于日后分析;
(6)对某些常见的攻击进行发现分析。
总合以上系统要求与综合分析,本系统总体设计如下,采用VC++6.0编写,系统具有三个主要功能部分:数据捕获与显示模块、流量信息统计模块、流量绘制模块,如图5所示。 本文来自think58 [资料来源:http://www.THINK58.com]
内容来自think58 [资料来源:THINK58.com]
[资料来源:http://think58.com]think58好,好think58 [资料来源:THINK58.com]
数据采集模块:完成网络接口数据的捕获、解析和显示,可以根据用户定义条件组合来进行捕获,如只监视采用TCP或UDP协议的数据包,也可以监视用户希望关注的相关IP地址的数据包,同时完成数据封包日志记录,提高了系统的灵活性。同时,在对数据包的解析过程中对一些常见入侵攻击特征进行判断,发出预警。该模块采用编写原始套接字开发。
信息统计模块:完成统计功能,如统计IP要实现统计接收到的数据报数量、接收到的数据中协议出错的数量、正在请求传输的数量、路由表中可用路由数量、丢弃的数量、需要重组/成功重组的数量等,统计ICMP需要完成发送/接收的消息数量、满足超过TTL的数量、重定向数量、时间戳请求/应答数量等;采用IP助手函数完成。
流量绘制模块:完成总流量、输入流量、输出流量、瞬时流量值、最高流量值的显示;采用访问注册表网络性能数据完成有关数据的获取,通过流量图显示。
4.3 流程图设计
根据上面对各个功能模块的划分,进行更进一步的分析和设计,得到数据采集、注册表网络性能块访问大致的工作流程图,如图6与图7所示。 think58.com [资料来源:http://THINK58.com]
think58好,好think58
[资料来源:http://THINK58.com]
think58.com [版权所有:http://think58.com]
think58
内容来自think58
[资料来源:http://THINK58.com]
think58 [资料来源:THINK58.com]
think58好,好think58 [资料来源:http://www.THINK58.com]
think58 [资料来源:http://www.THINK58.com]
[来源:http://www.think58.com][资料来源:http://THINK58.com]
4.4 各模块功能概述与实现
4.4.1 数据包采集中各类的关系
经过上面的分析与设计,得到该系统的总体功能结构、工作流程,也确定了从编写套接字到最后捕获数据,要经过创建、绑定、设置工作模式、启动线程、接收数据等一系列的处理操作。为了实现处理中的每一步操作,设计了数据捕获的类关系,如图8所示。 think58.com
[来源:http://think58.com]
[资料来源:http://think58.com]
think58.com [来源:http://www.think58.com]
[资料来源:http://think58.com]
在上图中CSockSupport,CSockHelper ,CPackInterDlg,CBinDataDlg等是封装了各部分主要处理功能的类。且这些类中封装了和这些类的操作相关的方法。将在后面对这些类的功能和实现进行详细介绍。 think58 [资料来源:http://www.THINK58.com]
4.4.2 数据包捕获与分析模块
(1)功能实现说明
该功能模块主要由封装的CSockSupport,CsockHelper ,CpackInterDlg,CbinDataDlg四个类完成,下面将对这些类进行详细说明。
CsockSupport类:主要负责检查Socket是否支持2.0版本,在该类中封装了WSAStartup完成Socket的启动;
CsockHelper类:主要实现了从获取本机信息结构、Socket创建、绑定、设置、启动线程、数据接收到协议分析的全部方法,详细处理流程见图9所示。
GetLocalIP实现获取本机地址操作的方法,LPHOSTENT lphp是定义一个主机信息结构,获取过程由gethostname(szLocname,MAX_HOSTNAME_LAN)与gethostbyname(szLocname)完成;第一个参数是用于放置本机名称的缓冲,第二个参数是缓冲区长度,最后利用inet_ntoa将IP地址转化为“.”式地址。
StartCapture方法完成套接字的创建、绑定、设置操作方式和启动线程;具体完成如下:
m_sockCap = socket(AF_INET , SOCK_RAW , IPPROTO_IP);//创建套接字
bind(m_sockCap, (PSOCKADDR)&sa, sizeof(sa));//绑定
setsockopt(m_sockCap, SOL_SOCKET, SO_REUSEADDR, (char*)&bopt, sizeof(bopt)) ;//设置操作
setsockopt(m_sockCap, IPPROTO_IP, IP_HDRINCL, (char*)&bopt, sizeof(bopt)) ;//设置操作 本文来自think58 [资料来源:http://THINK58.com]
WSAIoctl(m_sockCap,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);//混杂模式
m_hCapThread = CreateThread(NULL, 0, CaptureThread, this, 0, NULL);//启动线程
线程函数CaptureThread主要完成数据的接收。数据接收后,将缓冲区数据转化为IP数据格式后即可以开始解析过程,协议名称获取如下:
for(int i=0; i<MAX_PROTO_NUM; i++)
if(ProtoMap[i].ProtoNum==iProtocol)
return ProtoMap[i].ProtoText;
return “”; think58好,好think58 [来源:http://www.think58.com]
ParseIPPack方法完成数据包的解析:
int iIphLen = sizeof(unsigned long) * (pIpheader->h_lenver & 0xf) //获取数据包长度
协议解析:
switch(iProtocol)
{
case IPPROTO_TCP :
……
case IPPROTO_UDP :
……
case IPPROTO_ICMP :
……
default :…… }
StopCapture完成关闭线程和套接字操作:
if(m_hCapThread)
{TerminateThread(m_hCapThread, 0); //中断进程
CloseHandle(m_hCapThread); //关闭句柄
m_hCapThread = NULL;}
if(m_sockCap)
closesocket(m_sockCap); //关闭套接字
CbinDataDlg类主要完成对已捕获数据的存储和显示方法;CpackInterDlg类通过建立CbinDataDlg类和CsockHelper类对象实现数据捕获、解析、显示、存储等,同时它完成对捕获条件设置控件、日志记录控件的编写,在这里就不做详细介绍了。
(2)界面设计(见图10) think58好,好think58 [资料来源:www.THINK58.com]
内容来自think58
copyright think58
[资料来源:www.THINK58.com]
内容来自think58
[版权所有:http://think58.com]
copyright think58 [版权所有:http://think58.com]
think58
[版权所有:http://think58.com]
4.4.3 流量获取模块
(1)设计说明
设计思路:实际编程时,Windows系统内提供了一个系统性能的接口,只需要访问这个接口就可以得到网络性能相关的数据,如流量;根据这个想法,设计出了本功能模块的子功能模块如下:
访问性能数据子模块:负责对注册表进行访问,获取流量数据;
显示子模块:负责将数据绘制在窗口中;
框架子模块:负责消息映射和消息处理;
本模块中,将使用到一个注册表访问函数RegQueryValueEx,它根据开放的注册表键值与名字查找相关的类型和数据。它的函数原型如下:
LONG RegQueryValueEx(HKEY hKey , LPCTSTR lpValueName , LPDWORD lpReserved , LPDWORD lpType , LPBYTE lpData , LPDWORD lpcbData);
参数说明:
hKey为预定的注册表系统键值;
lpValueName为需要查询的目标键值的名字;
lpReserved保留,但是必须为NULL;
lpType为键值类型;
lpData输入/输出接收键值的数据;
lpcbData输入/输出接收键值的缓冲大小标志。
在WindowsNT下,当调用RegQueryValueEx时,若hKey被设置为HKEY_PERFORMANCE_DATA返回的数据并不是直接显示被请求的数据对象。所以程序需要遍历整个数据块,数据块中的逻辑结构如图11所示。 think58
[资料来源:http://think58.com]
[版权所有:http://think58.com]
本文来自think58 [资料来源:THINK58.com]
think58.com
[来源:http://think58.com]
参照图4-6可以很容易地确定性能数据块的查询过程,从数据块的性能数据结构PERF_DATA_BLOCK开始,然后索引到PERF_OBJECT_TYPE结构,而PERF_COUNTER_DEFINITION结构可以通过PERF_OBJECT_TYPE的成员HeaderByteLength找到位置偏移,每一个PERF_OBJECT_TYPE的成员DefinitionLength都能确定一个对应的PERF_INSTANCE_DEFINITION结构,PERF_INSTANCE_DEFINITION结构决定着PERF_COUNTER_BLOCK结构[3]。
内容来自think58 [版权所有:http://think58.com]
上一篇:VC路由协议系统仿真设计与实现
下一篇:vc++可视化图像处理系统+论文