网络嗅探器的实现

上传人:无*** 文档编号:204888299 上传时间:2023-04-27 格式:DOC 页数:22 大小:209.50KB
收藏 版权申诉 举报 下载
网络嗅探器的实现_第1页
第1页 / 共22页
网络嗅探器的实现_第2页
第2页 / 共22页
网络嗅探器的实现_第3页
第3页 / 共22页
资源描述:

《网络嗅探器的实现》由会员分享,可在线阅读,更多相关《网络嗅探器的实现(22页珍藏版)》请在装配图网上搜索。

1、网络嗅探器的设计与实现 Design and implementation of network sniffer摘要网络嗅探器无论是在网络平安还是在黑客攻击方面均扮演了很重要的角色。通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。此分析结果可供网络平安分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。可见,嗅探器实际是一把双刃剑。虽然网络嗅探器技术被黑客利用后会对网络平安构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。而在网络平安方面,网络嗅探手段可以有效地探测在网

2、络上传输的数据包信息,通过对这些信息的分析利用是有助于网络平安维护的。本设计是网络嗅探器的设计与实现,介绍一种在Visual C+下用C语言和网络数据包分析开发工具来实现捕获并分析在网络上传输的数据包的简单方法。本程序实现的根本功能:指定局域网内的任一ip地址,能分析包的类型,构造,流量的大小。附加功能:输出目的ip地址,目的端口,udp数据地址,ip头部长度,udp头部长度,数据包大小。关键词:网络嗅探器数据包捕获分析 网络协议 WinPcap编程接口 多线程目录摘要2关键词21 网络嗅探概述41.1 网络嗅探的背景41.2 相关的网络知识41.3 嗅探器设计原理51.4 嗅探器的具体实现9

3、2 附录源代码13小结16参考资料16 网络嗅探概述1.1 网络嗅探的背景网络嗅探是指利用计算机的网络接口截获目的地为其它计算机的数据报文的一种手段。网络嗅探需要用到网络嗅探器,其最早是为网络管理人员配备的工具,有了嗅探器网络管理员可以随时掌握网络的实际情况,查找网络漏洞和检测网络性能,当网络性能急剧下降的时候,可以通过嗅探器分析网络流量,找出网络阻塞的来源。嗅探器也是很多程序人员在编写网络程序时抓包测试的工具,因为我们知道网络程序都是以数据包的形式在网络中进展传输的,因此难免有协议头定义不对的。网络嗅探的根底是数据捕获,网络嗅探系统是并接在网络中来实现对于数据的捕获的,这种方式和入侵检测系统

4、一样,因此被称为网络嗅探。网络嗅探是网络监控系统的实现根底。1.2 相关网络知识我们通常所说的“Packet sniffer指的是一种插入到计算机网络中的偷听网络通信的设备,就像是监控能听到其他人通过的交谈一样。与电路不同,计算机网络是共享通信通道的。共享意味着计算机能够接收到发送给其他计算机的信息。捕获在网络中传输的数据信息就称为Sniffing窃听。以太网是现在应用最广泛的计算机联网方式,它就是一个共享的介质。以太网协议是在同一回路向所有主机发送数据包信息。数据XX包含有目标主机的正确地址。一般情况下只有具有该地址的主时机承受这个数据包。如果一台主机能够接收所有数据包,而不理会数据XX内容

5、,这种方式通常称为“混杂模式。由于在一个普通的网络环境中,账号和口令信息以明文方式在以太网中传输,一旦入侵者获得其中一台主机的root权限,并将其置于混杂模式以窃听网络数据,从而有可能入侵网络中的所有计算机。计算机能够接收到发送给其他计算机的信息。这就意味着你不必翻开配线盒来安装你的偷听设备,你几乎在连接到你的邻居的任何一条连接上对于你的邻居进展监听。这就被称为“混杂模式的监听。但是这种的“共享技术很快就被“交换技术所取代,这样利用混杂模式进展监听已经不可能了,这就意味着你不得不进展实际的接线来实现监听。目前一些交换机的监视端口就提供了这种接听方式。在黑客的手中,嗅探器就变成了一个黑客利器,如

6、利用ARP欺骗手段,很多攻击方式都要涉及到arp欺骗,如会话劫持和ip欺骗。首先要把网络置于混杂模式,再通过欺骗抓包的方式来获取目标主机的pass包,当然得在同一个交换环境下,也就是要先取得目标效劳器的同一网段的一台效劳器。arp是一种将ip转化成以ip对应的网卡的物理地址的一种协议,或者说ARP协议是一种将ip地址转化成MAC地址的一种协议,它靠维持在内存中保存的一X表来使ip得以在网络上被目标机器应答。ARP就是IP地址与物理之间的转换,当你在传送数据时,IP包里就有源IP地址、源MAC地址、目标IP地址,如果在ARP表中有相对应的MAC地址,那么它就直接,反之,它就要播送出去,对方的IP

