前 言
经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,也
写过很多的 sniffer,所以就想写一系列的文章来详细深入的探讨关于数据包的知识。
我希望通过这一系列的文章, 能使得关于数据包的知识得以普及, 所以这系列的每一篇文章
我都会有由浅入深的解释、详细的分析、以及编码步骤,另外附上带有详细注释的源码 (为
了照顾大多数朋友,我提供的都是 MFC的源码 )。
不过由于也是初学者,疏漏之处还望不吝指正。
本文凝聚着笔者心血,如要转载,请指明原作者及出处,谢谢! ^_^
OK,. Let ’s go ! Have fun!! q^_^p
第二篇 手把手教你捕获数据包
目录:
一.捕获数据包的实现原理
二.捕获数据包的编程实现:
1. raw socket 的实现方法
2. Winpcap 的实现方法
a. 枚举本机网卡的信息
b. 打开相应网卡并设置为混杂模式
c. 截获数据包并保存为文件
作者:
CSDN VC/MFC 网络编程版主 PiggyXP
一.捕获数据包的实现原理: --------------------------------------------------------------------
在通常情况下, 网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发
出的数据帧, 对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧, 网
络接口在验证投递地址并非自身地址之后将不引起响应, 也就是说应用程序无法收取与自己
无关的的数据包。
所以我们要想实现截获流经网络设备的所有数据包,就要采取一点特别的手段了:
将网卡设置为混杂模式。
这样一来,该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。
但是要注意一点, 这种截获仅仅是数据包的一份拷贝, 而不能对其进行截断, 要想截断网络
流量就要采用一些更底层的办法了,不在本文的讨论范围之内。
二. 捕获数据包的编程实现:
1.raw socket 的实现方法 --------------------------------------------------------------------
不同于我们常用的数据流套接字和数据报套接字, 在创建了原始套接字后, 需要用 WSAIoctl()
函数来设置一下,它的定义是这样的
int WSAIoctl(
SOCKET s,
DWORD dwIoControlCode,
LPVOID lpvInBuffer,
DWORD cbInBuffer,