【问题标题】:Read pcap header length field with python用python读取pcap头长度字段
【发布时间】:2012-04-22 22:33:56
【问题描述】:

我已经使用 c 中的 pcap 库捕获了一些数据包。现在我正在使用 python 程序来读取保存的数据包文件。但我这里有个问题。我有一个文件,它首先有 pkthdr(由 lybrary 提供),然后是实际数据包。 pkthdr 的格式是-

struct pcap_pkthdr {
    struct timeval ts; /* time stamp 32bit */ 32bit
    bpf_u_int32 caplen; /* length of portion present */
    bpf_u_int32 len; /* length this packet (off wire) */
};

现在我想读取 len 字段,所以我跳过了 timeval 和 cap len,并使用 python 以二进制形式打印了 len 字段。我得到的二进制代码是 - 01001010 00000000 00000000 00000000 现在如何在 u_int32 中读取它,我不认为它是正确的值(太大),实际的 len 字段值应该是 74 字节(在 wireshark 中检查).. 所以请告诉我我做错了什么.. 提前致谢

【问题讨论】:

  • 你能贴出你的python代码吗?

标签: python pcap


【解决方案1】:

看看struct module,它可以让您相对轻松地解压此类二进制数据,例如:

struct.unpack('LLL', yourbuffer)

这将为您提供三个 (L = unsigned long) 值的元组。如果 len 值看起来不正确,则文件的 byte order 与您的本地文件不同。在这种情况下,使用 > (big-endian) 或 < (little-endian) 为格式字符串添加前缀:

struct.unpack('>LLL', yourbuffer)

【讨论】:

    【解决方案2】:

    或查看pylibpcap 模块、pypcap 模块或pcapy 模块,它们让您可以相对轻松地调用pcap API。这样,您就不必关心 pcap 文件的详细信息,并且您的代码在 libpcap 1.1 或更高版本中也能够读取至少一些 Wireshark 的 pcap-ng 文件可以生成,并且在 1.8 版本中会生成默认

    编写自己的代码来读取 pcap 文件,而不是依赖于 libpcap/WinPcap 这样做,很少值得这样做。 (Wireshark 这样做,作为其库的一部分,该库读取多种捕获文件格式并以当前 pcap API 无法支持的方式支持 pcap-ng 格式,但相关库也支持 pcap-ng ....)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 2020-08-28
      • 1970-01-01
      • 2016-07-07
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多