1 / 23
文档名称:

数据包抓捕与分析.docx

格式:docx   大小:43KB   页数:23页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数据包抓捕与分析.docx

上传人:fengruiling 2022/8/8 文件大小:43 KB

下载得到文件列表

数据包抓捕与分析.docx

文档介绍

文档介绍:、几 —
前言
经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,也 写过很多的sniffer,所以就想写一系列的文章来详细深入的探讨关于数据包的知识。 我希望通过这一系列的文章,能使得关于数据包的知识得以普及,eturned = 0 ;
WSAIoctl(SnifferSocket, IO_RCVALL,&dwBufferInLen, izeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
至此,实际就可以开始对网络数据包进行嗅探了,而对于数据包的接收还是和普通的 socket 一样,通过recv()函数来完成,因为这里涉及到不同的socket模型,接收方法差别很大,所 以在此就不提供接收的代码了。
的实现方法:
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 资源
B. 打开相应网卡并设置为混杂模式:
在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面 已经可以获得所有网卡的名字了,这段代码就暂且略过了。
我们主要是要用到 pcap_open_live 函数,不过这个函数 winpcap 的开发小组已经建议用 pcap_open函数来代替,不过因为我的代码里面用的就是pcap_open_live,所以也不便于修 改了,不过pcap_open_live使用起来也是没有任何问题的,下面是pcap_open_live的函数声 明:
pcap_t* pcap_open_live ( char * device,
int snaplen,
int promisc,
int to_ms,
char * ebuf )
功能:
根据网卡名字打开网卡,并设置为混杂模式,然后返回其句柄
参数:
Device :就是前前面我们获得的网卡的名字;
Snaplen : 我们从每个数据包里取得数据的长度,比如设置为 100,则每次我们只是获 得每个数据包 100个长度的数据,没有什么特殊需求的话就把它设置为6553