《网络嗅探器的设计与实现》计算机网络课程设计

《⽹络嗅探器的设计与实现》计算机⽹络课程设计
《⽹络嗅探器的设计与实现》计算机⽹络课程设计
⽬ 录
1实验要求 (1)
2实验内容 (1)
2.1背景 (1)
2.2基本概念和原理 (2)
3设计思路 (5)
3.1 设计流程图 (5)
3.2 主要代码 (5)
4运⾏与测试 (10)
5总结 (11)
参考⽂献 (13)
附录(代码) (14)
1实验要求
在理解⽹络分层协议的基础上,设计实现⼀个⽹络嗅探器。能够实现⽹络层抓包,并对获得的数据包的源和⽬的地址、端⼝、协议等进⾏分析,并给出简单明了的分析统计结果,软件界⾯设计友好。
该软件能够以下基本功能:能列出监测主机的所有⽹卡,选择⼀个⽹卡,设为混杂⼯作模式;能捕获所有流经⽹卡的数据包,并利⽤Wincap函数库设置过滤规则;能分析捕获的数据包的包头和数据,按照各种协议格式进⾏格式化显⽰;将个⼈所开发⼯具的捕获和分析结果与常⽤的wireshark或sniffer进⾏⽐较,完善程序代码。
2实验内容
2.1背景
为了使不同体系结构的计算机⽹络都能进⾏互联,国际标准化组织ISO于1997年成⽴了专门的结构研究这个问题。不久他们就提出了⼀个试图使各种计算机在世界范围内都能互联的成⽹的标准框架,即著名的OSI/RM(Open Systems Interconnection Reference Model , 开放系统互联基本参考模型),简称为OSI。它的主要⽬标是:只要遵循OSI标准,⼀个系统就可以和位于世界任何地⽅的,也遵循同⼀标准的其他任何系统进⾏通信。
OSI采⽤分层结构,每⼀层完成不同的功能,较好地从理论上解决了不同系统之间互联的难题。但是由于OSI模型归于复杂以及种种原因,当它被制定出来时,TCP/IP已经成为事实上的国际标准。
从事⽹络安全的技术⼈员和相当⼀部分准⿊客(指那些使⽤现成的⿊客软件进⾏攻击⽽不是根据需要去⾃⼰编写代码的⼈)都⼀定不会对⽹络嗅探器(sniffer)感到陌⽣,⽹络嗅探器⽆论是在⽹络安全还是在⿊客攻击⽅⾯均扮演了很重要的⾓⾊。通过使⽤⽹络嗅探器可以把⽹卡设置于混杂模式,并可实现对⽹络上传输的数据包的捕获与分析。此分析结果可供⽹络安全分析之⽤,但如为⿊客所利⽤也可以为其发动进⼀步的攻击提供有价值的信息。可见,嗅探器实际是⼀把双刃剑。 虽然⽹络嗅探器技术被⿊客利⽤后会对⽹络安全构成⼀定的威胁,但嗅探器本⾝的危害并不是很⼤,主要是⽤来为其他⿊客软件提供⽹络情报,真正的攻击主要是由其他⿊软来完成的。⽽在⽹络安全⽅⾯,⽹络嗅探⼿段可以有效地探测在⽹络上传输的数据包信息,通过对这些信息的分析利⽤是有助于⽹络安全维护的。权衡利弊,有必要对⽹络嗅探器的实现原理进⾏介绍。
2.2基本原理和概念
⼀.TCP/IP 的4层结构
通常意义上的TCP/IP结构共有4层协议,从下到上依次是⽹络协议层,互联协议层,传输层和应⽤层,不同的层次上运⾏的协议也不同。
1.⽹络协议层
dcg⽹络协议层⼯作在TCP/IP模型的最底层,它负责将数据通过电缆传送出去,并将接收到的信号通过⽹卡驱动转换成计算机能够识别的数据。主要是管理⽹络数据包的接收很发送,在操作系统中主要体现在设备驱动程序和⽹络接⼝。对应各种⽹络通信介质,不同的通信⽹络有其不同的访问协议,例如通常⽤的以太⽹和PPP等。
运⾏⾄这⼀层的协议主要有:Ethernet 802.3等等。
2.互联协议层
互联协议层是⼗分重要的⼀层,⽹卡驱动将解析后的数据递交给互联协议层,互联协议层的⼯作主要就是对这些混乱的数据进⾏解析,然后分门别类地传递给不同的上层协议。
运⾏在这⼀层的协议主要由:IP( Internet Protocol ),ICMP( Internet Control Message Protocol ),ARP( Address Resolution Protocol , 地址转换协议),RARP( Reverse Address Resolution Protocol .反向地址解析协议)
3.传输层协议
传输层协议有两个具有代表性的协议,分别是TCP( Transmission Control Protocol , 传输控制协议) 和UDP( User Datagram Protocol ,⽤户数据报协议)。
TCP的⾯向连接的通信协议,通过三次握⼿建⽴连接,通信完后要断开连接。由于它是⾯向连接的协议,那么它只能⽤于点对点之间的通信。TCP是⼀种可靠的数据流服务,采⽤“重传”和“肯定确认”机制来实现传输的可靠性。TCP还采⽤⼀种滑动窗⼝的⽅式进⾏流量的控制。所谓的窗⼝表⽰的是接收能⼒,⽤于限制发送⽅的发送速度。
UDP是⾯向⽆连接的通信协议,UDP数据包括⽬的端⼝号和源端⼝号信息,由于通信不需要连接,所以它可以实现⼴播发送。UDP通信时不需要接收⽅的确认,属于不可靠的传输,可能会出现丢包的现象,实际应⽤中要求在程序员编程验证。
4.应⽤层协议
应⽤层协议⼀般是⾯向⽤户的服务,如FTP,Telnet,DNS,SMTP,POP3等。
⼆、相关概念详解
1.ARP/RARP
ARP/RARP协议是进⾏IP地址和MAC地址相互转换的协议。在⽹络数据通信中,链路层使⽤MAC地址进⾏实际的数据通信,⽽在⽹络层使⽤IP地址进⾏机器定位寻址。ARP协议把IP地址映射为MAC地址,⽽RARP协议是通过MAC地址映射为IP地址。
ARP请求应答报⽂是⼀种⽐较常⽤的数据包,它的主要⽬的是到IP地址对应的MAC地址。利⽤ARP请求报⽂来获得其MAC地址。这个过程是这样的:
⾸先发送ARP请求报⽂,它是以⼴播的⽅式发送到⽹络上的,每⼀台机器都会收到这个ARP请求报⽂,它是以⼴播⽅式发送到⽹络上的,每个机器都会收到这个ARP请求报⽂。在这个ARP请求报⽂中,发送端以太⽹地址字段是发送ARP请求报⽂机器的MAC地址,⽽且发送端IP字段内容是要查询的MAC的主机的IP地址。当某个主机检查到⾃⼰的IP地址是⽬的IP地址时,它会返回⼀个ARP应答报⽂,在此应答报⽂中,其发送端以太⽹地址字段内容就是要查询的MAC地址。
⼀个主机⾥⾯⼀般有ARP缓存,⾥⾯存储了IP地址和MAC地址对。
2.交换⽹络
在共享⽹络中,把⽹卡设为混杂模式就可以监听所有的⽹络数据包,但是在交换⽹络中,情况就发⽣了变化。
以太⽹分为共享式以太⽹和交换式以太⽹,共享式以太⽹通常以集线器作为⽹络设备,交换式以太⽹通常使⽤交换机作为⽹络连接设备。共享式以太⽹中数据帧以⼴播⽅式传送到每个以太⽹端⼝,⽹内每台主机的⽹卡能接收到⽹内的所有数据帧。因此只要把⽹卡设置成为混杂模式就可以获取到这本地⽹卡的所有数据帧。
磷酸烯醇式丙酮酸最典型的交换⽹络使⽤交换机连接,在交换机中可以设为⼀个端⼝⼀个MAC地址,形成⼀个端⼝⼀个MAc地址对。这样当⽹络数据包到达端⼝时,⽽不是转发给所有的端⼝,只是转发MAC对应的端⼝。这样,其他端⼝的通讯不受⼲扰,所以其他端⼝上的主机就⽆法接收到⽹络上的数据包了。
可以利⽤ARP重定向技术来实现交换⽹络的数据包捕获,其主要原理⽤到了ARP欺骗技术,但此⽅法有⼀定的危险性。另外有的交换机上有⼀个⽤于调试的端⼝,任何其他端⼝的通信数据都会出现在此端⼝上,所以也可以在此端⼝上进⾏⽹络数据包的监听⼯作。
3.数据包在局域⽹内的传输⽅式
众所周知,数据包在互联⽹上的传播是根据IP地址进⾏寻址的,但是完整的过程并⾮如此。数据包通过IP地址可以达到的最远的地点就是⽬标主机所在的⼦⽹,⽽在该⼦⽹内的寻址却是使⽤物理地址的,即MAC地址。
数据包被传送到⽬标主机所在的⼦⽹时,它将被交给路由器,路由器在该⼦⽹内使⽤⼴播⽅式传播出去,这意味着该⼦⽹内的虽有主机都可以接收到该数据包。不过主机接收到数据包后通常会先检查其⽬的地址,如果⽬的地址不是⾃⼰,那么就是丢弃,只有⽬的地址为⾃⼰的数据包才会将其交付给上⼀层处理。
Sniffer将⽹卡设置为混杂模式,这样就可以接收到所有的数据包了,达到了嗅探了⽬的。
⽹卡对接收到的数据包经过⼀步步的解析之后就得到了最终的应⽤程序报⽂,此时就可以清晰易懂地看出它所包含的内容。
三、 ⽹络抓包⽤到的技术
1.原始套接字编程
2.Winpcap编程
使⽤Winpcap来⽣成数据包⽐使⽤原始套接字更加灵活,功能更加丰富。在基于原始套接字⽅法中,由于原始套接字的某些限制,其构造的数据包最底层协议的数据包只能是IP数据包不能够构造IP层以下的协议数据包,例如链路层数据包就不能构造,⽽使⽤Winpcap可以构造基于链路层的数据包。
使⽤WinPcap构造数据包与使⽤原始套接字构造数据包是不同的。在原始套接字⾥⾯构造的数据包是从IP层开始的,⽽在WinPcap中是从链路层开始构造的。也就是说,在WinPcap中药构造⼀个Ip数据包,需要先构造链路层⾸部,在这⾥是以太⽹⾸部,然后再构造Ip⾸部,最后才是IP负载数据。⽽在原始套接字中直接从IP层开始构造,所以只需要构造IP⾸部和负载数据就可以了。
3设计思路
3.1设计流程图
3.2主要代码
新型太阳能电池
嗅探器设计原理
嗅探器作为⼀种⽹络通讯程序,也是通过对⽹卡的编程来实现⽹络通讯的,对⽹卡的编程也是使⽤通
常的套接字(socket)⽅式来进⾏。但是,通常的套接字程序只能响应与⾃⼰硬件地址相匹配的或是以⼴播形式发出的数据帧,对于其他形式的数据帧⽐如已到达⽹络接⼝但却不是发给此地址的数据帧,⽹络接⼝在验证投递地址并⾮⾃⾝地址之后将不引起响应,也就是说应⽤程序⽆法收取到达的数据包。⽽⽹络嗅探器的⽬的恰恰在于从⽹卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此⽬的就不能再让⽹卡按通常的正常模式⼯作,⽽必须将其设置为混杂模式。
具体到编程实现上,这种对⽹卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使⽤的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地⽹卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进⾏设置,⽽且还可以指定是否亲⾃处理IP头。⾄此,实际就可以开始对⽹络数据包进⾏嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,⽽是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在⽹络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关⽹络的⼀些信息。由于这些数据经过了⽹络层和传输层的打包,因此需要根据其附加的帧头对数据包进⾏分析。下⾯先给出结构.数据包的总体结构:
数据在从应⽤层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头⽐较简单,由⼀个8字节的头和数据部分组成,具体格式如下:
⽽TCP数据头则⽐较复杂,以20个固定字节开始,在固定头后⾯还可以有⼀些长度不固定的可选项,下⾯给出TCP数据段头的格式组成:
对于此TCP数据段头的分析在编程实现中可通过数据结构_TCP来定义:
typedef struct _TCP{ WORD SrcPort;// 源端⼝
WORD DstPort;// ⽬的端⼝
DWORD SeqNum;// 顺序号
DWORD AckNum;// 确认号
BYTE DataOff;// TCP头长
BYTE Flags;// 标志(URG、ACK等)
WORD Window;// 窗⼝⼤⼩
WORD Chksum;// 校验和
WORD UrgPtr;// 紧急指针
} TCP;
typedef TCP *LPTCP;
typedef TCP UNALIGNED * ULPTCP;
在⽹络层,还要给TCP数据包添加⼀个IP数据段头以组成IP数据报。IP数据头以⼤端点机次序传送,从左到右,版本字段的⾼位字节先传输(SPARC是⼤端点机;Pentium是⼩端点机)。如果是⼩端点机,就要在发送和接收时先⾏转换然后才能进⾏传输。IP数据段头格式如下:
16位 16位
版本 IHL 服务类型 总长
标识 标志 分段偏移
⽣命期 协议 头校验和
源地址
⽬的地址
选项(0或更多)
同样,在实际编程中也需要通过⼀个数据结构来表⽰此IP数据段头,下⾯给出此数据结构的定义:
typedef struct _IP{
union{ BYTE Version;// 版本
BYTE HdrLen;// IHL
};
BYTE ServiceType;// 服务类型
WORD TotalLen;// 总长
WORD ID;// 标识房屋公园
union{ WORD Flags;// 标志
WORD FragOff;// 分段偏移
};
BYTE TimeToLive;// ⽣命期
BYTE Protocol;// 协议
WORD HdrChksum;// 头校验和
DWORD SrcAddr;// 源地址
DWORD DstAddr;// ⽬的地址
BYTE Options;// 选项
} IP;
typedef IP * LPIP;
typedef IP UNALIGNED * ULPIP;
在明确了以上⼏个数据段头的组成结构后,就可以对捕获到的数据包进⾏分析了。
嗅探器的具体实现
根据前⾯的设计思路,不难写出⽹络嗅探器的实现代码,下⾯就给出⼀个简单的⽰例,该⽰例可以捕获到所有经过本地⽹卡的数据包,并可从中分析出协议、IP源地址、IP⽬标地址、TCP源端⼝号、TCP⽬标端⼝号以及数据包长度等信息。由于前⾯已经将程序的设计流程讲述的⽐较清楚了,因此这⾥就不在赘述了,下⾯就结合注释对程序的具体是实现进⾏讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。主要代码实现清单为:
炉温控制系统// 检查 Winsock 版本号,WSAData为WSADATA结构对象
WSAStartup(MAKEWORD(2,2),&WSAData);
// 创建原始套接字
sock =socket(AF_INET, SOCK_RAW, IPPROTO_RAW));
// 设置IP头操作选项,其中flag 设置为ture,亲⾃对IP头进⾏处理
setsockopt(sock, IPPROTO_IP, IP_HDRINCL,(char*)&flag,sizeof(flag));
// 获取本机名
gethostname((char*)LocalName,sizeof(LocalName)-1);
// 获取本地 IP 地址
pHost =gethostbyname((char*)LocalName));
// 填充SOCKADDR_IN结构
addr_in.sin_addr =*(in_addr *)pHost->h_addr_list[0];//IP
addr_in.sin_family = AF_INET;
addr_in.sin_port =htons(57274);
/
/ 把原始套接字sock 绑定到本地⽹卡地址上
bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));
// dwValue为输⼊输出参数,为1时执⾏,0时取消
DWORD dwValue =1;
// 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
// 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
ioctlsocket(sock, SIO_RCVALL,&dwValue);
前⾯的⼯作基本上都是对原始套接字进⾏设置,在将原始套接字设置完毕,使其能按预期⽬的⼯作时,就可以通过recv()函数从⽹卡接收数据了,接收到的原始数据包存放在缓存RecvBuf[]中,缓冲区长度BUFFER_SIZE定义为65535。然后就可以根据前⾯对IP数据段头、TCP 数据段头的结构描述⽽对捕获的数据包进⾏分析:
while(true)
{
// 接收原始数据包信息
int ret =recv(sock, RecvBuf, BUFFER_SIZE,0);
if(ret >0)
{
// 对数据包进⾏分析,并输出分析结果
ip =*(IP*)RecvBuf;
tcp =*(TCP*)(RecvBuf + ip.HdrLen);
TRACE("协议: %s/r/n",GetProtocolTxt(ip.Protocol));
TRACE("IP源地址: %s/r/n",inet_ntoa(*(in_addr*)&ip.SrcAddr));
TRACE("IP⽬标地址: %s/r/n",inet_ntoa(*(in_addr*)&ip.DstAddr));
TRACE("TCP源端⼝号: %d/r/n",tcp.SrcPort);
TRACE("TCP⽬标端⼝号:%d/r/n",tcp.DstPort);
TRACE("数据包长度: %d/r/n/r/n/r/n",ntohs(ip.TotalLen));
}
}
其中,在进⾏协议分析时,使⽤了GetProtocolTxt()函数,该函数负责将IP包中的协议(数字标识的)转化为⽂字输出,该函数实现如下:
#define PROTOCOL_STRING_ICMP_TXT "ICMP"
#define PROTOCOL_STRING_TCP_TXT "TCP"
#define PROTOCOL_STRING_UDP_TXT "UDP"
#define PROTOCOL_STRING_SPX_TXT "SPX"
#define PROTOCOL_STRING_NCP_TXT "NCP"
#define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW"
……
CString CSnifferDlg::GetProtocolTxt(int Protocol)
{
switch(Protocol){
case IPPROTO_ICMP ://1 /* control message protocol */
return PROTOCOL_STRING_ICMP_TXT;
case IPPROTO_TCP ://6 /* tcp */
return PROTOCOL_STRING_TCP_TXT;
南山铝业可转债case IPPROTO_UDP ://17 /* user datagram protocol */
return PROTOCOL_STRING_UDP_TXT;
default:
return PROTOCOL_STRING_UNKNOW_TXT;
}
4运⾏与测试
5总结
本次的课题是⽤c开发⼀个⽹络嗅探器的程序设计,设计完成对流经本地⽹卡的所有数据包捕获,分析协议类型,并根据不同的协议类型对数据包进⾏进⼀步的分析,包括分析数据包的源IP地址,⽬的IP地址,源端⼝号,⽬的端⼝号,⼤⼩等等。设计完成后经测试能实现预期要求的功能。但是仍然存在不⾜之处,例如:
1.由于时间和所学知识有限,只对数据包进⾏了简单分析,就归类到⽇志⽂件中。这样会占⽤很⼤的内存空间去存储这些数据。并且只能在⽇志⽂件中对其进⼀步的分析,操作量⼤。
2.本⽂中的嗅探器使⽤于基于⼴播包的⽹络,⽽对于诸如交换机这类设备,由于它能阻⽌⼴播,所以就不能够对⼦⽹内其他的机器进⾏监听。

本文发布于:2024-09-22 01:02:51,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/233512.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据包   协议   数据   分析
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议