【问题标题】:libpcap, save selcetive region of my packet to pcap filelibpcap,将我的数据包的选择性区域保存到 pcap 文件
【发布时间】:2013-11-30 16:35:47
【问题描述】:

我使用下面的 libpcap 过滤器在(Linux ubuntu,c,监控模式)中捕获了信标文件

char *filter = "wlan type mgt subtype beacon";
pcap_compile(pcd,&bpg,filter,-1,PCAP_NETMASK_UNKNOWN);
pcap_setfilter(pcd, &bpg);

我捕获了信标帧,但它包含 radiotap 标头。 (pcak 数据链路返回 IEEE_802_11_RADIO)

但我只想将信标帧(删除 radiotap 标头)保存到 pcap 文件。 但我在函数 pcap_dump() 中找不到此类选项

有什么方法可以保存数据包的选择性部分(删除 radiotap 部分)吗? 或者是否有任何过滤选项可以帮助我只获得没有 radiotap 的信标帧??

【问题讨论】:

    标签: c pcap libpcap wifi


    【解决方案1】:

    有什么方法可以保存数据包的选择性部分(删除radiotap部分)??

    是的。

    首先,如果您正在写入 pcap 文件(我假设您正在这样做,正如您提到的 pcap_dump()),请不要使用您在您打开了 Wi-Fi 适配器作为 pcap_dump_open() 的参数,因为您将不会将带有 radiotap 标头的数据包写入 pcap 文件,并传递您在打开 Wi-Fi 时获得的 pcap_t -Fi 适配器作为pcap_dump_open() 的参数将意味着文件的链路层标头类型将为DLT_IEEE802_11_RADIO,这意味着该文件将被其他程序解释为具有带有radiotap 标头的数据包。

    相反,使用pcap_open_dead() 创建一个假的pcap_t,并使用DLT_IEEE802_11 作为其链路层标头类型,并在pcap_dump_open() 调用中使用that

    然后,对于每个数据包:

    首先,确保“网络长度”(数据包的struct pcap_pkthdrlen 字段,由libpcap 提供给您的程序)>= 4 个字节,如果不是,拒绝数据包。这意味着数据包的长度不足以包含完整的 radiotap 标头,这可能意味着驱动程序中存在错误。

    然后,确保“捕获的数据长度”(数据包的 struct pcap_pkthdrcaplen 字段,由 libpcap 提供给您的程序)>= 4 个字节,如果不是,则拒绝数据包.这意味着对于完整的 radiotap 标头没有足够的捕获数据,这可能意味着您的程序指定的快照长度太短。

    然后从数据包开头的radiotap header 中获取it_len 字段。请注意,它是 little-endian,而不是 big-endian,因此您不需要在 little-endian 处理器(例如 32 位和 64 位 x86 处理器)上对其进行字节交换,并且您这样做 em> 需要在 big-endian 处理器上进行字节交换(例如运行 Linux 时的 PowerPC)。

    然后检查以确保数据包的struct pcap_pkthdrlencaplen 字段都>= it_len 值。

    然后将数据包的struct pcap_pkthdr 复制到单独的struct pcap_pkthdr 变量中,从该单独的struct pcap_pkthdr 变量的lencaplen 变量中减去it_len,得到一个指向it_len 字节过去的指针数据包的开头,并将该指针和指向 struct pcap_pkthdr 变量的指针传递给 lencaplen 值中减去 it_lenpcap_dump()

    【讨论】:

    • 非常感谢,这正是我想要做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2015-08-26
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多