2.3 原始套接字 从用户的角度来看,标准的流式套接字和数据报套接字这两类套接字似乎涵盖了TCP/IP应用的全部,因为基于TCP/IP的应用,从协议栈的层次(如图3所示)上讲,在传输层的确只可能建立于TCP或UDP协议之上,而流式套接字和数据报套接字又分别对应于TCP和UDP,所以几乎所有的应用都可以用这两类套接字实现。但是,当需要自定义数据包发送时或者需要分析所有经过网络的数据包的时候,就必须面临一种不同于前两者的方式—Raw Socket,即原始套接字,程序员可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP,TCP, UDP等,不仅这样,它还可以实现如伪装本地IP、发送ICMP包等功能。 http://www.paper51.com
内容来自www.paper51.com 图 3 协议栈层次 内容来自论文无忧网 www.paper51.com
Raw Socket广泛应用于高级网络编程,也是一种广泛的黑客手段。著名的网络sniffer、拒绝服务攻击(DOS)、IP欺骗等都可以以Raw Socket实现。Raw Socket与标准套接字(SOCK_STREAM、SOCK_DGRAM)的区别在于前者直接置"根"于操作系统网络核心(Network Core),而SOCK_STREAM、SOCK_DGRAM则“悬浮”于TCP和UDP协议的外围,如图4所示。 paper51.com
copyright paper51.com
3 网络数据的采集技术分析 http://www.paper51.com 3.1 Windows下原始数据包捕获的实现 内容来自论文无忧网 www.paper51.com 网络上的数据包捕获机制主要依赖于所使用的操作系统,不同的操作系统下有不同的实现途径。在Windows环境下,可通过网络驱动程序接口规范(NDIS),WinSock的SOCK_RAW或虚拟设备驱动技术(VxD)等技术实现网络数据包的捕获功能。 http://www.paper51.com 前面已经介绍到了,使用原始套接字可以绕过Socket提供的功能,对底层的协议进行使用与开发,可以根据自己的需要生成想要的数据报文等,下面开始介绍使用原始套接字对数据包捕获进行开发的相关技术知识。 http://www.paper51.com 第一,使用套接字前,需要了解网卡接收数据的工作原理: http://www.paper51.com 在正常情况下,网络接口只响应两种数据帧,一种是与自己的硬件相匹配的数据帧,另一种四向所有计算机广播的数据帧。在系统中,数据帧的收发由网卡完成,网卡程序接收从网络发来的数据包,根据其硬件地址去判断是否与本机的硬件地址匹配,若匹配就通知CPU产生中断进行响应,然后调用驱动程序设置的网卡中断程序地址调用驱动程序接收数据,然后放入堆栈进行系统相关处理,若不匹配则直接丢弃该数据包[3]。 内容来自www.paper51.com 对于网络接口,它一般具有4种数据接收模式:广播、组播、直接和混杂模式,只有当把接口设置为混杂模式时,网络接口才能接收所有的数据,无论地址是否匹配,所以在做本设计的时候一定要设置为混杂模式才能实现数据的采集。 paper51.com 第二,需要了解套接字的工作程序和使用方法: copyright paper51.com 一般来说,采用套接字开发网络程序需要经历以下几个基本步骤: copyright paper51.com 启动、创建、绑定、监听(接受连接)、连接、发送/接收数据、关闭、卸载等。 http://www.paper51.com 第三,具体到Windows下利用原始套接字捕获网络数据可以这样设计: 内容来自论文无忧网 www.paper51.com
(1)启动套接字; http://www.paper51.com (2)创建一个原始套接字; copyright paper51.com
(3)将套接字与本地地址绑定; paper51.com (4)设置操作参数; copyright paper51.com (5)设置网络接口为混杂模式; paper51.com
(6)启动监听线程,开始接收数据; copyright paper51.com (7)退出关闭套接字。 http://www.paper51.com 3.2 原始数据包捕获的关键函数 内容来自论文无忧网 www.paper51.com (1)启动函数WSAStartup 内容来自www.paper51.com
int PASCALFAR WSAStartup (DWORD wVersionRequested , LPWSADATA lpWSAData); 内容来自论文无忧网 www.paper51.com
每一个套接字应用程序都必须调用该函数进行一系列初始化工作,并且只有调用成功返回后,才能开始使用套接字,其中参数wVersionRequested是版本号,高字节是次版本号、低字节是主版本号,参数lpWSAData是指向WSADATA结构的指针。 paper51.com (2)套接字创建函数socket 内容来自www.paper51.com
SOCKET socket(int af , int type , int protocol); 内容来自论文无忧网 www.paper51.com
所有的通信在建立之前都必须创建一个套接字,socket函数的功能就是创建套接字,其中参数af指协议地址族(address family),当建立的套接字是依赖于UDP或TCP的话,需要设置af为AF_INET,表示采用IP协议。参数type是指协议的套接字类型,采用流式套接字时用SOCK_STREAM,采用数据报套接字时用SOCK_DGRAM,采用原始套接字时用SOCK_RAW。参数protocol是协议字段,默认情况下可直接设置为0。 http://www.paper51.com
(3)绑定函数bind copyright paper51.com int bind (SOCKET s , struct sockaddr_in* name , int namelen); copyright paper51.com 成功创建套接字后的下一步工作就是将本地网络接口与套接字进行绑定,其中参数s是创建的套接字,参数name是需要绑定的通信对象的信息结构体指针,namelen是该结构的长度。需要注意的是sockaddr_in结构: 内容来自论文无忧网 www.paper51.com structsockaddr_in{ paper51.com short sin_family; //地址族,设置为AF_INET copyright paper51.com unsignedshort sin_port; //指定的端口号 copyright paper51.com structin_addr sin_addr; //IP地址 内容来自www.paper51.com
char sin_zero[8]; http://www.paper51.com }; paper51.com
由于主机序列与网络序列的关系,在程序中需要使用htons等函数进行转换工作。 内容来自论文无忧网 www.paper51.com (4)设置接口模式函数WSAIoctl paper51.com int WSAAPIWSAIoctl(SOCKET s, DWORD http://www.paper51.com dwIoControlCode, LPVOID lpvInBuffer, DWORD http://www.paper51.com cbInBuffer, LPVOID lpvOutBuffer, DWORD http://www.paper51.com cbOutBuffer, LPDWORD lpcbBytesReturned, http://www.paper51.com LPWSAOVERLAPPEDlpOverlapped, 内容来自www.paper51.com LPWSAOVERLAPPED_COMPLETION_ROUTINE 内容来自www.paper51.com lpCompletionRoutine); 内容来自www.paper51.com 其中,s为一个套接口的句柄,dwIoControlCode为操作控制代码,lpvInBuffer为输入缓冲区的地址,cbInBuffer为输入缓冲区的大小,lpvOutBuffer为输出缓冲区的地址, copyright paper51.com
cbOutBuffer为输出缓冲区的大小,lpcbBytesReturned为输出实际字节数的地址,lpOverlapped为WSAOVERLAPPED结构的地址,lpCompletionRoutine为一个指向操作结束后调用的例程指针。 http://www.paper51.com 调用成功后,WSAIoctl 函数返回0,否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError来获取错误代码。 内容来自论文无忧网 www.paper51.com
(5)数据接收函数recv paper51.com int recv(SOCKET s , char* buf ,int len , int flags); paper51.com 4 网络流量监控系统各模块的设计与实现 内容来自论文无忧网 www.paper51.com
4.1 开发背景介绍 http://www.paper51.com 本设计开发平台采用Microsoft Visualstudio6.0,它是目前使用比较广泛的Winsock开发平台,因此具有较强的适应性,能够在很多的操作系统平台上运行,设计后具有直观的简洁的操作界面,稳定性也比较高。 内容来自www.paper51.com 4.2 总体结构设计 paper51.com 通过收集与分析简单网络流量监控软件的用户需求,总结出以下特征: paper51.com (1)需要实现对网络接口数据包的尽可能多的捕获,将网卡设置为混杂模式,然后进行数据包的采集; copyright paper51.com (2)数据包的内容要进行一定的解析,对数据包的协议类型、源目地址、数据包截获时间、数据包内容需要进行分析; copyright paper51.com (3)根据用户不同的要求能够依照特定地址范围、特定协议类型相关包等条件进行自定义监视; http://www.paper51.com (4)监视结果输出有实时流量图、列表等显示; http://www.paper51.com
(5)实现日志记录,便于日后分析; copyright paper51.com
(6)对某些常见的攻击进行发现分析。 copyright paper51.com 总合以上系统要求与综合分析,本系统总体设计如下,采用VC++6.0编写,系统具有三个主要功能部分:数据捕获与显示模块、流量信息统计模块、流量绘制模块,如图5所示。 http://www.paper51.com
paper51.com
|