日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

数据包过滤 系统 linux,Ubuntu16.04安装libpcap开发库对pcap文件中的数据包进行过滤...

發布時間:2024/10/14 linux 77 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据包过滤 系统 linux,Ubuntu16.04安装libpcap开发库对pcap文件中的数据包进行过滤... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Ubuntu16.04下安裝了Wireshark的話,應該是已經安裝了libpcap0.8的包,如下圖:

使用sudo apt-get install libpcap-dev安裝開發包,安裝后系統顯示如下圖:

多了libpcap0.8-dev和libpcap-dev兩個包。

工作可能截取的數據包文件(pcap文件)含有一些重要的數據包,這時我們需要把他們提取出來保存到新的數據包文件(pcap文件)中。比如下面圖片中只需要dns協議的數據包

直接貼代碼了,如果api不知道怎么用的,直接使用man就行了;注意過濾表達式使用“udp port 53”,不要使用“dns”編譯過濾表達式的時候會出錯,提示語法錯誤。

#include

#include

#include

#include

pcap_t *source_pcap_t=NULL;

pcap_dumper_t *des_pcap_dumper_t=NULL;

int exit_main()

{

printf("exit_main() is called.\n");

if( NULL!=source_pcap_t )

{

pcap_close(source_pcap_t);

}

if( NULL!=des_pcap_dumper_t )

{

pcap_dump_close(des_pcap_dumper_t);

}

exit(0);

}

int main(int argc, char *argv[])

{

//打開要處理pcap文件

char errbuf[PCAP_ERRBUF_SIZE]={0};

if( NULL==(source_pcap_t=pcap_open_offline(argv[1], errbuf)) )

{

printf("pcap_open_offline() return NULL.\nerrbuf:%s\n", errbuf);

exit_main();

}

//打開保存的pcap文件

if( NULL==(des_pcap_dumper_t=pcap_dump_open(source_pcap_t,"./rescult.pcap")) )

{

printf("pcap_dump_open() fail.\n");

exit_main();

}

//判斷鏈路層類型

int datalink_offset=0;

//pcap_datalink() returns the link-layer header type for the live capture or ``savefile'' specified by pcap_t

int datalink_type=pcap_datalink(source_pcap_t);

switch (datalink_type)

{

case PCAP_ERROR_NOT_ACTIVATED:

printf("pcap_datalink() return PCAP_ERROR_NOT_ACTIVATED.\n");

exit_main();

break;

case DLT_NULL:

printf("Data Link Type:BSD loopback.\n");

datalink_offset=4;

break;

case DLT_EN10MB:

printf("Data Link Type:IEEE 802.3.\n");

datalink_offset=14;

break;

case DLT_PPP:

printf("Data Link Type:PPP.\n");

datalink_offset=0;

break;

case DLT_FDDI:

printf("Data Link Type:FDDI.\n");

datalink_offset=21;

break;

case DLT_IEEE802_11:

printf("Data Link Type:IEEE 802.11.\n");

datalink_offset=22;

break;

case DLT_PPP_ETHER:

printf("Data Link Type:PPPoE.\n");

datalink_offset=20;

break;

default :

printf("Data Link Type:UnKnown.\n");

}

printf("datalink_offset:%d\n", datalink_offset);

//設置過濾表達式

struct bpf_program filter;

if( -1==pcap_compile(source_pcap_t, &filter, "udp port 53", 1, 0) )

{

printf("pcap_compile() fail.\n");

printf("errno:%s\n", pcap_geterr(source_pcap_t));

exit_main();

}

if( -1==pcap_setfilter(source_pcap_t, &filter) )

{

printf("pcap_setfilter() fail.\n");

exit_main();

}

//網絡層

struct pcap_pkthdr packet;

const u_char *pktStr;

while(1)

{

pktStr=pcap_next(source_pcap_t, &packet);

if( NULL==pktStr )

{

printf("pcap_next() return NULL.\n");

break;

}

else

{

printf("Packet length: %d\n", packet.len);

printf("Number of bytes: %d\n", packet.caplen);

printf("Recieved time: %s\n", ctime((const time_t *)&packet.ts.tv_sec));

//讀到的數據包寫入生成pcap文件

pcap_dump((u_char*)des_pcap_dumper_t, &packet, pktStr);

}

}

pcap_dump_close(des_pcap_dumper_t);

pcap_close(source_pcap_t);

return 0;

}

下面圖片是生成的rescult.pcap的結果,把dns的數據包全部取出來了。

總結

以上是生活随笔為你收集整理的数据包过滤 系统 linux,Ubuntu16.04安装libpcap开发库对pcap文件中的数据包进行过滤...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。