WinPcap笔记(9):保存数据包到堆文件
生活随笔
收集整理的這篇文章主要介紹了
WinPcap笔记(9):保存数据包到堆文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這里我們將捕獲到的數據包保存到堆文件里。堆文件的格式是libpcap的一種。這種格式中,包含了被捕捉到的包的二進制數據,并且,這種格式是許多網絡工具所使用的一種標準,這些工具包括WinDump,Etheral和Snort。堆文件組織的含義是說:一條記錄可以放在文件中的任何地方,只要那個地方有空間存放這條記錄。在這種記錄組織方式中,記錄是沒有順序的,是堆積起來的。
WinPcap提供了很多函數保存和讀取堆文件。下面介紹兩個函數。
1、pcap_dump_open()函數
pcap_dump_open()函數打開一個可以保存數據的文件。具體格式如下:
pcap_dumper_t* pcap_dump_open ( pcap_t * p, const char * fname );參數含義:
p:一個libpcap存儲文件的描述符,對用戶不可見;
fname:要寫入的文件名;
只有當接口打開時,調用 pcap_dump_open() 才是有效的。 這個調用將打開一個堆文件,并將它關聯到特定的接口上。
2、pcap_dump()函數
pcap_dump()函數將數據包寫入用戶指定的文件中。具體格式如下:
void pcap_dump ( u_char * user, const struct pcap_pkthdr * h, const u_char * sp );數據包將會通過 pcap_dump() 函數寫入堆文件中,這個函數是packet_handler()的回調函數。 pcap_dump() 的參數和 pcap_handler() 函數中的參數是一一對應的。
下面的程序從一個選定的接口捕獲數據包,并將數據包保存在指定的文件中:
#include "pcap.h"/* 回調函數原型 */ void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);main(int argc, char **argv) {pcap_if_t *alldevs;pcap_if_t *d;int inum;int i = 0;pcap_t *adhandle;char errbuf[PCAP_ERRBUF_SIZE];pcap_dumper_t *dumpfile;/* 檢查程序輸入參數 */if (argc != 2){printf("usage: %s filename", argv[0]);return -1;}/* 獲取本機設備列表 */if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1){fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* 打印列表 */for (d = alldevs; d; d = d->next){printf("%d. %s", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if (i == 0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return -1;}printf("Enter the interface number (1-%d):", i);scanf("%d", &inum);if (inum < 1 || inum > i){printf("\nInterface number out of range.\n");/* 釋放列表 */pcap_freealldevs(alldevs);return -1;}/* 跳轉到選中的適配器 */for (d = alldevs, i = 0; i< inum - 1;d = d->next, i++);/* 打開適配器 */if ((adhandle = pcap_open(d->name, // 設備名65536, // 要捕捉的數據包的部分 // 65535保證能捕獲到不同數據鏈路層上的每個數據包的全部內容PCAP_OPENFLAG_PROMISCUOUS, // 混雜模式1000, // 讀取超時時間NULL, // 遠程機器驗證errbuf // 錯誤緩沖池)) == NULL){fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);/* 釋放設備列表 */pcap_freealldevs(alldevs);return -1;}/* 打開堆文件 */dumpfile = pcap_dump_open(adhandle, argv[1]);if (dumpfile == NULL){fprintf(stderr, "\nError opening output file\n");return -1;}printf("\nlistening on %s... Press Ctrl+C to stop...\n", d->description);/* 釋放設備列表 */pcap_freealldevs(alldevs);/* 開始捕獲 */pcap_loop(adhandle, 0, packet_handler, (unsigned char *)dumpfile);return 0; }/* 回調函數,用來處理數據包 */ void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data) {/* 保存數據包到堆文件 */pcap_dump(dumpfile, header, pkt_data); }結果如下:
保存的文件如下:
總結
以上是生活随笔為你收集整理的WinPcap笔记(9):保存数据包到堆文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷生日当天有优惠吗
- 下一篇: 锐雯上单怎么压制断头台