使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置

最近的项目要求写一个读写pcap文件的小程序,用来修改pcap中的部分信息,实现pcap的定制。

所以必须学会使用wireshark并能有利用WinPcap库和libpcap库进行开发。

虽然本文记录的都是windows下使用WinPcap进行开发,但是由于希望程序能够跨平台,所以代码中使用的都是库里面的跨平台函数,而不是windows专用的函数。

废话少说。

安装wireshark。这和开发本身无关,只是为了看包方便。

安装WinPcap库。

http://www.winpcap.org/docs/default.htm下载WinPcap库的zip文件,将下载到的zip(写本文时下载的是WpdPack_4_1_2.zip)解压到一个路径,用<WpdPackDir>表示。里面有五个文件夹,包括docs(文档)、Include(头文件)、Lib(库文件)和两个例子程序。本文都是结合文档编写(差不多是翻译)。下面就是文档截图,怎么用都说的很清楚。

       

配置开发环境(以vs2010为例)

新建一个vs c++工程。右键点击项目,选择属性。
VC++目录,包含目录包含<WpdPackDir>\Include
VC++目录,库目录包含<WpdPackDir>\Lib

C/C++,预处理器,添加WPCAP和HAVE_RMOTE。
连接器,输入,添加wpcap.lib和ws2_32.lib库
   
其实文档里面都写的很清楚了。

然后,在你需要用到WinPcap库的文件当中包含pcap.h就可以了。


测试

试着读取一个名为test.pcap的文件,看看如何。关于pcap文件的格式,将在下一篇文章中阐述。

#include "pcap.h"

#include "stdio.h"

int main(int argc, char *argv[]) {
    char errbuf[100];    
    pcap_t *pfile = pcap_open_offline("test.pcap", errbuf);
    if (NULL == pfile) {
        printf("%s\n", errbuf);
        return -1;
    } 
    pcap_pkthdr *pkthdr = 0;
    const u_char *pktdata = 0;
    pcap_next_ex(pfile, &pkthdr, &pktdata);
    printf("%d\n", pkthdr->caplen);
    for (bpf_u_int32 i = 0; i < pkthdr->caplen; ++i) {
        if (0 < i && 0 == i % 16) printf("\n");
        printf("%2x ", pktdata[i]);
    }
    pcap_close(pfile);
    return 0;
}

程序读取了文件中的第一个数据包,并按照wireshark显示的格式,以十六进制打印出了数据包中的每一个字节。

对比一下,一样的。



程序中pcap_open_offline函数以二进制读方式打开一个已经存好的tcpdump/libpcap格式的文件。

pcap_open_offline需要两个参数,第一个是文件名,第二个是个char类型指针。这个指针用来返回错误信息,只有当打开文件失败时,这个字符串被设置为相应的错误信息并返回空指针。

pcap_next_ex函数,读取下一个数据包。需要pcap_pkthdr**指针(不需要实体)和const u_char**类型的指针。


另一个函数pcap_next可以实现同样的功能。单需要提供一个指向pcap_pkthdr结构体的指针(需要new一个实体)。代码如下。

#include "pcap.h"
#include "stdio.h"

int main(int argc, char *argv[]) {
    char errbuf[100];    
    pcap_t *pfile = pcap_open_offline("test.pcap", errbuf);
    if (NULL == pfile) {
        printf("%s\n", errbuf);
        return -1;
    } 
    pcap_pkthdr *pkthdr = new pcap_pkthdr;
    const u_char *pktdata = 0;
    pktdata = pcap_next(pfile, pkthdr);
    printf("%d\n", pkthdr->caplen);
    for (bpf_u_int32 i = 0; i < pkthdr->caplen; ++i) {
        if (0 < i && 0 == i % 16) printf("\n");
        printf("%2x ", pktdata[i]);
    }
    delete pkthdr;
    pcap_close(pfile);
    return 0;
}



  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是在Windows上获取libpcap并编写读取pcap文件的程序的步骤: 1. 下载WinPcapWinPcapWindows版本的libpcap,可以从其官方网站(https://www.winpcap.org/)下载最新版本的安装程序。 2. 安装WinPcap:下载安装程序后,运行它并按照向导的指示安装WinPcap。 3. 配置开发环境:在Windows上编写libpcap程序需要使用C语言,因此需要安装相应的编译器和IDE。可以选择Visual Studio或MinGW等。 4. 创建一个新项目:在IDE中创建一个新的C语言项目。 5. 添加libpcap库:将WinPcap安装目录中的lib文件夹添加到项目的库目录中,并将wpcap.lib和Packet.lib添加到项目依赖项中。 6. 编写程序代码:在项目中添加一个新的C文件,并使用libpcap API编写读取pcap文件的程序。以下是一个简单的示例程序: ```c #include <stdio.h> #include <pcap.h> void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *buffer); int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *handle; struct pcap_pkthdr header; const u_char *packet; char filename[] = "test.pcap"; handle = pcap_open_offline(filename, errbuf); if (handle == NULL) { fprintf(stderr, "Couldn't open file %s: %s\n", filename, errbuf); return 1; } pcap_loop(handle, 0, process_packet, NULL); pcap_close(handle); return 0; } void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *buffer) { printf("Packet length: %d\n", header->len); } ``` 7. 编译和运行程序:使用IDE编译程序,然后运行它以读取pcap文件。程序将打印读取的每个数据包的长度。 这样,就可以在Windows上使用libpcap编写读取pcap文件的程序了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦行僧(csdn)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值