packet - 我想在满足条件后停止数据包捕获,同时连续嗅探

标签 packet packet-sniffers packet-capture pyshark

问题

我编写了一个从主机嗅探数据包的脚本,但是,我正在以连续模式嗅探数据包,并且希望在超时时停止嗅探。我编写了以下代码来停止数据包嗅探,但当时间明显超过超时时,它似乎并没有停止。我在这里可能做错了什么?

import time
import pyshark

prog_start = time.time()
capture = pyshark.LiveCapture(interface='en0')
capture.sniff(timeout=10)
start_time = capture[0].frame_info.time_epoch
end_time = capture[-1].frame_info.time_epoch
print("Capture lasted:", float(end_time) - float(start_time))
pkt_num = 0
for pkt in capture:
    pkt_num += 1
    print("Time", time.time() - prog_start, "Pkt#", pkt_num)

然后我们得到这个输出,每秒有数千个额外数据包,超过了捕获应该停止的时间:

Capture lasted: 9.148329019546509
Time 10.346031188964844 Pkt# 1
Time 10.348641157150269 Pkt# 2
Time 10.351708889007568 Pkt# 3
Time 10.353564977645874 Pkt# 4
Time 10.35555100440979 Pkt# 5
...

问题

为什么PyShark超时后还继续抓包?

最佳答案

我也遇到了同样的问题,我设法找到了解决方案。它并不完美,但它的工作原理是告诉捕获循环在下一个数据包上停止并发送一个空数据包,它将看到它结束。对于我的情况,我将其设置为高端口上的 udp 数据包,因为我使用过滤器过滤掉大部分流量,因此该解决方案对我有用

class PacketCapture(threading.Thread):
    capture = 1

    def __init__(self, interface_name):
        threading.Thread.__init__(self)
        self.interface_name = interface_name

    def stop(self):
        self.capture = 0

    def run(self):
        capture = pyshark.LiveCapture(interface=self.interface_name)
        try:
            for packet in capture.sniff_continuously():
                if not self.capture:
                    capture.close()
        except pyshark.capture.capture.TSharkCrashException:
            self.exited = 1
            print("Capture has crashed")



#start capture
pcap = PacketCapture(interface_name)
pcap.start()

#stop capture
pcap.stop()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
msg = bytes("", "UTF-8")
sock.sendto(msg, ("external IP", 12345))
sock.close

我自己对 python 比较陌生,但我认为考虑到这种情况,这应该是一个可以接受的解决方案

关于packet - 我想在满足条件后停止数据包捕获,同时连续嗅探,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58300485/

相关文章:

c - 发送数据包所需的最少数据量是多少?

linux - 使用linux路由器修改H323 tcp数据包

utf-8 - 嗅探和显示 UTF-8 中的 TCP 数据包

python - 如何在不抓取文档本身的情况下从网页获取文件的下载链接?

c# - 有什么好的 .net 数据包嗅探器吗?

java - 是否有任何库来管理 Android 上的 TCP 数据包?

asp.net - 如何嗅探http请求

python - pcap 缺少元素?

https - Wireshark 不捕获 HTTPS 数据包?

c - 在 C 中使用带计数器的链表进行数据包嗅探