在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。UDP数据报各域的意义与TCP段中相应的域相同。只有校验和有些不同,除UDP数据报本身外,它还覆盖一个附加的“伪头标”。这个伪头标来自于IP报头,包括:源IP地址、信宿IP地址、协议类型、UDP长度及填充域。
数据分析模块
本系统采用异常检测量化分析方法,把检测规则和属性以数值形式表示。在检测中,采用计数方法来描述用户和系统行为某种属性,这些计数值只能在一定范围内变化。例如:系统允许有限的不成功注册次数、一种特定类型的网络连接数、企图访问文件的次数、访问文件或目录次数和访问网络系统次数。这个数值检测以一个相对固定的时间间隔例如1小时来度量用户的行为。在本系统中,分析器对解析的数据包计算每一个包的异常值,一旦发现异常值越限,则认为发生了异常攻击,就将该包信息存入数据库中。异常值由用户的行为的历史情况来决定。基本思想是,一般情况下,同一个用户在一定时间内连接本机的端口数较少,如果这个连接数突然增大,这个地址的异常值就增高。应当说,这并不是网络人侵的严格定义,它只是反映出被检测的数据包的“异常”程度。例如因网络问题而使来自同一个IP地址的数据突然增多时,这种检测方法可能会认为对方有异常行为。
分析结果记录
用数据库记录异常数据包信息,用于以后的分析与检查。 报警处理模块
将数据库中的信息及时响应,确定入侵的类型并进行报警。 个人入侵检测系统的实现 系统的总体结构 PIDS总体设计如图5:
图5 PIDS总体设计
系统捕获网络中的数据包,解码IP、TCP、UDP的头部各字段的信息,然后对解码后的数据进行分析统计,并对其做出判断。
系统将入侵信息记录入数据库,并通过告警窗口显示。 数据包捕获模块实现
PIDS的数据包捕获是通过调用Winpcap中的动态库函数实现的。使用pcap_findalldevs函数获取网络设备链表。获取失败终止程序并打印出错误报告,成功就打印出所有网络设备信息以供选择。在选择好进入的网络设备后,对该网络设备进行相应的配置,然后使用pcap_loop函数捕获数据包。
首先获得网卡信息:
/* 返回网络设备的链表,以供选择 */ ifpcap_findalldevs&alldevs, errbuf -1
fprintfstderr,\ exit1;
/* 选择列表 */
fordalldevs; d; dd-next
printf\ if d-description
printf\
else
printf\ ifi0
printf\interfaces found! Make sure WinPcap is installed.\\n\ return -1;
printf\
scanf\
接下来根据所选择的数据进入该网卡:
fordalldevs, i0; i inum-1 ;dd-next, i++;
对选择的网卡进行属性定义:
adhandle pcap_open_lived-name, // 网卡名字
65536,
// 65536表示对所有数据捕获
0, //网卡为混杂模式 1, // 抓包时间间隔 errbuf
// error buffer
设置过滤规则 packet_filter[] \连接并设置过滤器: pcap_compileadhandle, &fcode, packet_filter, 1, netmask; pcap_setfilteradhandle, &fcode; 最后使用回调函数捕获并解析数据包:
pcap_loopadhandle, 0, packet_handler, NULL;
解码数据包模块实现
Winpcap捕获到数据包后,根据对packet_handler函数的操作可以对IP、TCP、UDP协议各字段的信息进行分析。数据结构如下:
/* IPv4 头 */
typedef struct ip_header
u_char ver_ihl;// 版本 4 bits + 首部长度 4 bits u_char tos;
// 服务类型
u_short tlen; // 16位数据报的长度 (字节) u_short identification; // 16位标识
u_short flags_fo;// 标志 3 bits + 片偏移 13 bits u_char ttl;
// 8位生存时间
u_char proto; // 协议
u_short crc; // 16位首部检验和 ip_address saddr;// 32位源IP地址 ip_address daddr;// 32位目的IP地址 u_int op_pad;// 可选择使用
ip_header; /* UDP 头*/
typedef struct udp_header
u_short sport; u_short dport;
// 16位源端口号 // 16位目的端口号