产品中心

新闻邮件订阅

IT要闻
产品评测
技巧推荐
社区精华
请输入您的e-mail地址:

使用技巧 - How to Use

 您的位置:首页 > 使用技巧 > 网络
手把手教你捕获数据包
教你捕获数据包
 PCWorld.COM.CN | 2008-04-10 14:53:47 |

引:在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。

一.捕获数据包的实现原理:
在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。
所以我们要想实现截获流经网络设备的所有数据包,就要采取一点特别的手段了:
将网卡设置为混杂模式。
这样一来,该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。
但是要注意一点,这种截获仅仅是数据包的一份拷贝,而不能对其进行截断,要想截断网络流量就要采用一些更底层的办法了,不在本文的讨论范围之内。
 
二. 捕获数据包的编程实现:
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(dwBufferInLen),
  &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );

至此,实际就可以开始对网络数据包进行嗅探了,而对于数据包的接收还是和普通的socket一样,通过recv()函数来完成,因为这里涉及到不同的socket模型,接收方法差别很大,所以在此就不提供接收的代码了。
 
2.winpcap的实现方法:-----------------------------------------------------------------------
winpcap驱动包,是我们玩转数据包不可或缺的好东东,winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报,主要为我们提供了四大功能:
功能:

1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;

2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;

3> 在网络上发送原始的数据报;

4> 收集网络通信过程中的统计信息
如果环境允许的话(比如你做的不是木马程序),我还是推荐大家用winpcap来截获数据包,因为它的功能更强大,工作效率更高,唯一的缺点就是在运行用winpcap开发的程序以前,都要在主机上先安装winpcap的driver。
而且一会我们就会发现它比raw socket功能强大的多,而且工作得更为底层,最明显的理由就是raw socket捕获的数据包是没有以太头的,此乃后话。
至于怎么来安装使用,请参考本系列的系列一《手把手教你玩转ARP包中的》,里面有详细的加载winpcap驱动的方法^_^
废话不多说了,让我们转入正题, 具体用winpcap来截获数据包需要做如下的一些工作:
A . 枚举本机网卡的信息(主要是获得网卡的名称)
   其中要用到pcap_findalldevs函数,它是这样定义的

   /*************************************************
int pcap_findalldevs  (  pcap_if_t **    alldevsp, 
                             char *    errbuf
                          ) 
功能:
        枚举系统所有网络设备的信息
参数:  alldevsp:  是一个pcap_if_t结构体的指针,
如果函数pcap_findalldevs函数执行成功,
将获得一个可用网卡的列表,而里面存储的就是第一个元素的指针。
             Errbuf:    存储错误信息的字符串
     返回值: int :   如果返回0 则执行成功,错误返回 -1。
  ************************************************/
   我们利用这个函数来获得网卡名字的完整代码如下:
 
       pcap_if_t* alldevs;
       pcap_if_t* d;
       char errbuf[PCAP_ERRBUF_SIZE];
       pcap_findalldevs(&alldevs,errbuf);  // 获得网络设备指针
       for(d=alldevs;d;d=d->next)          // 枚举网卡然后添加到ComboBox中
       {
d->name; //d->name就是我们需要的网卡名字字符串,按照你自己的需要保存到你的相应变量中去
       }
pcap_freealldevs(alldevs);             // 释放alldev资源

 
 
下一页:打开相应网卡并设置为混杂模式
 
1 2 3 下一页 >> 末页 推荐】【打印
 
相关文章
· 网络知识 IPv6的寻址和路由方法 2008-04-10 08:47:39
· 网络投票中的作弊与反作弊 2008-04-08 09:40:39
· 网络安全常识:PING命令的小秘密 2008-04-07 09:55:54
· 计算机网络安全的6大指标 2008-04-03 09:24:09
· 为系统安全,封锁这些网络端口 2008-04-02 10:02:45
 
 
PCWorld社区

网友评论
以下网友评论只代表网友个人观点,不代表PCWorld观点
发表内容:

SPONSORED LINKS

联想M930一体机体验专区
5月15日,联想率先在喷墨一体机市场上发布了针对soho用户和小型办公类市场为主打……
联想外设数码业务百城巡展
传承奥运品质 倾心百城服务
爱普生3LCD联盟
了解3LCD已经汇集了3LCD技术精英的联盟站点
全方位深入的存储资讯
从企业级到个人应用,从业界动态到大型评测,带您尽览存储风云
享受高质量低成本的照片打印
联想4330照片打印机,打印成本仅需1元
尚品·人生网
尚品·人生网,让优质生活与事业和谐平衡
中华部落阁
加入中华部落阁,记录你的新生活。
润眼电脑“3H高清润眼屏”
免费体验,火热报名,海尔润眼电脑系列。
万元级彩色激光一体机
爱普生彩色激光多功能一体机CX11系列专区
联想投影机全球同一品质
新联想一周年庆典 新投影共享全球同一品质
关于我们投稿指南 公告 注册 诚信与安全 规则与政策 友情链接 网站地图 IDG全球资源 业务联系 68130909-6865 《微电脑世界》2009刊例
Copyright(c) 2000-2008 pcworld.com.cn. All Rights Reserved. 京ICP备 05038969 号