首页 VC++实现网络嗅探器

VC++实现网络嗅探器

举报
开通vip

VC++实现网络嗅探器 1 / 6 VC++编程实现网络嗅探器 整理:Miller.Luo 从事网络安全的技术人员和相当一部分准黑客(指那些使用现成的黑客软件进行攻击而 不是根据需要去自己编写代码的人)都一定不会对网络嗅探器(sniffer)感到陌生,网络嗅 探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。通过使用网络嗅探器可 以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。此分析结果可供 网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。可 见,嗅探...

VC++实现网络嗅探器
1 / 6 VC++编程实现网络嗅探器 整理:Miller.Luo 从事网络安全的技术人员和相当一部分准黑客(指那些使用现成的黑客软件进行攻击而 不是根据需要去自己编写代码的人)都一定不会对网络嗅探器(sniffer)感到陌生,网络嗅 探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。通过使用网络嗅探器可 以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。此分析结果可供 网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。可 见,嗅探器实际是一把双刃剑。 虽然网络嗅探器技术被黑客利用后会对网络安全构成一定 的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正 的攻击主要是由其他黑软来完成的。而在网络安全方面,网络嗅探手段可以有效地探测在网 络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。权衡利弊, 有必要对网络嗅探器的实现原理进行介绍。 嗅探器设计原理 嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编 程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己 硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接 口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响 应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所 有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目 的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。 具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实 现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后, 需要通过 setsockopt()函数来设置 IP 头操作选项,然后再通过 bind()函数将原始套接字绑定 到本地网卡。为了让原始套接字能接受所有的数据,还需要通过 ioctlsocket()来进行设置, 而且还可以指定是否亲自处理 IP 头。至此,实际就可以开始对网络数据包进行嗅探了,对 数据包的获取仍象流式套接字或数据报套接字那样通过 recv()函数来完成。但是与其他两种 套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP 头、 TCP 头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通 过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了 网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面先给出结构. 数据包的总体结构: 数据包 IP 头 TCP 头(或其他信息头) 数据 数据在从应用层到达传输层时,将添加 TCP 数据段头,或是 UDP 数据段头。其中 UDP 数据段头比较简单,由一个 8 字节的头和数据部分组成,具体格式如下: 16 位 16 位 源端口 目的端口 VC++? ? ? ? : h t t p ://s h o p 61582462.t a o b a o .c o m / 2 / 6 UDP 长度 UDP 校验和 而 TCP 数据头则比较复杂,以 20 个固定字节开始,在固定头后面还可以有一些长度不 固定的可选项,下面给出 TCP 数据段头的格式组成: 16 位 16 位 源端口 目的端口 顺序号 确认号 TCP 头长 (保留)7 位 URG ACK PSH RST SYN FIN 窗口大小 校验和 紧急指针 可选项(0 或更多的 32 位字) 数据(可选项) 对于此 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 服务类型 总长 标识 标志 分段偏移 生命期 协议 头校验和 源地址 目的地址 VC++? ? ? ? : h t t p ://s h o p 61582462.t a o b a o .c o m / 3 / 6 选项(0 或更多) 同样,在实际编程中也需要通过一个数据结构来 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示此 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)); VC++? ? ? ? : h t t p ://s h o p 61582462.t a o b a o .c o m / 4 / 6 // 填充 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("协议: %srn",GetProtocolTxt(ip.Protocol)); TRACE("IP 源地址: %srn",inet_ntoa(*(in_addr*)&ip.SrcAddr)); TRACE("IP 目标地址: %srn",inet_ntoa(*(in_addr*)&ip.DstAddr)); TRACE("TCP 源端口号: %drn",tcp.SrcPort); TRACE("TCP 目标端口号:%drn",tcp.DstPort); TRACE("数据包长度: %drnrnrn",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) VC++? ? ? ? : h t t p ://s h o p 61582462.t a o b a o .c o m / 5 / 6 { 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; } } 最后,为了使程序能成功编译,需要包含头文件 winsock2.h 和 ws2tcpip.h。在本示例中 将分析结果用 TRACE()宏进行输出,在调试状态下运行,得到的一个分析结果如下: 协议: UDP IP 源地址: 172.168.1.5 IP 目标地址: 172.168.1.255 TCP 源端口号: 16707 TCP 目标端口号:19522 数据包长度: 78 …… 协议: TCP IP 源地址: 172.168.1.17 IP 目标地址: 172.168.1.1 TCP 源端口号: 19714 TCP 目标端口号:10 数据包长度: 200 …… 从分析结果可以看出,此程序完全具备了嗅探器的数据捕获以及对数据包的分析等基本 功能。 小结 本文介绍的以原始套接字方式对网络数据进行捕获的方法实现起来比较简单,尤其是不 需要编写 VxD 虚拟设备驱动程序就可以实现抓包,使得其编写过程变的非常简便,但由于 捕获到的数据包头不包含有帧信息,因此不能接收到与 IP 同属网络层的其它数据包, 如 VC++? ? ? ? : h t t p ://s h o p 61582462.t a o b a o .c o m / 6 / 6 ARP 数据包、RARP 数据包等。在前面给出的示例程序中考虑到安全因素,没有对数据包 做进一步的分析,而是仅仅给出了对一般信息的分析方法。通过本文的介绍,可对原始套接 字的使用方法以及 TCP/IP 协议结构原理等知识有一个基本的认识。本文所述代码在 Windows 2000 下由 Microsoft Visual C++ 6.0 编译调试通过。 VC++? ? ? ? : h t t p ://s h o p 61582462.t a o b a o .c o m /
本文档为【VC++实现网络嗅探器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_740086
暂无简介~
格式:pdf
大小:137KB
软件:PDF阅读器
页数:6
分类:互联网
上传时间:2012-01-02
浏览量:38