032_数据包截获技术
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
基于原始套接字的设计与实现
4.1原始套接字简介
原始套接字是网络的基本构件。套接字是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets 的基础上,又进行了新的扩充。这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。套接字由两部分组成:开发组件和运行组件。开发组件是指套接字实现文档、应用程序接口(API)引入库和一些头文件。运行组件是指套接字应用程序接口的动态链接库(WINSOCK.DLL)。它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连听进程。套接字存在通信区域(通信区域又称地址簇)中。套接字只与同一区域套接字只支持一个中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。WINDOWS 中的域——网际域。套接字具有类型,WINDOWS SOCKET 2.1 版本支持两种套接字:流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。本文使用的WINDOWS SOCKET 2.1 版本。
【www.think58.com计算机毕业论文网】
4.2数据包截获技术需求分析
数据包截获技术是开发网络管理工具软件的重要基础之一,因为许多故障及入侵判断都是建立在网络流量或数据的分析基础上的。具体来说,数据包截获可以应用在检测网络流量,分析网络故障;网络协议工作原理及过程分析;非法数据截获与入侵检测;网络设备开发。
程序可以设置针对IP地址和协议类别包过滤器,专门截获某一协议(如TCP,UDP,ICMP)或某一主机的数据包。对数据进一步分析可以了解该类协议的各种过程及协议内容,这在计算机网络课程的教学对网络知识的掌握。另外,也可以对数据包的内容进行分析与理解,获得所需的信息。
入侵检测是网络安全领域一个重要的研究方向,如请检测系统由探测器、分析器、用户接口等三个部分组成,其中探测器负责采集数据(如网络数据报、日志文件和系统调用记录等);分析器则主要是设定一系列规则,对探测器送来的数据进行分析,用户接口负责与用户交互。显然,数据包截获是入侵检测系统信息的重要来源之一。
4.3数据包截获程序设计流程图
利用套接字开发数据包截获程序时的一般步骤如图7所示
如图7所示,在利用套接字开发数据包截获程序时的一般步骤是:首先,创建原始套接字,其次将原始套接字绑定到本地网卡地址上;设置网卡为混杂模式,这样网卡就可以收到任何在网络中传输的数据包;在以上条件下开始对数据包进行截获、分析。 think58好,好think58 [资料来源:www.THINK58.com]
4.4数据包截获程序的具体实现原理
数据包截获程序作为一种网络通讯程序,是通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而本设计的要求通过数据包截获程序从网卡接收所有经过它的数据包,因此,在该系统中将网卡以混杂模式替代通常的正常模式。
本设计中,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过WSAIoctl ()来进行设置。完成以上设置就可以开始对网络数据包进行嗅探了,对数据包的获取仍像流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时截获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面先给出结构,数据包的总体结构如表3所示:
think58.com
[来源:http://www.think58.com]
表3 数据包总体结构
数据包
IP头 TCP头(或其他信息头) 数据
数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如表4所示:
表4 UDP数据段头格式
16位 16位
源端口 目的端口
UDP长度 UDP校验和
对于此UDP数据段头的分析在编程实现中可通过数据结构UDP_HEADER来定义:
typedef struct _udphdr
{
unsigned short uh_sport; //16位源端口
unsigned short uh_dport; //16位目的端口
unsigned short uh_len; //16位长度
unsigned short uh_sum; //16位校验和
} UDP_HEADER;
而TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,表5给出TCP数据段头的格式组成:
表5 TCP数据段头格式
16位 16位
源端口 目的端口
顺序号
确认号
TCP头长 (保留)7位 URG ACK PSH RST SYN FIN 窗口大小
校验和 紧急指针
可选项(0或更多的32位字)
数据(可选项) think58好,好think58 [资料来源:http://THINK58.com]
对于此TCP数据段头的分析在编程实现中可通过数据结构TCP_HEADER来定义:
typedef struct _tcphdr
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;
在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据段头格式如表6所示: think58 [资料来源:http://think58.com]
表6 IP数据段头格式
16位 16位
版本 IHL 服务类型 总长
标识 标志 分段偏移
生命期 协议 头校验和
源地址
目的地址
选项(0或更多)
同样,在实际编程中也需要通过一个数据结构来表示此IP数据段头,下面给出此数据结构的定义:
typedef struct _iphdr
{
unsigned char h_lenver; //4位首部长度+4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;
本文来自think58