大型网络软件综合课程设计5.docx
- 文档编号:8118702
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:13
- 大小:267.69KB
大型网络软件综合课程设计5.docx
《大型网络软件综合课程设计5.docx》由会员分享,可在线阅读,更多相关《大型网络软件综合课程设计5.docx(13页珍藏版)》请在冰豆网上搜索。
大型网络软件综合课程设计5
大型网络软件综合课程设计
网络接口的监听及数据包分析
学院(系):
电子信息与电气工程学部
专业:
计算机科学与技术
班级:
计0803
组员:
大连理工大学
DalianUniversityofTechnology
目录
前言3
一、课题—入侵检测4
二、小组成员分工4
三、设计目的及功能4
四、设计原理5
4.1网络监控5
4.2包捕获机制6
4.3抓包与过滤7
五、相关网络协议及基本概念7
5.1互连网络层7
5.2套接字9
六、网络监听器具体实现步骤9
6.1具体设计步骤和部分主要代码9
(1)由流程图很容易得到主函数如下:
9
(2)初始化函数InitWinsock2()11
(3)套接字的建立和绑定11
(4)IP包的接收13
(5)IP包的结构和结果的输出13
七、程序运行结果和结果分析14
八、课程设计总结15
参考文献:
16
前言
随着电脑的普及,计算机安全越来越成为一个焦点话题,尤其是计算机网络安全技术更为重要,入侵检测技术是计算机网络安全的一大重要课题
本次大型网络软件综合设计的目的是通过对网络接口的监听及数据包分析,完成网络上报文的实时监听。
动态地分析报文的信息,观察网络中是否有违反安全策略的行为,并准确反映出该机在网络环境下,有无受到攻击以及了解网络的安全状况。
本次大型网络软件综合设计主要任务是通过网络接口的监测和报文的分析,让同学们能够更加深入的了解网络的工作原理以及入侵检测原理,了解TCP/IP协议相关知识,并通过使用Libpcap库或winpcap进行网络编程实践,提高网络编程技能。
一、课题—入侵检测
本设计只要完成对网络接口的监听来实现入侵的检测,完成入侵检测是对入侵行为的检测。
它通过收集和分析网络行为、安全日志、审计数据、其它网络上可以获得的信息以及计算机系统中若干关键点的信息,检查网络或系统中是否存在违反安全策略的行为和被攻击的迹象。
入侵检测作为一种积极主动地安全防护技术,提供了对内部攻击、外部攻击和误操作的实时保护,在网络系统受到危害之前拦截和响应入侵。
因此被认为是防火墙之后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测。
入侵检测通过执行以下任务来实现:
监视、分析用户及系统活动;系统构造和弱点的审计;识别反映已知进攻的活动模式并向相关人士报警;异常行为模式的统计分析;评估重要系统和数据文件的完整性;操作系统的审计跟踪管理,并识别用户违反安全策略的行为。
入侵检测是防火墙的合理补充,帮助系统对付网络攻击,扩展了系统管理员的安全管理能力(包括安全审计、监视、进攻识别和响应),提高了信息安全基础结构的完整性。
它从计算机网络系统中的若干关键点收集信息,并分析这些信息,看看网络中是否有违反安全策略的行为和遭到袭击的迹象。
二、小组成员分工
李树博同学主要负责对UDP报文的监听和处理,IP报文和TCP报文的监听和处理;
徐旺同学主要负责主要相关数据结构定义、界面制作和对ARP广播的处理,建立ARP表。
李修远同学主要负责最后程序的测试工作。
三、设计目的及功能
a、编写网络接口监听程序,分析监听到报文的头,记录接受到该报文的时间,源主机的IP及MAC地址和该报文所使用的协议,如果该报文使用的是TCP或UDP的话记录其使用的端口号
b、监听ARP广播,建立ARP表,实时维护ARP表,动态的监视网上其他机器对本机的访问情况。
c、给出监听与分析报告,显示其结果。
四、设计原理
4.1网络监控
按照运行原理区分为监听模式和网关模式两种。
Sniffer中文可以翻译为嗅探器,是一种基于被动侦听原理的网络分析方式,使用这种技术方式,可以监视网络的状态、数据流动情况以及网络上传输的信息。
当信息以明文的形式在网络上传输时,便可以使用网络监听的方式来进行攻击。
将网络接口设置在监听模式,便可以将网上传世的源源不断的信息截获。
Sniffer技术常常被黑客们用来截获用户的口令,但实际上Sniffer技术被广泛的应用于网络诊断、协议分析、应用性能分析和网络安全保障等各个领域。
Sniffer程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太网卡)置为杂乱(promiscuous)模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包。
普通的情况下,网卡只接收和自己的地址有关的信息包,即传输到本地主机的信息包。
要使Sniffer能接收并处理这种方式的信息,系统需要支持BPF,Linux下需要支持SOCKET一PACKET。
但一般情况下,网络硬件和TCP/IP堆栈不支持接收或者发送与本地计算机无关的数据包,所以,为了绕过标准的TCP/IP堆栈,网卡就必须设置为我们刚开始讲的混杂模式。
一般情况下,要激活这种方式,内核必须支持这种伪设备Bpfilter,而且需要root权限来运行这种程序,所以sniffer需要root身份安装,如果只是以本地用户的身份进入了系统,那么不可能嗅探到root的密码,因此不能运行Sniffer。
当一个黑客成功地攻陷了一台主机,并拿到了root权限,而且还想利用这台主机去攻击同一(物理)网段上的其他主机时,他就会在这台主机上安装Sniffer软件,对以太网设备上传送的数据包进行侦听,从而发现感兴趣的包。
如果发现符合条件的包,就把它存到一个LOg文件中去。
通常设置的这些条件是包含字“username”或“password”的包,这样的包里面通常有黑客感兴趣的密码之类的东西。
一旦黑客截获得了某台主机的密码,他就会立刻进入这台主机。
如果Sniffer运行在路由器上或有路由功能的主机上,就能对大量的数据进行监控,因为所有进出网络的数据包都要经过路由器。
Sniffer属于第M层次的攻击。
就是说,只有在攻击者已经进入了目标系统的情况下,才能使用Sniffer这种攻击手段,以便得到更多的信息。
Sniffer除了能得到口令或用户名外,还能得到更多的其他信息,比如一个重要的信息、在网上传送的金融信息等等。
Sniffer几乎能得到任何在以太网上传送的数据
4.2包捕获机制
包捕获机制是依赖于操作系统的,从广义的角度上看,一个包捕获机制包含三个主要部分:
最底层是针对特定操作系统的包捕获机制,最高层是针对用户程序的接口,第三部分是包过滤机制。
不同的操作系统实现的底层包捕获机制可能是不一样的,但从形式上看大同小异。
数据包常规的传输路径依次为网卡、设备驱动层、数据链路层、网络层、传输层、最后到达应用程序。
而包捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包做过滤、缓冲等相关处理,最后直接传递到应用程序。
利用Winpcap实现网络数据包的捕获Winpcap为数据包捕获提供了Windows下的一个平台,它是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows操作平台上来实现对底层包的截取过滤,它的体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库Packet.dll和一个高层的独立于系统的函数库Libpcap组成,其结如图所示:
第1个模块NPF(netgrouppacketfilter),是一个虚拟设备驱动程序文件,它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块。
第2个模块Packet-dll为win32平台提供了一个公共的接口,不同版本的Windows系统都有自己的内核模块和用户层模块。
Packet-d1l用于解决这些不同,调用Packet-ml的程序可以运行在不同版本的Windows平台上,而无需重新编译。
第3个模块Wpcap-dll是不依赖于操作系统的,它提供了更加高层、抽象的函数。
Winpcap的优势在于提供了一套标准的抓包接口,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。
利用Winpcap对网络数据包进行捕获的步骤及相关代码函数如下:
(1)开启指定网卡:
Winpcap提供了pcap_fmdalldevs0~-个函数来获取当前机器上所配置网络接口的内容,接口的全部信息都保存在pcap-if结构的链表中,链表的每项内容含有全面的网卡信息,而pcap_open__live(constchardevice,intsnaplen,intpromisc,inttomS,char}ebuf)是专门用于打开指定网卡设备的,第3个参数如果设置为1,则代表将网卡设置为混杂模式,同时该函数如果调用成功,则返回指定网卡的操作句柄。
(2)设置过滤规则:
用户可以根据需要设置相应的过滤条件,例如只接收UDP或TCP数据包,实现过滤规则的设置关键是对pcap_compile(pcap_tp,structbpf-Aorogram*fp,charstr,intoptimize,bpf_u_int32netmask)和pcap_setfilter(pcap_tP,structbpfprogram)两个函数进行正确的配置。
(3)捕获并解析网络数据包:
Winpcap提供了几种捕包函数以适应不同的情况,有的需要有回调函数支持,而有的是支持非阻塞模式的,用户可以根据实际情况进行选择,例如Pcap_loop(pcap_tP,intcnt,pcap_handlercallback,u_charuser)是支持回调的,在回调函数中就可以对所捕获的数据包进行解析。
4.3抓包与过滤
数据包过滤器,它决定着是否接收进来的数据包并把数据包拷贝给监听程序。
WinPcap和Libpcap的最强大的特性之一,是拥有过滤数据包的引擎。
它提供了有效的方法去获取网络中的某些数据包,这也是WinPcap捕获机制中的一个组成部分。
用来过滤数据包的函数是pcap_compile()和pcap_setfilter()。
五、相关网络协议及基本概念
5.1互连网络层
互联网络层是TCP/IP协议参考模型中的关键部分。
IP协议把传输层送来消息组装成IP数据包,并把IP数据包传递给数据链路层。
IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除各通信子网间的差异,从而为信息发送方和接受方提供了透明的传输通道。
编制本程序前,首先要对IP包的格式有一定的了解,
(1)版本 占4位,指IP协议的版本。
通信双方使用的IP协议版本必须一致。
目前广泛使用的IP协议版本号为4(即IPv4)。
关于IPv6,目前还处于草案阶段。
(2)首部长度 占4位,可表示的最大十进制数值是15。
请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。
当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。
因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。
首部长度限制为60字节的缺点是有时可能不够用。
但这样做是希望用户尽量减少开销。
最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
(3)区分服务 占8位,用来获得更好的服务。
这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。
1998年IETF把这个字段改名为区分服务DS(DifferentiatedServices)。
只有在使用区分服务时,这个字段才起作用。
(4)总长度 总长度指首部和数据之和的长度,单位为字节。
总长度字段为16位,因此数据报的最大长度为216-1=65535字节。
在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(MaximumTransferUnit)。
当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。
(5)标识(identification) 占16位。
IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。
但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。
当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。
相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
(6)标志(flag) 占3位,但目前只有2位有意义。
● 标志字段中的最低位记为MF(MoreFragment)。
MF=1即表示后面“还有分片”的数据报。
MF=0表示这已是若干数据报片中的最后一个。
● 标志字段中间的一位记为DF(Don’tFragment),意思是“不能分片”。
只有当DF=0时才允许分片。
(7)片偏移 占13位。
片偏移指出:
较长的分组在分片后,某片在原分组中的相对位置。
也就是说,相对用户数据字段的起点,该片从何处开始。
片偏移以8个字节为偏移单位。
这就是说,每个分片的长度一定是8字节(64位)的整数倍。
(8)生存时间 占8位,生存时间字段常用的的英文缩写是TTL(TimeToLive),表明是数据报在网络中的寿命。
由发出数据报的源点设置这个字段。
其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。
最初的设计是以秒作为TTL的单位。
每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。
若数据报在路由器消耗的时间小于1秒,就把TTL值减1。
当TTL值为0时,就丢弃这个数据报。
(9)协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
(10)首部检验和 占16位。
这个字段只检验数据报的首部,但不包括数据部分。
这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。
不检验数据部分可减少计算的工作量。
(11)源地址 占32位。
(12)目的地址 占32位。
5.2套接字
套接字是网络的基本构件。
它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连听进程。
套接字存在通信区域(通信区域又称地址簇)中。
套接字只与同一区域中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。
WINDOWS中的套接字只支持一个域——网际域。
套接字具有类型。
六、网络监听器具体实现步骤
6.1具体设计步骤和部分主要代码
(1)由流程图很容易得到主函数如下:
intmain()
{
printf("==============================\n\n");
printf("《网络监听器》\n");
printf("===============================\n\n");
fp=fopen("C:
\\IP.txt","w");
if(fp==NULL)
printf("文档创建不成功!
");
InitWinsock2();
BindSocket();
fprintf(fp,"***捕获IPv4数据报,并解析IPv4包头***\n");
printf("请输入希望捕获的IP数据报数:
");
scanf("%d",&n);
fprintf(fp,"***捕获的%d个IP数据报数***\n\n",n);
RecieveIPv4();
closesocket(m_Socket);
WSACleanup();
fclose(fp);
return0;
}
其中fopen()和fclose()用于控制输出结果到指定文件,其它各函数下面详细提到。
(2)初始化函数InitWinsock2()
由于Winsock的服务是基于动态链接库WinsockDLL形式实现的,因此首先调用Winstartup()函数对WinsockDLL进行初始化,协商Winsock的版本支持,并分配必要的资源。
若调用该函数前没有加载Winsock库则返回SOCKET_ERROR错误,其信息是WSANOTINITIALISED,若调用成功则返回0。
WSAStartup()函数原型如下:
IntWSAStartup(WORDwVersionReguested,LPWSADATAlpWSAData);
其中版本信息可由MAKEWORD(X,Y)函数获得。
在本课程设计中采用的是Winsock2,其主要代码如下:
voidInitWinsock2(){
WSADATAwsaData;
WORDversion;
intret;
version=MAKEWORD(2,2);
ret=WSAStartup(version,&wsaData);
if(ret!
=0){
printf("Failedtoloadwinsock2library.\n");
return;}
}
(3)套接字的建立和绑定
在WinSock2中,使用WSASocket()建立套接字,使用Bind()对建立的套接字进行地址绑定,使用WSAIoctl()对Socket的工作模式进行设定。
在本课程设计中,由于Socket工作在Intenet域,Socket类型为原始套接字,采用TCP/IP协议簇,容易设计该函数。
部分代码如下:
SOCKETm_Socket;
m_Socket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
if(m_Socket==INVALID_SOCKET)return;
套接字的绑定关键在于获得本地地址,本设计采用WSAIoctl()函数获得相关的地址结构,将控制字段设置为SIO_ADDRESS_LIST_QUERY,然后对SOCKADDR_IN结构的内容进行填充,代码如下:
m_SockAddr.sin_addr.s_addr=((SOCKADDR_IN*)slist->Address[0].lpSockaddr)->sin_addr.s_addr;
m_SockAddr.sin_family=AF_INET;
m_SockAddr.sin_port=htons(0);
将建立的套接字和本地地址绑定,代码如下:
if(bind(m_Socket,(SOCKADDR*)&m_SockAddr,sizeof(m_SockAddr))==SOCKET_ERROR)
return;
为了能接受所有的IP包江套接字的工作模式设置为全部接受,即第二个参数设置为SIO_RCVALL,代码如下:
if(WSAIoctl(m_Socket,SIO_RCVALL,&dwVal,sizeof(dwVal),NULL,0,&dwBytesRet,NULL,NULL)==SOCKET_ERROR)
return;
(4)IP包的接收
在WinSock2中,使用WSARecv()来捕获相关的数据包。
在本设计中将捕获的数据包先预存到缓存区中wbuf。
WSARecv(m_Socket,&wbuf,1,&dwBytesRead,&dwFlags,NULL,NULL)
(5)IP包的结构和结果的输出
按IP包的结构,采用以下数据结构:
typedefstructip_header{
unsignedcharver_ihl;//Version(4bits)+Internetheaderlength(4bits)
unsignedchartos;//Typeofservice
unsignedshorttlen;//Totallength
unsignedshortidentification;//Identification
unsignedshortflags_fo;//Flags(3bits)+Fragmentoffset(13bits)
unsignedcharttl;//Timetolive
unsignedcharproto;//Protocol
unsignedshortcrc;//Headerchecksum
u_charip_src[4];//Sourceaddress
u_charip_dst[4];//Destinationaddress
}IPHEADER,*PIPHEADER
由于在捕获的信息中,版本号和首部长度共用一个字段,所以输出时要进行拆分。
这里采用右移和与运算来完成相关操作。
对于标志位和位偏移采用同样的操作这里略过。
本设计中通过输入参数n的值来控制捕获的数据报数。
分别采用fprintf()和printf()函数向程序运行界面的文档进行输出(具体程序见附录)
七、程序运行结果和结果分析
由该信息可得,版本为IPV4,首部为标准长度20,为独立数据包,无偏移,上层协议为TCP协议,源IP地址和目的IP地址分别为122.200.66.15和202.195.167.137。
显然该程序完成了IP包的截获和分析。
八、课程设计总结
在这次计算机网络课程设计中,我对TCP/IP协议簇有了更深的直观的了解,更进一步认识到了TCP/IP协议在网络通信中的重要地位。
在这次设计中,我从无到有学习Winsock网络编程,对网络编程有了整体的认识,对VC++环境也有了进一步的认识。
这次课程设计对我的动手设计能力有了很大的提高,当然我更看到自己在这方面的不足,我想今后我一定在这方面下很大努力的!
在这次课程设计的过程中,我遇到了很多的问题。
例如刚开始时对Socket一无所知,无从着手;在程序的调试过程中遇到了自己不能解决的问题。
但是在老师的耐心讲解和同学的热心帮助下,我顺利的完成了这次课程设计,这里我对他们表示衷心的感谢。
参考文献:
[1]史蒂文斯(美).TCP/IP详解,卷一[M].北京:
机械工业出版社,2002.
[2]唐正军.网络入侵检测系统的设计和实现EM].北京:
电子工业出版社,2002.
[3]《TCP/IP详解》(卷一)
[4]程志鹏.基于Snort的入侵检测系统的研究与实现[J].电脑开发及应用,2007(11):
24-25.
[5]王喆.基于Snort入侵检测系统的设计与实现[J].计算机系统应用,2009(10):
101-103.
[6]杜敏.王伟平.Linux包过滤防火墙中Snort的入侵检测设计及实现[J].湖南科技学院学报,2007(4):
47-50.
[7]秦根建,张秉权.网络数据包截获机制研究[J].兵工自动化,2003,22(6):
2-3.
[8]刘文涛.网络安全开发包详解[M]E京:
电子工业出版社,2005:
88—1O3.
[9]谢希仁.计算机网络[M].4版.北京:
电子工业出版社,2003:
34_4O.
[10]郑明雄,李辉,蒋朝根.基于NDIS中间层的包截获及分析处理
[J].现代计算机,2004,20(3):
65.66
[11]谭思亮.监听与隐藏.网络侦听与数据保护技术[IvI].北京:
人民
邮电出版社,2002:
8—10.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大型 网络软件 综合 课程设计