用python读取pcap头长度字段

时间:2012-04-10 15:52:13

标签: python pcap

我在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)..所以请告诉我我做错了什么.. 提前谢谢

2 个答案:

答案 0 :(得分:1)

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

编写自己的代码来读取pcap文件,而不是依靠libpcap / WinPcap这样做,很少值得去做。 (Wireshark这样做,作为其库的一部分,读取许多捕获文件格式并支持pcap-ng格式,当前的pcap API不能,但有问题的库也支持pcap-ng ....)

答案 1 :(得分:0)

查看struct module,它可以让您轻松地解压缩这些二进制数据,例如:

struct.unpack('LLL', yourbuffer)

这将为您提供三个(L =无符号长整数)值的元组。如果len值看起来不正确,则文件的byte order与您的原始文件不同。在这种情况下,格式字符串的前缀为>(big-endian)或<(little-endian):

struct.unpack('>LLL', yourbuffer)