分享
 
 
 

捕获数据包(二)

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

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 个长度的数据,没有什么特殊需求的话就把它设置为65535最大值就可以了;

Promisc:这个参数就是设置是否把网卡设置为“混杂模式”,设置为 1 即可;

to_ms : 超时时间,毫秒,一般设置为 1000即可。

返回值:

pcap_t : 类似于一个网卡“句柄”之类的,不过当然不是,这个参数是后面截获数据要用到的。

******************************************************************************/

虽然看起来比较复杂,不过用起来还是非常简单的,其实 1 行就OK了:

pcap_t* adhandle;

char errbuf[PCAP_ERRBUF_SIZE];

// 打开网卡,并且设置为混杂模式

// pCardName是前面传来的网卡名字参数

adhandle = pcap_open_live(pCardName,65535,1,1000,errbuf);

C. 截获数据包并保存为文件:------------------------------------------------------

当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据包的那一瞬间进行分析,转眼就没了^_^

所以,为了便于日后分析,所以高手以及我个人经常是把数据包保存下来的慢慢分析的。

但是注意网络流量,在流量非常大的时候注意硬盘空间呵呵,常常几秒中就有好几兆是很正常的事情。

下面首先来详细讲解一下,这个步骤中需要用到的winpcap函数:

/**************************************************************

pcap_dumper_t* pcap_dump_open ( pcap_t * p,

const char * fname

)

功能:

建立或者打开存储数据包内容的文件,并返回其句柄

参数:

pcap_t * p :前面打开的网卡句柄;

const char * fname :要保存的文件名字

返回值:

pcap_dumper_t* : 保存文件的描述句柄,具体细节我们不用关心

***************************************************************/

/***************************************************************

int pcap_next_ex ( pcap_t * p,

struct pcap_pkthdr ** pkt_header,

u_char ** pkt_data

)

功能:

从网卡或者数据包文件中读取数据内容

参数:

pcap_t * p: 网卡句柄

struct pcap_pkthdr ** pkt_header: 并非是数据包的指针,只是与数据包捕获驱动有关的一个Header

u_char ** pkt_data:指向数据包内容的指针 ,包括了协议头

返回值:

1 : 如果成功读取数据包

0 :pcap_open_live()设定的超时时间之内没有读取到内容

-1: 出现错误

-2: 读文件时读到了末尾

***************************************************************/

/***************************************************************

void pcap_dump ( u_char * user,

const struct pcap_pkthdr * h,

const u_char * sp

)

功能:

将数据包内容依次写入pcap_dump_open()指定的文件中

参数:

u_char * user : 网卡句柄

const struct pcap_pkthdr * h: 并非是数据包的指针,只是与数据包捕获驱动有关的一个Header

const u_char * sp: 数据包内容指针

返回值:

Void

****************************************************************/

下面给出一段完整的捕获数据包的代码,是在线程中写的,为了程序清晰,我去掉了错误处理代码以及线程退出的代码,完整代码可下载文后的示例源码,老规矩,重要的步骤用粗体字标出。

我们实际在捕获数据包的时候也最好是把代码放到另外的线程中。

/*********************************************************

* 进程:

* 这个是程序的核心部分,完成数据包的截获

* 参数:

* pParam: 用户选择的用来捕获数据的网卡的名字

*********************************************************/

UINT CaptureThread(LPVOID pParam)

{

const char* pCardName=(char*)pParam; // 转换参数,获得网卡名字

pcap_t* adhandle;

char errbuf[PCAP_ERRBUF_SIZE];

// 打开网卡,并且设置为混杂模式

adhandle=pcap_open_live(pCardName,65535,1,1000,errbuf); {

pcap_dumper_t* dumpfile;

// 建立存储截获数据包的文件

dumpfile=pcap_dump_open(adhandle, "Packet.dat");

int re;

pcap_pkthdr* header; // Header

u_char* pkt_data; // 数据包内容指针

// 从网卡或者文件中不停读取数据包信息

while((re=pcap_next_ex(adhandle,&header,(const u_char**)&pkt_data))>=0)

{

// 将捕获的数据包存入文件

pcap_dump((unsigned char*)dumpfile,header,pkt_data);

}

return 0;

}

将个线程加入到程序里面启动以后。。。等等,如何来启动这个线程就不用我说了吧,类似这样的代码就可以

::AfxBeginThread(CaptureThread,chNIC); // chNIC是网卡的名字,char* 类型

启动线程一段时间以后(几秒中就有效果了),可以看到数据包已经被成功的截获下来,并存储到程序目录下的Packet.dat文件中。

=====================================================

至此,数据包的截获方法就讲完了,大家看了这篇文章,其实你就一定也明白了,无论是raw socket的方法还是winpcap的方法,其实都很简单的,真的没有什么东西,只是会让不明白原理的人看起来很神秘而已,isn’t it?

呵呵,不过也不要高兴的太早,这个保存下来的数据包文件,你可以试着用UltraEdit打开这个文件看看,是不是大部分都是乱码?基本上没有什么可读性,这是因为:

此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有