驱动管家:安全、高效、精准的专业驱动下载站!

手把手教你捕获数据包 捕获数据包的方法

2018-01-21 14:33:20责编:llp   来源:驱动管家     人气:

前 言

经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,也写过很多的sniffer,所以就想写一系列的文章来详细深入的探讨关于数据包的知识。

我希望通过这一系列的文章,能使得关于数据包的知识得以普及,所以这系列的每一篇文章我都会有由浅入深的解释、详细的分析、以及编码步骤,另外附上带有详细注释的源码(为了照顾大多数朋友,我提供的都是MFC的源码)。

不过由于也是初学者,疏漏之处还望不吝指正。

本文凝聚着笔者心血,如要转载,请指明原作者及出处,谢谢!^_^

OK,. Let’s go !Have fun!! q^_^p

第二篇 手把手教你捕获数据包

目录:

一.捕获数据包的实现原理

二.捕获数据包的编程实现:

1. raw socket的实现方法

2. Winpcap的实现方法

a.枚举本机网卡的信息

b.打开相应网卡并设置为混杂模式

c. 截获数据包并保存为文件

作者:

CSDNVC/MFC 网络编程版主 PiggyXP

一.捕获数据包的实现原理:

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

手把手教你捕获数据包 捕获数据包的方法

所以我们要想实现截获流经网络设备的所有数据包,就要采取一点特别的手段了:

将网卡设置为混杂模式。

这样一来,该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。

但是要注意一点,这种截获仅仅是数据包的一份拷贝,而不能对其进行截断,要想截断网络流量就要采用一些更底层的办法了,不在本文的讨论范围之内。

二. 捕获数据包的编程实现:

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, //创建rawsocket

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资源

B. 打开相应网卡并设置为混杂模式: 在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。

  • 网页木马有哪些攻击方式?网页木马怎么防御?

    网页木马有哪些攻击方式?网页木马怎么防御?

    常见的网页木马攻击手段有哪些?用户应该如何识别及防御来自网页木马的攻击?笔者将在本文为用户细细道来:

    详情2018-01-09 16:05:14责编:llp   来源:驱动管家     
  • 什么是sharepoint server?sharepoint server存在跨站脚本漏洞

    什么是sharepoint server?sharepoint server存在跨站脚本漏洞

    SharePoint Server是一个服务器功能集成套件,提供全面的内容管理和企业搜索,加速共享业务流程并简化跨界限信息共享。SharePoint Services 2 0中存在跨站脚本漏洞,在使用文本编辑器添加图片后保存网页时,没

    详情2018-01-18 16:38:52责编:llp   来源:驱动管家     
  • 怎样破解无线网络密码?破解无线网络密码的方法

    怎样破解无线网络密码?破解无线网络密码的方法

    自从无线网络诞生之日起,“安全”这个词就始终如影随形的伴随在“无线”的身边。攻与防如同亲兄弟一样,无论你加密手段多么的先进,不久之后就会有各种各样的破解方式出现。前不久,我们中关村在线网络设备频道

    详情2018-01-16 09:24:43责编:llp   来源:驱动管家     
  • 什么是csrf攻击?csrf攻击如何防御?

    什么是csrf攻击?csrf攻击如何防御?

    0x01 什么是CSRF攻击CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET POST的事情——这些事情用户未必知道和愿意做,你可以把它想做HTTP会话劫持。网站是通过cookie来识别用

    详情2018-01-16 19:41:43责编:llp   来源:驱动管家     
  • 一个导致电脑重启的病毒制作步骤

    一个导致电脑重启的病毒制作步骤

    在一本很无趣的书上看到一个很有趣的事 当然这个重启病毒相对简单 实际上只是改变了图标而已,你可以在你宿舍同学电脑上试验一下 step1:在桌面新建一个bat文件,输入shutdown r ,然后保存即可 step2:选中新

    详情2018-01-20 12:09:46责编:llp   来源:驱动管家     
  • ripper病毒怎么删除?U盘里的ripper病毒无法删除怎么办?

    ripper病毒怎么删除?U盘里的ripper病毒无法删除怎么办?

    电脑,软件DiskGenius下载地址:softs 19980 html1、打开DiskGenius软件,左面找到你的U盘,选定它。2、单击上方的‘硬盘’选项。3、选择其中的‘重建主引导记录’4、选择其中的‘清除

    详情2018-01-15 19:00:15责编:llp   来源:驱动管家     
  • 什么是cisco路由器?cisco路由器配置的教程

    什么是cisco路由器?cisco路由器配置的教程

    思科路由器配置过程还是比较复杂的,需要考虑的因素很多,特别在安全方面。其实没必要把路由器想的那么复杂,其实路由器就是一个具有多个端口的计算机,只不过它在网络中起到的作用与一般的PC不同而已。如何才能

    详情2018-01-15 10:30:28责编:llp   来源:驱动管家     
  • 黑客入门教程 黑客入门的知识大讲解

    黑客入门教程 黑客入门的知识大讲解

    第一节、黑客的种类和行为以我的理解,“黑客”大体上应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵

    详情2018-01-16 08:54:11责编:llp   来源:驱动管家     
  • sql语句怎么导出?又怎么导入?

    sql语句怎么导出?又怎么导入?

    SQL全称是“结构化查询语言(Structured Query Language)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。sql语句怎么导出?又怎么导入? *******

    详情2018-01-17 18:08:02责编:llp   来源:驱动管家     
  • ie7浏览器有什么优点?ie7浏览器访问恶意网页会出现什么问题?

    ie7浏览器有什么优点?ie7浏览器访问恶意网页会出现什么问题?

    受影响系统:   Microsoft Internet Explorer 7 0  描述:  BUGTRAQ ID: 28498  Internet Explorer是微软发布的非常流行的WEB浏览器。  如果用户用IE访问了恶意网页的话,则弹出窗口的地址栏可能为任意地址而窗口主题中为任意页面或内容。这有

    详情2018-01-20 09:30:57责编:llp   来源:驱动管家