手把手教你捕获数据包

上传人:cl****1 文档编号:508065780 上传时间:2023-03-01 格式:DOC 页数:8 大小:88.50KB
返回 下载 相关 举报
手把手教你捕获数据包_第1页
第1页 / 共8页
手把手教你捕获数据包_第2页
第2页 / 共8页
手把手教你捕获数据包_第3页
第3页 / 共8页
手把手教你捕获数据包_第4页
第4页 / 共8页
手把手教你捕获数据包_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《手把手教你捕获数据包》由会员分享,可在线阅读,更多相关《手把手教你捕获数据包(8页珍藏版)》请在金锄头文库上搜索。

1、手把手教你捕获数据包【导读】在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广 播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数 据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。一捕获数据包的实现原理:在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发 出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。所以我们要想实现截获流经网络设

2、备的所有数据包,就要采取一点特别的手段了: 将网卡设置为混杂模式。这样一来,该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。但是要注意一点,这种截获仅仅是数据包的一份拷贝,而不能对其进行截断, 要想截断网络流量就要采用一些更底层的办法了,不在本文的讨论范围之内。二.捕获数据包的编程实现:l.raw socket 的实现方法不同于我们常用的数据流套接字和数据报套接字,在创建了原始套接字后,需要用WSAIoctl()函数来设置一下,它的定义是这样的int WSAIoctl(SOCKET s,DWORD dwIoCo ntrolCode,LPVOID lpvI nBuffer,DWORD cbl

3、n Buffer,LPVOID lpvOutBuffer,DWORD cbOutBuffer,LPDWORD IpcbBytesReturned,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletio nRouti ne);虽然咋一看参数比较多,但是其实我们最关心的只是其中的第二项而已,我们需要做的就是把第二项设置为SIO_RCVALL讲了这么多其实要做的就是这么一行代码,很简单吧?A_A当然我们还可以指定是否亲自处理IP头,但是这并不是必须的。完整的代码类似与如下这样,加粗的代码是与平常不同的需要

4、注意的地方:(为了让代码一目了然,我把错误处理去掉了,下同)#i nclude“ Win Sock2.h”#defi ne SIO_RCVALL _WSAIOW(IOC_VENDOR,1)SOCKET Sn ifferSocketWSADATA wsaData; iFlag=WSAStartup(MAKEWORD(2,2),&wsaData);/ 开启 winsock.dllSnifferSocket=WSASocket(AFNET,/ 创建raw socketSOCK_RAW,IPPROTO_IP,NULL,O,WSA_FLAG_OVERLAPPED);char FAR name128;/获