7、地址和你发出的目标IP地址一样,那么对方就会发一个MAC地址给源主机。而ARP欺骗就在此处开场,侵略者假设接听到你发送的IP地址,那么,它就可以仿冒目标主机的IP地址,然后返回自己主机的MAC地址给源主机。因为源主机发送的IP包没有包括目标主机的MAC地址,而ARP表里面又没有目标IP地址和目标MAC地址的对应表。所以,容易产生ARP欺骗。1.3 嗅探器设计原理嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字socket方式来进展。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以播送形式发出的数据帧,对于其他形式的数据帧比方已到达网络

8、接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要到达此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字raw socket来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创立了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能承受

9、所有的数据,还需要通过ioctlsocket()来进展设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开场对网络数据包进展嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保存了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进展分析。下面先给出构造.数据包的总体构造: 数据包 IP头 TCP头或其

10、他信息头 数据 数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比拟简单,由一个8字节的头和数据局部组成,具体格式如下:16位 16位 源端口 目的端口 UDP长度 UDP校验和 而TCP数据头那么比拟复杂,以20个固定字节开场,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:对于此TCP数据段头的分析在编程实现中可通过数据构造_TCP来定义:typedef struct _TCP WORD SrcPort; / 源端口WORD DstPort; / 目的端口DWORD SeqNum; / 顺序号DWORD AckNum;

11、/ 确认号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位

12、版本 IHL 效劳类型总长标识标志分段偏移生命期协议头校验和源地址目的地址3 / 6 选项0或更多16位 16位 版本 IHL 效劳类型 总长 标识 标志 分段偏移 生命期 协议 头校验和 源地址 目的地址 选项0或更多 同样,在实际编程中也需要通过一个数据构造来表示此IP数据段头,下面给出此数据构造的定义:typedef struct _IP union BYTE Version; / 版本BYTE HdrLen; / IHL ; BYTE ServiceType; / 效劳类型WORD TotalLen; / 总长WORD ID; / 标识union WORD Flags; / 标志WOR

13、D FragOff; / 分段偏移; BYTE TimeToLive; / 生命期BYTE Protocol; / 协议WORD HdrChksum; / 头校验和DWORD SrcAddr; / 源地址DWORD DstAddr; / 目的地址BYTE Options; / 选项 IP; typedef IP * LPIP; typedef IP UNALIGNED * ULPIP;1.4 嗅探器的具体实现嗅探器工作原理根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就结合注释对程序的具体是实现进展讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。嗅探器的程序实现:1嗅探器包

14、含的头文件:#include /*windows socket的头文件,系统定义的*/#include #include #include #include #pragma ment(lib,ws2_32.lib)/*API相关连的Ws2_32.lib静态库*/2ip数据报头构造:struct ipheader unsigned char ip_hl:4;/*header length(报头长度*/unsigned char ip_v:4;/*version(版本)*/unsigned char ip_tos;/*type os service效劳类型*/unsigned short int

15、ip_len;/*total length (总长度)*/unsigned short int ip_id;/*identification (标识符)*/unsigned short int ip_off;/*fragment offset field(段移位域)*/unsigned char ip_ttl;/*time to live (生存时间)*/unsigned char ip_p;/*protocol(协议)*/unsigned short int ip_sum;/*checksum(校验和)*/unsigned int ip_src;/*source address(源地址)*/

16、unsigned int ip_dst;/*destination address(目的地址)*/;3tcp头构造:typedef struct tcpheader unsigned short int sport;/*source port (源端口号)*/unsigned short int dport;/*destination port(目的端口号)*/unsigned int th_seq;/*sequence number(包的序列号)*/unsigned int th_ack;/*acknowledgement number(确认应答号)*/unsigned char th_x:

17、4;/*unused(未使用)*/unsigned char th_off:4;/*data offset(数据偏移量)*/unsigned char Flags;/*标志全*/unsigned short int th_win;/*windows(窗口)*/unsigned short int th_sum;/*checksum(校验和)*/unsigned short int th_urp;/*urgent pointer(紧急指针)*/TCP_HDR;4udp数据报头构造:typedef struct udphdr unsigned short sport;/*source port(源

18、端口号)*/unsigned short dport;/*destination port(目的端口号)*/unsigned short len;/*udp length(udp长度)*/unsigned short cksum;/*udp checksum(udp校验和)*/UDP_HDR;5变量:SOCKET sock;/*进展网络连接的套接字*/该函数如果调用成功,就会返回新创立的套接字的描述符,否那么就返回INVALID_SOCKET。WSADATA wsd;存放Windows socket初始化信息。DWORD dwBytesRet;32bit的无符号整数。SOCKADDR_IN s

