分享
 
 
 

捕获数据包(一)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

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

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

将网卡设置为混杂模式。

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

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有