手把手教你捕获数据包论文.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
精品优秀毕业设计论文资料,已通过知名高校导师审核认可并通过答辩,更多详情资料科咨询上传本人!

手把手教你捕获数据包 作者: PiggyXP 出处:CSDN ?(??)?砖??(?5?)?好??评论?(?0 ) 条  进入论坛 更新时间:2006-01-12 11:41 关 键 词:捕获数据包 阅读提示:在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。 一.捕获数据包的实现原理: 在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。 所以我们要想实现截获流经网络设备的所有数据包,就要采取一点特别的手段了: 将网卡设置为混杂模式。 这样一来,该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。 但是要注意一点,这种截获仅仅是数据包的一份拷贝,而不能对其进行截断,要想截断网络流量就要采用一些更底层的办法了,不在本文的讨论范围之内。 ? 二. 捕获数据包的编程实现: 1.raw socket的实现方法 不同于我们常用的数据流套接字和数据报套接字,在创建了原始套接字后,需要用WSAIoctl()函数来设置一下,它的定义是这样的 int WSAIoctl( ? SOCKET s, ? DWORD dwIoControlCode, ? LPVOID lpvInBuffer, ? DWORD cbInBuffer, ? LPVOID lpvOutBuffer, ? DWORD cbOutBuffer, ? LPDWORD lpcbBytesReturned, ? LPWSAOVERLAPPED lpOverlapped, ? LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); 虽然咋一看参数比较多,但是其实我们最关心的只是其中的第二项而已,我们需要做的就是把第二项设置为SIO_RCVALL,讲了这么多其实要做的就是这么一行代码,很简单吧?^_^ ?当然我们还可以指定是否亲自处理IP头,但是这并不是必须的。 完整的代码类似与如下这样,加粗的代码是与平常不同的需要注意的地方: ( 为了让代码一目了然,我把错误处理去掉了,下同) #include “WinSock2.h” #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) ? SOCKET SnifferSocket ? WSADATA wsaData; ? iFlag=WSAStartup(MAKEWORD(2,2),wsaData);???????? ? //开启winsock.dll ????????????????????????????????? SnifferSocket=WSASocket(AF_INET, ????????????//创建raw? socket SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); ? ? char FAR name[128];???? ???????????????????????????//获取本机IP地址 gethostname(name, sizeof(name)); ? struct hostent FAR * pHostent; ? pHostent = gethostbyname(name); ? ? SOCKADDR_IN sa;?????????????????????????? //填充SOCKADDR_IN结构的内容 ? sa.sin_family = AF_INET; ? sa.sin_port = htons(6000);????????? ?// 端口号可以随便改,当然与当然系统不能冲突 ? memcpy((sa.sin_addr),pHostent-h_addr,pHostent-h_length); ? bind(SnifferSocket,(LPSOCKADDR)sa,sizeof(sa));????? ????? //绑定 ? // 置ioctl来接收所有网络数据,关键步骤 ? DWORD dwBufferLen[10] ; ? DWORD dwBufferInLen = 1 ; ? DWORD dwBytesReturned = 0 ; ? WSAIoctl(SnifferSocket, IO_RCVALL,dwBufferInLen, izeof(dwB

文档评论(0)

***** + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档