1

我已经使用 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 中检查).. 所以请告诉我我做错了什么.. 提前谢谢

4

2 回答 2

1

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

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

于 2012-04-10T16:39:58.157 回答
0

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

struct.unpack('LLL', yourbuffer)

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

struct.unpack('>LLL', yourbuffer)
于 2012-04-10T16:00:05.330 回答