047_基于Windows入侵检测系统(检测模块)
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
基于Windows入侵检测系统的设计
3.1概述
本系统的全称为《基于Windows入侵检测系统的设计与实现》,系统的开发环境为Windows操作系统。本系统实际上是一个小型的基于Windows的网络入侵检测系统,虽然只需要安装在整个共享网段的某台机器上,但能够对整个网段提供入侵检测的保护。
整个系统分主要分为两个模块,即检测模块和响应模块。检测模块主要是通过监听共享网段,捕获该网段上的数据包并对其进行分析,从而剥离出一些与入侵特征相关的标志。响应模块则负责将检测模块剥离出的标志与现有的入侵特征进行模式匹配,从而侦测出存在于网络中的入侵活动,并且利用一些响应手段向网络管理员发出告警信息并采取相应的行动。除了这两大模块以外,本系统还有一个中央控制台模块,该模块主要是给系统的使用者提供方便的操作界面,以及显示系统输出的各项数据。
本论文将重点讨论检测模块的设计与实现。
3.2系统总体结构
系统总体结构如图3-1所示:
图3-1 系统总体结构图 内容来自think58 [资料来源:THINK58.com]
[来源:http://think58.com]
3.3开发环境
本系统所采用的开发语言是C/C++,下表3-1为系统开发所用到的相关部件:
表3-1 系统开发软体环境
部件名称 软体
系统平台 Microsoft Windows
开发工具 VC++ 6.0
编译环境 VC++ 6.0
运行环境 Microsoft Windows
数据库 MYSQL
开发包 winpcap、libnids
4. 检测模块的设计与实现
4.1设计思想
检测模块是任何一个网络入侵检测系统都必须具备的模块之一,它主要实现了数据提取的功能,和对提取到的数据进行简单的分析,从而提取一些与入侵特征相关的标志。简单的说,可以将其分为两个部分,即数据包的捕获和数据包的分析。由于本系统是基于Windows操作系统的,所以数据包捕获功能是在Winpcap软件开发包的基础上实现的。 think58
[资料来源:http://think58.com]
4.2 Winpcap软件开发包简介
Winpcap(windows packet capture)是windows平台下一个网络数据包捕获开发包,是为Libpcap在Windows平台下实现数据包的捕获而设计的。在设计Winpcap时参照了Libpcap,使用方法与Libpcap相似。它的使用非常广泛,几乎所有在Windows平台下要使用数据包捕获功能的软件都可以使用Winpcap开发包。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力,其核心功能是捕获网络数据包,其他功能包括数据包过滤、数据包发送、流量统计和数据包存储等。
使用Winpcap有很多好处,主要体现在以下几个方面。
1.Winpcap给程序员提供了一套标准的网络数据包捕获的编程接口,并且与Libpcap兼容,使得原来许多Linux平台下的网络安全程序可很快地移植到Windows平台下。
2.使用Winpcap可以提供很高的应用效率。它充分考虑了各种性能和效率的优化,在内核层实现了数据包的捕获和过滤。
3.Winpcap还提供了发送数据包的能力。
4.3 BPF过滤机制简介
BPF(Berkeley Packet Filter)是由洛仑兹伯克利实验室的研究人员Stevern McCanne和VanJacobson于1993年提出,背景是当时在UNIX网络功能使用中出现了对网络监控工具的强烈需求,用来分析和排除网络故障。而网络监控程序都运行在用户态空间,数据包必须从内核中复制到用户空间后再进行处理,这种重复的复制工作对实质的功能实现毫无意义。BPF在内核态对数据包进行预处理,因而大大提高了运行性能。 think58 [来源:http://www.think58.com]
当一个数据包到达网络接口设备时,链路层设备驱动器通常把它传送给系统协议栈进行处理。但是,当BPF也在该网络接口上截获时,驱动器将会首先调用BPF。BPF负责将数据包传递给每个监控进程的过滤器。这些用户自定义的过滤器将决定一个数据包是否被接受以及数据包中的那些内容应该被保存下来。对于每一个用于接受数据包的过滤器,BPF将所需的数据复制到与之相连的缓存中,然后设备驱动程序重新获得控制权。 [资料来源:http://www.THINK58.com]
4.4网络数据包捕获模块的实现
4.4.1 网络数据包捕获机制
网络数据包捕获机制是网络入侵检测系统的基础。一般指通过截获整个网络的所有信息流量,根据信息源主机、目标主机、服务协议端口等信息简单过滤掉不关心的数据,再将用户感兴趣的数据发送给更上层的应用程序进行分析。其工作流程图如4-1所示:
图4-1 数据包捕获流程图
网络数据包捕获可以通过两种机制实现,一种是利用以太网的广播特性,另一种方式是通过设置路由器的监听端口实现。两种方式分别适用于不同的情况。本系统是利用以太网络的广播特性进行捕获数据包的。
4.4.2 数据包捕获的具体实现
网卡有以下几个工作模式;广播模式(broad-cast module)、多播模式(multicast module)、直接模式(direct module)和混杂模式(promisc module)。网卡在设置为广播模式时,它将会接受所有目的地址为广播地址的数据包,一般所有的网卡都会设置为这个模式;网卡在设置为多播模式时,当数据包的目的地址为多播地址,而且网卡地址是属于那个多播地址说代表的多播组时,网卡将接纳此数据包;网卡在设置为直接模式时,只有当数据包的目的地址为网卡自己的地址时,网卡才接受它;网卡在设置为混杂模式时,它将接受所有经过的数据包。由于基于网络的入侵检测系统的数据源是整个共享网段上的数据包,因此只要将该网段内某一台主机的网卡设置为混杂模式,就可以监听本网段内所有的数据包进行分析和判断。具体的数据包捕获流程图如下: copyright think58
图4-2 数据包捕获流程图
数据包捕获核心代码及主要函数说明如下:
void DecodeProcess_callback(u_char *argument,const struct pcap_pkthdr *packet_header,const u_char *pkt);
pcap_t * pcap_handle; /*Libpcap句柄*/
char error_content[PCAP_ERRBUF_SIZE]; /*存储错误内容 */
char *net_interface; /*网络接口*/
struct bpf_program bpf_filter; /*BPF过滤规则*/
char bpf_filter_string[]="";
/*过滤规则字符串,此时为空,表示捕获所有的网络数据包,而不是捕获特定的网络数据包*/
unsigned int net_mask; /*网络掩码*/
unsigned int net_ip; /*网络地址*/
net_interface=pcap_lookupdev(error_content);
/*获得可用的网络接口*/
pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);
/*获得地址*/
pcap_handle=pcap_open_live(net_interface,BUFSIZ,1,1,error_content);
/*打开网络接口*/
pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);
/*编译BPF过滤规则*/
pcap_setfilter(pcap_handle,&bpf_filter); 本文来自think58
/*设置过滤规则*/
if(pcap_datalink(pcap_handle)!=DLT_EN10MB)
return;
/*由于在解码的代码中只有以太网,所以这里检测链路是否为以太网,否,则退出*/
pcap_loop(pcap_handle,-1,DecodeProcess_callback,NULL);
/*注册回调函数,循环捕获网络数据包,然后调用回调函数对捕获的网络数据包进行分析*/
pcap_close (pcap_handle); think58.com
本段代码的功能是循环捕获以太网数据包,其中调用了网络接口函数、规则函数和数据包捕获函数。主要的函数功能说明如下:
(1)选择监听网络接口
函数原型:Char * pcap_lookupdev (char*errbuf)
功能:用于寻找本机可用的网络接口,调用成功就返回指向网络接口的指针。其中errbuf为调用失败时返回的错误信息字符串。
(2)建立监听会话
函数原型: pcap_open_live (char*device,int snaplen,int promis,int to_ms,char*ebuf)
功能:用于获取一个捕获器描述符,调用成功就返回监听会话句柄。其中device为指向网络接口的指针,snaplen定义了监听程序所所捕获的最大字节数,promisc定义了是否将网卡设置为混杂模式,to_ms表示度操作等待的毫秒时间,ebuf为函数调用失败返回的错误信息字符串。
(3)编译过滤器
函数原型:int pcap_compile(pcap_t * p,struct bpf_progrm * fp,char*str,int optimize,bpf_u_int32 netmask)
功能:将字符串形式的过滤要求编译成二进制形式存储在bpf_program结构中。从而实现通过设置过滤器来捕获感兴趣的数据包。其中,p为监听会话句柄指针,fp为指向结构bpf_program的指针,用于存放编译后的BPF程序,str为tcpdump表达式字符串指针,optimize为优化标志,netmask为子网掩码。 copyright think58 [来源:http://www.think58.com]
(4)设置过滤器:
函数原型:char * pcap_setfilter(pcap_t*p,struct bpf_program*fp)
功能:通过调用本函数,设置内核过滤器使得编译了的过滤生效。其中,p为指向监听会话句柄的指针,fp为指向结构bpf_program的指针,一般为函数pcap_comple编译后的结果,也可以用手工编BPF代码。
(5)捕获并处理数据包:
函数原型:int pcap_loop(pcap_t*,int cnt,pcap_handler callback,u_char*user)
功能:捕获并处理数据包。其中p为指向监听会话句柄的指针,cnt为指向函数返回前所处理数据包的最大值,值为负时表示处理缓冲区所有的数据包,为0时处理所有的数据包,直到产生读取到EOF错误为止,callback参数指定带有3个参数的回调函数,user为用户传递给回调函数的指针,通常设置为NULL。
(6)用户自定义的回调函数
函数原型:void callback(u_char* args,const struct pcap_pkthdr* header,chonst u_char* packet)
功能:在pcao_loop函数没捕获到一个数据包后被自动调用,用于对捕获到的数据包进行用户自定义的处理。其中,args为从pcap_loop函数传递过来的u_char指针,pheader为指向pcap_pkthdr结构指针,packet是指向所有捕获的数据包的指针。
(7)关闭监听会话句柄 [资料来源:www.THINK58.com]
函数原型:void pcap_close(pcap_* p)
功能:关闭监听会话句柄,并释放资源。
通过Winpcap函数库,我们得到了网络中传输的原始网络数据包,为了从中得到有用的数据信息,接下来就要对原始数据包进行分析,也就是进行网络协议的解析工作。
[资料来源:http://think58.com]
4.5 网络数据包分析模块的实现
当完成对数据包的捕获之后,接下来要完成的是数据包的分析过程。对所有网络数据包的分析,必须从链路层开始分析,然后分析网络层,再分析传输层,最后分析应用层。这是由于捕获到的数据包是一个数据帧,其中最外层的协议是链路层协议,然后从里到外分别额是网络层、传输层和应用层。
本系统目前上未实现对应用层协议的分析,所以数据包的分析流程图如图4-3所示: think58好,好think58
图4-3 数据包分析流程图
从流程图可以看到,在捕获了数据包之后,就对网络数据包进行分析,本系统对链路层只分析了以太网协议。根据以太网协议内容的分析结果,判断以太网类型的值:如果是0X0806,表示协议为ARP协议,则分析ARP协议;如果是0X0800,表示协议为IP协议,则分析IP协议;如果是0X8035,表示协议是RARP协议,则分析RARP协议。在分析IP协议时,根据协议类型的值判断传输层协议类型:如果IP协议类型字段的值是6,表示协议为TCP协议,则分析TCP协议;如果IP协议类型字段的值是17,表示协议为UDP协议,则分析UDP协议;如果IP协议类型字段的值是1,表示协议为ICMP协议,则分析ICMP协议。
在具体的实现过程中,当数据包分析完成后,将分析的结果保存到Data Packet数据结构中。Data Packet的结构如下:
typedef struct Data_Packet
{
struct pcap_pkthdr *pkth;
u_char *pkt;
EtherHdr *eh;
ARPHdr *ah;
IPHdr *iph;
TCPHdr *tcph;
UDPHdr *udph;
ICMPHdr *icmph;
u_char *data;
u_int16_t datasize;
u_int8_t frag_flag;
u_int16_t frag_offset;
u_char mf;
u_char df; think58.com
[资料来源:http://www.THINK58.com]
u_char rf;
u_int16_t sp;
u_int16_t dp;
u_int32_t sip;
u_int32_t dip;
int caplen;
Options ip_options[40];
int ip_option_count;
Options tcp_options[40];
int tcp_option_count;
}Packet;
协议的解析是围绕核心数据结构Data Packet展开的,其中定义有进行协议解析所需的数据结构和保存结果信息的数据结构。通过把解码后的协议按其协议放入Data Packet结构对应的数据成员中,提供给之后的响应模块的使用。其他重要的数据结构还有以太网首部数据结构、IP数据包首部数据结构等,核心代码如下:
1.以太网首部数据结构
Typedef struct Ether_Header
{
u_int8_t ether_dhost [6];
u_int8_t ether_shost [6];
u_int16_t ether_type;
} EtherHdr; [资料来源:THINK58.com]
2.IP数据报首部数据结构
typedef struct IP_Header
{
#if defined (WORDS_BIGENDIAN)
u_int8_t ip_ver:4;
u_int8_t ip_hlen:4;
#else
u_int8_t ip_hlen:4, ip_ver:4;
#endif
u_int8_t ip_tos;
u_int16_t ip_len;
u_int16_t ip_id;
u_int16_t ip_off;
u_int8_t ip_ttl;
u_int8_t ip_proto;
u_int16_t ip_checksum;
struct in_addr ip_src;
struct in_addr ip_dst;
} IPHdr;
4.6 系统集成
本系统除了由检测模块和响应模块两个重要部分以外,还有一个必不可少的部分就是系统的集成部分即中央控制器模块。此模块将检测模块与响应模块集成在一起,构成了一个完整的网络入侵检测系统。它的主要功能就是为用户提供了系统的控制界面,并且能够详细的显示出系统运行的结果。用户可以通过中央控制器实时的监控整个网段的运行情况,检查当前是否有攻击产生或者有攻击的企图。具体实现效果如图4-4所示: think58好,好think58 [版权所有:http://think58.com]
图4-4 检测模块效果图
图4-4主要显示了检测模块在中央控制器中运行的效果图。图上所显示的是检测模块捕获的数据包在通过协议分析后所输出的信息。
5. 系统测试与分析
网络数据包的捕获和分析是整个网络入侵检测系统实现的基础,只有获得了数据源之后,系统的响应模块才能够检测出当前是否有攻击行为或者攻击企图。系统测试是为了测试检测模块是否能够实现应有的功能。
5.1 测试目的
测试目的主要为以下两点:
(1) 测试系统是否能够从共享网段中捕获到数据包。
(2) 测试系统是否能够对捕获的数据包进行协议分析,并且正确的显示。
think58
[版权所有:http://think58.com]