我在写一个包捕获实用程序时遇到了一些问题。我目前正在使用pcapy打开一个livebytestream和dpkt来解码数据包。我还想将数据包写入一个.pcap文件,该文件与dpkt.编写器对象,但是,记录在pcap文件中的时间戳来自写入程序将包写入pcap文件时,而不是网络接口或内核接收到消息时。在
我从文档中了解到,在编写时,您可以提供ts供编写器使用,但是我不知道如何从接收到的包的头中提取它。从我可以找到的示例中,可以看到如何从读取文件中打印时间戳,我似乎可以简单地打印从bytestream接收到的元组的第一个值,但是当我这样做时,我得到以下错误:
TypeError:int()参数必须是字符串、类似对象的字节或数字,而不是“Pkthdr”
错误很明显:我必须在Pkthdr对象中找到timestamp属性,但在pcapy项目或dpkt中都找不到任何解释如何解析“header”的文档/示例
我还尝试使用pypcap库进行实时捕获,但是输出是相同的。我还尝试过在Python2.7.5上使用相同的代码,因为我读到dpkt可能还不能完全支持python3,但是在两个版本上都有相同的结果
#!/usr/bin/env python3.6
import pcapy
import dpkt
cap = pcapy.open_live("eth0", 65435, True, 100)
writer = dpkt.pcap.Writer(open("test.pcap", 'wb+'))
while True:
(header,packet) = cap.next()
writer.writepkt(packet, header)
print('packet printed')
为了证明pcap中的时间戳是从写入时开始的,我在再次写入同一个包之前添加了sleep period。您将看到这两个文件在头时间戳上显示了约1秒的差异:
^{pr2}$我不太依赖pcapy或dpkt,因此如果有更好的方法,我愿意关闭这些库中的任何一个,但是我有一种感觉,有一点经验的人可以告诉我如何挖掘Pkthdr对象,将时间戳提取为str,然后在向pcap:
ts = %unpack from header%
writer.writepkt(packet, ts)
编辑:所以我查看了pcapy模块中pkthdr对象的源代码,发现了一些有用的东西:似乎有一个名为“getts”的函数可以从对象中获取时间戳:
static PyMethodDef p_methods[] = {
{"getts", (PyCFunction) p_getts, METH_VARARGS, "get timestamp tuple
(seconds, microseconds) since the Epoch"},
{"getcaplen", (PyCFunction) p_getcaplen, METH_VARARGS, "returns the length
of portion present"},
{"getlen", (PyCFunction) p_getlen, METH_VARARGS, "returns the length of
the packet (off wire)"},
{NULL, NULL} /* sentinel */
};
在python代码中,我这样调用函数:
timestamp = header.getts()
它返回一个元组,其中包含头的秒和微秒,例如(1555710256942645)。下一步是将它连接成一个数字并输入到dpkt writer ts中
好吧,我已经解决了我的问题。时间戳精度以微秒为单位,并且.pcap中的两个副本的时间戳精度相同。在
相关问题 更多 >
编程相关推荐