5、取本机IP地址gethost name( name, sizeof( name);struct hoste nt FAR * pHoste nt;pHoste nt = gethostb yn ame( name);SOCKADDR_INsa;/填充SOCKADDRJ结构的内容sa.sin_family = AF_INET;sa.sin_port = hto ns(6000);/ 端口号可以随便改,当然与当然系统不能冲突memcpy(&(sa.sin_addr),pHoste nt-h_addr,pHoste nt-h_le ngth);bin d(S ni fferSocket,(LPSOC

6、KADDR)&sa,sizeof(sa);/绑定/置ioctl来接收所有网络数据,关键步骤DWORD dwBufferLe n10;DWORD dwBufferI nLen = 1 ;DWORD dwBytesReturned = 0 ;WSAIoctl(S ni fferSocket, IO_RCVALL,&dwBufferl nLen, izeof(dwBufferl nLen),& dwBufferLe n, sizeof(dwBufferLe n),&dwBytesReturned , NULL , NULL );至此,实际就可以开始对网络数据包进行嗅探了,而对于数据包的接收还是和普通

7、的socket一样,通过recv()函数来完成,因为这里涉及到不同的socket模型,接收方法差别很大,所以在此就不提供接收的代码了。2.winpcap的实现方法:winpcap驱动包,是我们玩转数据包不可或缺的好东东,winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报,主要为我们提供了四大功能: 功能:1捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;2在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;3在网络上发送原始的数据报;4收集网络通信过程中的统计信息如果环境允许的话(比如你做的不是木马程序),我还是推荐大

8、家用 winpcap来截获数据包, 因为它的功能更强大,工作效率更高,唯一的缺点就是在运行用winpcap开发的程序以前,都要在主机上先安装 winpcap的driver。而且一会我们就会发现它比raw socket功能强大的多,而且工作得更为底层,最明显的理由就是raw socket捕获的数据包是没有以太头的,此乃后话。至于怎么来安装使用,请参考本系列的系列一手把手教你玩转 ARP包中的,里面有详细的加载winpcap驱动的方法A_A废话不多说了,让我们转入正题,具体用winpcap来截获数据包需要做如下的一些工作:A .枚举本机网卡的信息(主要是获得网卡的名称)其中要用到pcap find

9、alldevs函数,它是这样定义的/*int pcap_fi ndalldevs(*alldevsp,pcap_if_tchar *errbuf)功能:枚举系统所有网络设备的信息参数:alldevsp :是一个pcap_if_t结构体的指针,女口果函数 pcap_findalldevs函数执行成功,将获得一个可用网卡的列表,而里面存储的就是第一个元素的指针。Errbuf :存储错误信息的字符串返回值:int :如果返回0则执行成功,错误返回-1。*/我们利用这个函数来获得网卡名字的完整代码如下:pcap_if_t* alldevs; pcap_if_t* d; char errbufPCAP_

10、ERRBUF_SIZE;pcap_fi ndalldevs(&alldevs,errbuf);/获得网络设备指针一for(d=alldevs;d;d=d-n ext)/枚举网卡然后添加到 ComboBo中d-name; d-name就是我们需要的网卡名字字符串,按照 你自己的需要保存到你的相应变量中去 pcap_freealldevs(alldevs);/释放alldev资源B.打开相应网卡并设置为混杂模式:在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然 上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。我们主要是要用到 pcap_open_live 函数,不

11、过这个函数 winpcap的开发小组已经建 议用pcap_open函数来代替,不过因为我的代码里面用的就是pcap_open_live,所以也不便于修改了,不过 pcap_open_live 使用起来也是没有任何问题的,下面是 pcap_open_live 的函数声明:1/*pcap_t* pcap_open_live(char *device,intsn aple n.intpromisc,intto_ms,char *ebuf)功能:根据网卡名字打开网卡,并设置为混杂模式,然后返回其句柄 参数:Device :就是前前面我们获得的网卡的名字;Sn aple n :我们从每个数据包里取得数据

12、的长度,比如设置为100,则每次我们只是获得每个数据包100个长度的数据,没有什么特殊需求的话就把它设置为65535最大值就可以了;Promisc :这个参数就是设置是否把网卡设置为混杂模式”,设置为1即可;to_ms :超时时间,毫秒,一般设置为1000即可。返回值:pcap_t :类似于一个网卡“句柄”之类的,不过当然不是,这个参数是后面截获数据要用到的。虽然看起来比较复杂,不过用起来还是非常简单的,其实1行就0K了:pcap_t* adha ndle;char errbufPCAP_ERRBUF_SIZE;/打开网卡,并且设置为混杂模式/ pCardName是前面传来的网卡名字参数adh

13、a ndle =pcap_open_live(pCardName,65535,1,1000,errbuf);C.截获数据包并保存为文件:当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据 包的那一瞬间进行分析,转眼就没了A_A所以,为了便于日后分析,所以高手以及我个人经常是把数据包保存下来的慢慢分析的。但是注意网络流量,在流量非常大的时候注意硬盘空间呵呵,常常几秒中就有好几兆是很正常的事情。下面首先来详细讲解一下,这个步骤中需要用到的winpcap函数:/* pcap_dumper_t* pcap_dump_ope n ( pcap_t *p,const char *fn ame)功能:建立或者打开存储数据包内容的文件,并返回其句柄参数:pcap_t *p:前面打开的网卡句柄;con st char * fname:要保存的文件名字返回值: pcap_dumper_t* :保存文件的描述句柄,具体细节我们不 用关心*/ /*int pcap_ next_ex( pcap_t *p,struct pcap_pkthdr *pkt_header,u_char *pkt_data)功能:从网卡或者数据包文件中读取数据内容参数:pcap_t *p:网卡句柄struct pcap_pkthdr * pkt_header:并非是数据包的指针,只是与数据包捕

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号