19、a,saSource, saDest;用来指定ip地址和端口信息。struct hostent FAR * pHostent;主机指针6循环抓包:1.tcp抓包if(pIpheader-ip_p)=IPPROTO_TCP&lentcp!=0)printf(*n);pCount+; datatcp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct tcpheader);printf(-TCP-n);printf(n目的IP地址:%sn,szDestIP);printf(n目的端口:%in,ntohs(pTcpheade

20、r-dport);printf(datatcp address-%xn,datatcp);printf(size of ipheader-%in,sizeof(struct ipheader);printf(size of tcpheader-%in,sizeof(struct tcpheader);printf(size of the hole packet-%in,ntohs(pIpheader-ip_len);printf(nchar Packet%i %i=,pCount,lentcp-1);for (i=0;ilentcp;i+)printf(x%.2x,*(datatcp+i);i

21、f (i%10=0)printf(n);printf(;nnn);for (i=0;ilentcp;i+)if( *(datatcp+i)=20)printf(%c,*(datatcp+i);elseprintf(.);printf(nn*n); 运行结果截图:2.udp抓包:if(pIpheader-ip_p)=IPPROTO_UDP&lentcp!=0)pCount+;dataudp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct udphdr);printf(-UDP-n);printf(n目的IP地址:%s

22、n,szDestIP);printf(n目的端口:%dn,ntohs(pTcpheader-dport);printf(UDP数据地址:%xn,dataudp);printf(IP头部长度:%in,sizeof(struct ipheader);printf(UDP头部长度:%in,sizeof(struct udphdr);printf(包的大小:%in,ntohs(pIpheader-ip_len);printf(nchar Packet%i %i=,pCount,lenudp-1);for (i=0;ilenudp;i+)printf(x%.2x,*(dataudp+i);if (i%1

23、0=0)printf(n); printf(;nnn);for (i=0;ilenudp;i+)if( *(dataudp+i)=20)printf(%c,*(dataudp+i);else printf(.); printf(nn*n); 运行结果截图:附录源程序#include /*windows socket的头文件,系统定义的*/#include #include #include #include #pragma ment(lib,ws2_32.lib)/*API相关连的Ws2_32.lib静态库*/#define MAX_HOSTNAME_LAN 255#define SIO_RC

24、VALL _WSAIOW(IOC_VENDOR,1)#define MAX_ADDR_LEN 16struct ipheader unsigned char ip_hl:4;/*header length(报头长度*/unsigned char ip_v:4;/*version(版本)*/unsigned char ip_tos;/*type os service效劳类型*/unsigned short int ip_len;/*total length (总长度)*/unsigned short int ip_id;/*identification (标识符)*/unsigned short

25、 int ip_off;/*fragment offset field(段移位域)*/unsigned char ip_ttl;/*time to live (生存时间)*/unsigned char ip_p;/*protocol(协议)*/unsigned short int ip_sum;/*checksum(校验和)*/unsigned int ip_src;/*source address(源地址)*/unsigned int ip_dst;/*destination address(目的地址)*/;/* total ip header length: 20 bytes (=160

26、bits) */typedef struct tcpheader unsigned short int sport;/*source port (源端口号)*/unsigned short int dport;/*destination port(目的端口号)*/unsigned int th_seq;/*sequence number(包的序列号)*/unsigned int th_ack;/*acknowledgement number(确认应答号)*/unsigned char th_x:4;/*unused(未使用)*/unsigned char th_off:4;/*data off

27、set(数据偏移量)*/unsigned char Flags;/*标志全*/unsigned short int th_win;/*windows(窗口)*/unsigned short int th_sum;/*checksum(校验和)*/unsigned short int th_urp;/*urgent pointer(紧急指针)*/TCP_HDR;typedef struct udphdr unsigned short sport;/*source port(源端口号)*/unsigned short dport;/*destination port(目的端口号)*/unsigne

28、d short len;/*udp length(udp长度)*/unsigned short cksum;/*udp checksum(udp校验和)*/UDP_HDR;void main()SOCKET sock;WSADATA wsd;DWORD dwBytesRet;unsigned int optval = 1;unsigned char *dataudp,*datatcp;int i,pCount=0,lentcp, lenudp;SOCKADDR_IN sa,saSource, saDest;struct hostent FAR * pHostent;char FAR nameM

29、AX_HOSTNAME_LAN;char szSourceIPMAX_ADDR_LEN, szDestIPMAX_ADDR_LEN,RecvBuf65535 = 0;struct udphdr *pUdpheader;struct ipheader *pIpheader;struct tcpheader *pTcpheader;WSAStartup(MAKEWORD(2,1),&wsd);if (sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)=SOCKET_ERROR)exit(1);gethostname(name, MAX_HOSTNAME_LAN

30、);pHostent = gethostbyname(name);sa.sin_family = AF_INET;sa.sin_port = htons(6000);memcpy(&sa.sin_addr.S_un.S_addr, pHostent-h_addr_list0, pHostent-h_length);bind(sock, (SOCKADDR *)&sa, sizeof(sa);/*bind()设定自己主机的IP地址和端口号*/if (WSAGetLastError()=10013) exit(1);WSAIoctl(sock, SIO_RCVALL, &optval, sizeo

31、f(optval), NULL, 0, &dwBytesRet, NULL, NULL);pIpheader = (struct ipheader *)RecvBuf;pTcpheader = (struct tcpheader *)(RecvBuf+ sizeof(struct ipheader );pUdpheader = (struct udphdr *) (RecvBuf+ sizeof(struct ipheader );while (1)memset(RecvBuf, 0, sizeof(RecvBuf);recv(sock, RecvBuf, sizeof(RecvBuf), 0

32、);saSource.sin_addr.s_addr = pIpheader-ip_src;strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);saDest.sin_addr.s_addr = pIpheader-ip_dst;strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);lentcp =(ntohs(pIpheader-ip_len)-(sizeof(struct ipheader)+sizeof(struct tcpheader); lenu

33、dp =(ntohs(pIpheader-ip_len)-(sizeof(struct ipheader)+sizeof(struct udphdr); if(pIpheader-ip_p)=IPPROTO_TCP&lentcp!=0)printf(*n);pCount+; datatcp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct tcpheader);printf(-TCP-n);printf(n目的IP地址:%sn,szDestIP);printf(n目的端口:%in,ntohs(pTcpheader-d

34、port);printf(datatcp address-%xn,datatcp);printf(size of ipheader-%in,sizeof(struct ipheader);printf(size of tcpheader-%in,sizeof(struct tcpheader);printf(size of the hole packet-%in,ntohs(pIpheader-ip_len);printf(nchar Packet%i %i=,pCount,lentcp-1);for (i=0;ilentcp;i+)printf(x%.2x,*(datatcp+i);if (

35、i%10=0) printf(n);printf(;nnn);for (i=0;ilentcp;i+)if( *(datatcp+i)=20)printf(%c,*(datatcp+i);elseprintf(.);printf(nn*n); if(pIpheader-ip_p)=IPPROTO_UDP&lentcp!=0)pCount+;dataudp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct udphdr);printf(-UDP-n);printf(n目的IP地址:%sn,szDestIP);print

36、f(n目的端口:%dn,ntohs(pTcpheader-dport);printf(UDP数据地址:%xn,dataudp);printf(IP头部长度:%in,sizeof(struct ipheader);printf(UDP头部长度:%in,sizeof(struct udphdr);printf(包的大小:%in,ntohs(pIpheader-ip_len);printf(nchar Packet%i %i=,pCount,lenudp-1);for (i=0;ilenudp;i+)printf(x%.2x,*(dataudp+i);if (i%10=0)printf(n);pri

37、ntf(;nnn);for (i=0;ilenudp;i+)if( *(dataudp+i)=20)printf(%c,*(dataudp+i);elseprintf(.);printf(nn*n); 小 结一周的课程设计时间虽不长,但定下心来还是可以学到不少东西的。 拿到课程设计的题目,其实很没底,不知道终究要怎么做,上网查找有关网络嗅探器的信息,查看他人有关网络监视方面的论文,慢慢知道了网络嗅探器的作用。并借鉴前人作出的成果,以此为根底,加以修改,并参加自己的想法,对原来的程序加以修改,完成了自己对网络嗅探器的理解。在这次课程设计中,大家交流自己的心得,并且相互帮助,解决一个个问题。所以,

38、不管是在以后的生活还是学习中,如果遇到问题,自己解决不了时,可以向同学求助。嗅探器的整个设计离不开平常的学习,学习不仅是一个慢慢积累的过程,更要将学到的东西运用到实际中去。课程设计是一个很好的时机,锻炼了每个人对所学知识的理解。在设计过程中,我通过查阅大量有关资料,与同学交流经历和自学,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。付出是会有收获的,这笔珍贵的财富将让我终身受益。参考资料(1) 一个简易嗅探器的实现-何忠龙顾丽娜(2) VC+编程实现网络嗅探器-作者:中国电波传播研究所XX分所郎锐时间:2003-06-16出处:yesky责任编辑:方舟(3) 嗅探器-计算机网络课程设计,学院:计算机学院,二零零八年一月十五日 (4)百度词条:网络嗅探baike.baidu./view/2355978.htm (5) VC+实现网络嗅探器pdf-整理:Miller.Luo (6)计算机网络第5版-谢希仁 (7)Tailer JS,Fish BD.Packed sniffers and network monitorsJ .Information System Security,V.July 1996 (8) 杨义先.网络平安理论与技术.人民邮电.2003 10

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!